当前课程知识点:C++语言程序设计基础 >  第6章 数组、指针与字符串(二) >  动态内存分配 >  申请和释放动态数组(一)

返回《C++语言程序设计基础》慕课在线视频课程列表

申请和释放动态数组(一)在线视频

下一节:申请和释放动态数组(二)

返回《C++语言程序设计基础》慕课在线视频列表

申请和释放动态数组(一)课程教案、知识点、字幕

如果我们在写程序的时候

不能确定运行时

要处理的数据规模有多大

可能我们就需要

用动态申请内存和释放操作

来申请动态数组

用完了以后呢

我们自己主动释放

申请动态数组的语法是什么呢

我们来看一下

这里还是要用到这个new操作

后面不仅要有类型名

还要在括号里面给出

数组的元素个数

也就是数组的长度

这个数组长度呢

可以是任何表达式

可以是在运行时计算出来的

也可以是让用户从键盘输入的

都可以

当然这个数组不再使用的时候

要记得对应的用delete去释放

那么这个后面不仅要有数组名

也就是通过new

得到的这个首地址

还要有一对方括号

如果你delete不写这一对方括号

那就会仅仅释放

数组首元素的地址

写了这个方括号以后

就会将当初分配的整个数组

都安全释放

下面我们来看一个

动态创建数组的例子

在这个程序中呢

我们还是用到了

以前多次用的这个例题

就是Point类 这个点类

所以类的定义和实现呢

我们就都略去了

跟前面是一样的

跟前一个例题一样

在这儿呢

我们直接构造一个

点类的对象数组

new这么一个对象数组

会在运行时分配足够存放

正好存放两个point元素的空间

并且构造这两个数组元素

所以在这个过程中呢

大家看

两次Default Constructor called

被调用

因为没有初始化

两次调用构造函数

Default Constructor

然后我们去访问每个元素

怎么访问呢

用ptr[0] ptr[1]这种

用数组名下标的方式去访问

既然得到了数组的首地址

那么就可以用指针

当数组名用了

用数组名下标的方式

去访问对象

然后要调用的对象的move功能

去移动

那么就叫点move函数

所以我们看到这个点

被分别移动了

接下来不要忘记

使用完了以后

要用delete去释放

这个数组的空间

有的同学看到这种简单例子

可能会觉得

还释放什么呀

反正主函数马上就结束了

你什么都不释放

它的全体空间

都会自动释放的

就算这个空间占用的

也不要多一秒的时间

无所谓的

现在我们学到的都是简单的例题

做的都是简单的习题

但是大家要养成一个好习惯

在什么地方用new分配的空间

应该在同等的地方

对等的地方

记得要释放这个空间

因为以后大家真的编实用程序

都会规模比较大的

不会这么比较简单

从这儿分配空间

马上就结束

不会这么简单

所以好习惯一定要记住

那么这个delete的时候

注意要写方括号

写方括号它才释放两个对象

看到两个destructor被调用两次

如果不写方括号呢

它只释放一个对象

那么另外一个内存就泄漏了

我们可能不仅需要

动态创建一维数组

很可能

还需要动态创建多维数组

那么要用new去在运行时

分配内存空间

用于存放多维数组

这个语法上怎么表现呢

我们看

要动态创建多维数组的话呢

就要在类型名后面

写上各个维的长度

比如说我们这个例子里面

需要动态申请空间用来存放一个

字符类型的二维数组

它的每一个元素都是字符类型

有两行三列

那我们就new

然后类型名后面呢两个方括号

分别给出行的个数

和列的个数

这个new运算的语法形式很清楚

那现在问题是

它返回的是一个什么样的指针

多维数组的首地址

它就不是我们简单的这种

指向数据对象的指针了

它就是一个指向数组的指针

比如说

一个二维数组的首地址

它就是一个指向一维数组的指针

也就是指向行的指针

为什么强调这一点呢

因为指向数组元素的指针

当它加1的时候

它依次指向内存中

连续存放的下一个数组元素

而指向行的指针

指向数组的指针呢

它加1

会跳跃整个数组的空间

现在我们来通过这个图来看一下

那么这里这个fp

就是用于接收动态分配的

这个二维数组首地址的

这样一个指针变量

这个动态分配的数组呢

具有两行三列

也就是说

它是有两个一维数组构成的

每个一维数组是有三个元素

也就是每行有三个元素

那这个fp呢

像这样一种形式定义的fp呢

它就是指向整个数组的指针

所以当这个fp加1的时候

它是越过整个行

现在我们知道呢

如果你需要接收

一个动态分配的多维数组

首地址的指针的话

你就要定义一个指向数组的指针

那接下来的这个例子呢

就是一个

动态分配三维数组的例子

在这个程序中呢

我们来动态创建三维数组

当我们要动态

创建多维数组的时候

要用指向数组的指针

作为接收

它返回首地址的这个变量

那这里定义的cp

就是一个指向数组的指针

指向什么样的数组呢

指向的是一个

九行八列的二维数组

也就是多维数组

我们去掉它第一维的下标个数

后面的这都留着

用来定义指向数组的指针

所以呢

7乘9乘8的这样一个三维数组

就需要一个指向9乘8的

二维数组的指针

来接收它动态分配

得到的首地址

这样得到了这个首地址以后

如果我们就拿这个cp当指针用

按照指针的语法

去访问数组的每个元素的话呢

大家看

这个它实际上是个三级指针了

前面三个指针运算

还不同的地方加i加j加k

大家会觉得看起来不那么

可读性不那么好 不那么直观

实际上呢

我们用不着非要按照

指针这种形式去写

我们知道得到了数组首地址以后

它就相当于数组名了

所以看看第二个

第一个for

大的for循环嵌套呢

是给数组的每一个元素赋值

那么第二个for循环嵌套呢

是输出数组的每个元素

都是遍历数组

遍历三维数组

注意就需要三重循环

这三种循环呢

习惯上把最右边的下标

放在最内层循环中

依次遍历

把最左边的下标呢

在最外层循环中进行变化

依次遍历

这是一个习惯

注意最后不用了

还是要释放数组所占的存储空间

虽然是三维数组

释放的时候呢

你就写一个方括号就行了

C++语言程序设计基础课程列表:

第1章 绪论

-导学

--第1章导学

-计算机系统简介

--计算机系统简介

--计算机系统简介 测试题

-计算机语言和程序设计方法的发展

--计算机语言和程序设计方法的发展

--计算机语言和程序设计方法的发展 测试题

-面向对象的基本概念

--面向对象的基本概念

--面向对象的基本概念 测试题

-程序的开发过程

--程序的开发过程

--程序的开发过程 测试题

-信息的表示和储存

--计算机中的信息与存储单位

--计算机的数字系统

--数据的编码表示

--信息的表示和储存 测试题

-实验指导

--实验一:VS开发环境介绍

第2章 C++简单程序设计(一)

-导学

--第二章导学

-C++语言概述

--C++的特点和程序实例

--C++字符集和词法记号

--C++语言概述 测试题

-基本数据类型、常量、变量

--基本数据类型、常量、变量

--程序举例

--基本数据类型、常量、变量 测试题

-运算与表达式

--算术运算与赋值运算

--逗号运算、关系运算、逻辑运算和条件运算

--Sizeof运算、位运算

--运算优先级、类型转换

--运算与表达式 测试题

-实验二:简单程序设计(上)

--实验二:简单程序设计(上)

第2章 C++简单程序设计(二)

-数据的输入和输出

--数据的输入和输出

--数据的输入和输出 测试题

-选择结构

--if语句

--switch语句

--选择结构 测试题

-循环结构

--循环结构——while语句

--do-while语句

--for语句

--嵌套的控制结构、其他控制语句

--循环结构 测试题

-自定义类型

--自定义类型

--自定义类型

-第2章小结

--第二章小结

-实验二:C++简单程序设计(下)

--实验二C++简单程序设计(下)

第3章 函数

-导学

--导学

-函数定义

--函数定义

--函数定义 测试题

-函数调用

--函数调用(例3-1)

--例3-2

--例3-3

--例3-4

--例3-5

--例3-6

--函数调用 测试题

-嵌套与递归

--函数的嵌套调用(例3-7)

--函数的递归调用(例3-8)

--例3-9

--例3-10

--嵌套与递归 测试题

-函数的参数传递

--函数的参数传递

--函数的参数传递 测试题

-引用类型

--引用类型(例3-11)

--引用类型 测试题

-含有可变参数的函数

--含有可变参数的函数

--含有可变参数的函数 测试题

-内联函数

--内联函数(例3-14)

--内联函数 测试题

-constexpr函数

--constexpr函数

--CONSTEXPR函数课后习题

-带默认参数值的函数

--带默认参数值的函数

--默认参数值例(3-15)

--带默认参数值的函数 测试题

-函数重载

--函数重载(例3-16)

--函数重载 测试题

-C++系统函数

--C++系统函数(例3-17)

--C++系统函数习题

-第3章小结

--第三章小结

-实验三(上)函数的应用

--实验三(上)函数的应用

-实验三(下)函数的应用

--实验三(下)函数的应用

第4章 类与对象

-导学

--导学

-面向对象程序的基本特点

--面向对象程序的基本特点

--面向对象程序的基本特点 测试题

-类和对象

--类和对象的定义

--类和对象的程序举例

--类和对象 测试题

-构造函数

--构造函数基本概念

--构造函数例题(1)——例4-1

--构造函数例题(2)——例4-2

--委托构造函数

--复制构造函数

--复制构造函数调用举例

--构造函数 测试题

-析构函数

--析构函数

--析构函数 测试题

-类的组合

--类的组合

--类的组合程序举例

--前向引用声明

--类的组合 测试题

-UML简介

--UML简介

--UML简介课后习题

-结构体与联合体

--结构体(例4-7)

--联合体(例4-8)

--结构体与联合体 测试题

-枚举类

--枚举类

--枚举类 测试题

-第4章小结

--第四章小结

-实验四(上)

--实验四(上)

-实验四(下)

--实验四(下)

第5章 数据的共享与保护

-导学

--导学

-标识符的作用域与可见性

--标识符的作用域与可见性

--标识符的作用域与可见性 测试题

-对象的生存期

--对象的生存期

--对象的生存期 测试题

-类的静态成员

--静态数据成员(例5-4)

--静态函数成员(例5-5)

--类的静态成员 测试题

-类的友元

--类的友元(例5-6)

--类的友元 测试题

-共享数据的保护

--共享数据的保护(例5-7)

--共享数据的保护 测试题

-多文件结构和预编译命令

--多文件结构和预编译命令(例5-10)

--多文件结构和预编译命令 测试题

-第5章小结

--小结

-实验五

--实验五

第6章 数组、指针与字符串(一)

-导学

--导学

-数组的定义与初始化

--数组的定义与使用

--数组的储存与初始化

--一维数组应用举例

--数组的定义与初始化 测试题

-数组作为函数的参数

--数组作为函数参数(例6-2)

--数组作为函数的参数 测试题

-对象数组

--对象数组

--对象数组 测试题

-基于范围的for循环

--基于范围的for循环

-指针的定义和运算

--指针的概念、定义和指针运算

--指针的初始化和赋值

--指针的算术运算、关系运算

--指针的定义和运算 测试题

-综合实例

--综合实例

-实验六(上)

--实验六上

第6章 数组、指针与字符串(二)

-指针与数组

--用指针访问数组元素

--指针数组

--指针与数组 测试题

-指针与函数

--以指针作为函数参数

--指针类型的函数

--指向函数的指针

--指针与函数 测试题

-对象指针

--对象指针

--对象指针 测试题

-动态内存分配

--动态分配与释放内存

--申请和释放动态数组(一)

--申请和释放动态数组(二)

--动态内存分配 测试题

-智能指针

--智能指针

-vector对象

--vector对象

--vector对象 测试题

-对象复制与移动

--深层复制与浅层复制

--移动构造

--对象复制与移动 测试题

-字符串

--C风格字符串

--string类

--字符串 测试题

-第6章小结

--第六章小结

-综合实例

--综合实例

-实验六(下)

--实验六(下)

申请和释放动态数组(一)笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。