C++随记(三)---动态分配内存问题(2)
来源:互联网 发布:淘宝网儿童保护电插头 编辑:程序博客网 时间:2024/06/09 22:22
作者:teeyohuang
邮箱:teeyohuang@163.com
本文系原创,供交流学习使用,转载请注明出处,谢谢
C++随记(三)---动态分配内存问题(2) 上一篇博文讲到了使用动态数组时,只要把指针名字当作数组名使用即可,而且指针名可以进行运算,而数组名不能进行运算,这篇博文就来简要解释一下。
最通俗的解释:C++将数组名解释为地址。
什么意思呢?你可以试着运行一下语句:
最通俗的解释:C++将数组名解释为地址。
什么意思呢?你可以试着运行一下语句:
int array[10]; //定义一个大小为10的数组double *pt1 = array; //定义一个指针pt1,并直接将数组名赋值给它double *pt2 = &array[0];//将数组的第一个元素的地址赋值给指针pt2cout<<”pt1: “<<pt1<<”pt2: “<<pt2<<endl;
观察结果,你会发现这两个值居然一样!也就是说:C++将数组名解释为数组第1个元素的地址。
所以你要使用其他数组元素时,比如你要使用array[3],C++编译器将此表达式看作是:
*(array+3),意味着先计算第4个元素的地址,然后找到那里存储的值。
数组名[k]----> *( 数组名+k )
如果使用指针名,比如上篇博文的points[4],C++其实也是执行同样的转换: *(points+3)
指针名[k]-->* ( 指针名+k )
区别有一下两点:
①指针名可以修改,就像上节所说的,指针名=指针名 + 1;这样的操作合法
数组名 = 数组名 + 1;这样的操作不合法!因为数组名是一个常量。
②对数组用sizeof运算符得到的是整个数组的长度,而对指针运用sizeof得到的仅仅是这个指针的长度。也就是在这种情况下,数组名没有被当作地址处理。
另外还需补充一点:关于数组的地址。
对于数组取地址时,数组名也不会被解释为其地址。这个话看似有点矛盾,来详细解释一下,通常情况下:数组名被解释为其第一个元素的地址。即array == &array[0];
①指针名可以修改,就像上节所说的,指针名=指针名 + 1;这样的操作合法
数组名 = 数组名 + 1;这样的操作不合法!因为数组名是一个常量。
②对数组用sizeof运算符得到的是整个数组的长度,而对指针运用sizeof得到的仅仅是这个指针的长度。也就是在这种情况下,数组名没有被当作地址处理。
另外还需补充一点:关于数组的地址。
对于数组取地址时,数组名也不会被解释为其地址。这个话看似有点矛盾,来详细解释一下,通常情况下:数组名被解释为其第一个元素的地址。即array == &array[0];
而当对数组名取地址时,得到的是整个数组的地址,即 &array 是数组的地址!
这两个地址,从数值上来说是一样的,但是概念不一样,即&array[0]是一个4个字节内存块的地址(因为我上面定义的是int array[10]),而&array是一个 4*10=40个内存块的地址。所以&array[0]和&array数值上是相同的,但 &array[0]+1 和 &array+1 的数值就不一样了。
这两个地址,从数值上来说是一样的,但是概念不一样,即&array[0]是一个4个字节内存块的地址(因为我上面定义的是int array[10]),而&array是一个 4*10=40个内存块的地址。所以&array[0]和&array数值上是相同的,但 &array[0]+1 和 &array+1 的数值就不一样了。
解释完上篇博文留下的问题之后,再来看看一个和动态数组类似的应用,用new建立动态结构体。
设有一个结构体:
struct student{int number;char name;};那么要创建一个未命名的ABC结构体就如下操作:
student *ps = new student;这种操作是一样的,问题在于访问结构体成员时,如果我有一个结构体
student s1;那么因为我知道它的名字s1,我访问其中的成员是可以用成员运算符. 即s1.name;但是我用new开辟的未命名结构体没有名字,就会用到箭头成员运算符->即 ps->name来访问成员,当然也可以用(*ps).name来操作,这两个操作是一样的。
阅读全文
0 0
- C++随记(三)---动态分配内存问题(2)
- C++随记(二)---动态分配内存问题(1)
- C语言(1)----动态分配内存
- C学习笔记(1)--动态分配内存
- C语言:堆结构串(动态分配内存)
- C语言有关内存和动态分配内存传递问题
- 顺序表(动态分配内存)
- 动态分配内存malloc()函数
- C++内存动态分配(转载)
- C动态分配内存
- 【c++】C++ 动态分配内存
- C中动态分配内存
- C语言动态分配内存
- C动态分配内存
- C语言动态分配内存
- C语言--动态分配内存
- C动态分配内存
- 【threejs学习随记(三)】3D模型导入问题
- 【vagrant up】 default: Warning: Authentication failure. Retrying
- IBATIS列名无效
- IOS Swift3 基本图形绘制
- 第十四周算法分析与设计:Binary Tree Preorder Traversal
- 打印楼梯,同时在楼梯上方打印两个笑脸
- C++随记(三)---动态分配内存问题(2)
- 基于STM32wifi小车制作(五)-基本完工
- 5月26日,每日20行。
- 循环神经网络(RNN, Recurrent Neural Networks)介绍
- zoj1203
- 1.1 Getting the Source Tree
- Java中的static详解
- sdut-离散题目9
- 分布式系统概述(来自学习资料)