Excel不相邻列如何打印在一起-英雄云拓展知识分享
196
2023-11-01
【摘要】 本书摘自《C++程序开发案例课堂》一书中第8章,第7节,由刘春茂、李琪编著。
8.7 void 指针
一个指针有两个基本属性:指向变量的地址和长度。指针是存储地址的,长度取决于指 针的类型。在编译过程中,编译器按照指针类型的不同,向后开始寻址。
void 的字面意思是“无类型”, void* 则为"无类型指针”, void *可以指向任何类型的 数据。
void 只有“注释”和限制程序的作用,主要表现在对函数返回的限定和对函数参数的限 定两个方面。
void(类型)指针是一种特殊的指针,它能够灵巧地指向任何数据类型的地址空间。
指针变量的地址就是指向该变量的指针时,这就是一种双重指针的机制。称指向指针的指针 为二级指针,这在 C++ 中是允许定义的。二级指针必须指向一个一级指针,而这个一级指针 存放的是一个内存地址。
下面通过一个例子来说明如何使用二级指针。
【代码剖析】
在该例中,首先定义了静态数组 a, 该数组有3个变量,分别是1、2、3。接下来定义了 一个指针型数组n, 该数组的3个变量分别是a 数组元素的地址。定义二级指针p,p 被赋值
为n。p 就指向了n 数组的首地址。然后,使用 for 循环访问二级地址p 的内容,并且输出。
运行结果如图8-11所示。
从运行结果来看,利用二级指针输出了数 组的内容,指针数组的元素只能是地址。
如果一个指针变量中存放的是一个目标变 量的地址,这就是单级间址。指向指针的指针 用的是二级间址。
8.9 动态内存配置
对一个程序设计者来说,变量和各种其他对象的内存分配都是由编译器自动分配的。例 如,使用一个数组时,必须为数组声明较大空间,指针变量也需要指向一个已经存在的变量 或者对象,这样就使得程序员对内存的控制不是很灵活。
虽然为了与C 语言兼容, C++ 仍保留 malloc和 free 函数,但建议用户不用 malloc 和free 函数,而用 new 和 delete运算符。
相对于内存占用不确定的情况, C++ 的动态内存分配机制很好地解决了这个问题。 C/C++ 定义了4个内存区间:代码区、全局数据区、栈区和堆(heap)区。
通常,在定义变量的情况下,编译过程中编译器会根据变量的类型,为它们分配适当的 内存空间大小,这样的内存分配称为静态存储分配。
如果能够确定内存大小的,使用静态存储分配就可以满足需要。但是,有些时候,内存 分配情况不能确定,在编译过程中就不能确定分配内存的大小。那么,这个分配过程就只能 在运行过程中,根据实际需求进行内存分配,这种内存分配的方法称为动态存储分配。
动态存储分配是在程序运行到需要动态分配变量和内存时,向堆栈申请一块所需要的存 储空间大小,用于存储该变量或者对象。
在变量或者对象的生命周期结束时,显式地释放它们占用的内存空间,堆栈空间就可以 被再次分配,重复利用资源。
8.9.1 使用基本数据类型做动态配置
在 C++ 中,申请和释放堆中分配的存储空间,分别使用 new 和 delete 这两个运算符来完 成,其使用的格式如下:
其中,关键字 new 的作用是返回一个所分配类型的变量的指针。创建的变量和对象,是 通过该指针操作。
一般的变量或者对象,在定义时都要指定一个标识符命名,而动态分配的变量或者对象 是没有命名标识符的,称为无名对象。
使用 new 表达式的操作过程首先是从堆栈分配对象,使用括号中的值初始化对象,从堆 栈分配对象是调用库操作符 new()。
例如:
int *pi=new int(0);
说明: pi现在所指向的变量是由库操作符new()分配的,位于程序的堆区中,并且该对象 未命名。
下面通过一个实例来了解基本数据类型的动态配置。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~