C++随记(三)---动态分配内存问题(2)

C++随记(三)---动态分配内存问题(2)

     上一篇博文讲到了使用动态数组时,只要把指针名字当作数组名使用即可,而且指针名可以进行运算,而数组名不能进行运算,这篇博文就来简要解释一下。 最通俗的解释:C++将数组名解释为地址。     什么意思呢?你可以试着运行一下语句:

int array[10];          //定义一个大小为10的数组
double *pt1 = array;    //定义一个指针pt1,并直接将数组名赋值给它
double *pt2 = &array[0];//将数组的第一个元素的地址赋值给指针pt2

cout<<”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];

      而当对数组名取地址时,得到的是整个数组的地址,即 &array 是数组的地址!       这两个地址,从数值上来说是一样的,但是概念不一样,即&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 条评论
登录 后参与评论

相关文章

来自专栏前端进阶之路

尾调用和尾递归

尾调用是函数式编程中一个很重要的概念,当一个函数执行时的最后一个步骤是返回另一个函数的调用,这就叫做尾调用。

1031
来自专栏Golang语言社区

Go语言的小细节--map

Go和Python一样,都有map。在Python里叫做字典,在Go里叫做映射。 与Go相比Python对map的使用相对更加灵活,毕竟在Pyhton的哲学里一...

3585
来自专栏cs

c++那些事儿6.0 STL中的string

---- 知识点综述 c++,string 类 string 是C++中的字符串对象,是一种特殊类型的容器,专门设计来操作的字符序列。 ...

2807
来自专栏决胜机器学习

正则表达式学习笔记

正则表达式学习笔记 (原创内容,转载请注明来源,谢谢) 首先,学习正则表达式,很推荐一篇博客,http://www.cnblogs.com/deerchao...

35312
来自专栏散尽浮华

python-基础案例

范例一: 练习:元素分类 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,...

2145
来自专栏mukekeheart的iOS之旅

《JavaScript高级程序设计》学习笔记(3)——变量、作用域和内存问题

欢迎关注本人的微信公众号“前端小填填”,专注前端技术的基础和项目开发的学习。 本节内容对应《JavaScript高级程序设计》的第四章内容。 1、函数:通过函数...

2866
来自专栏技术之路

详解JavaScript闭包

  要想完全明白JavaScript的闭包,要先明白js中的一些基础原理,然后我再给出一些例子来讲解闭包。   在执行JavaScript时会创建一个执行环境(...

25310
来自专栏跟着阿笨一起玩NET

C#修饰符

C#中类及类型成员权限访问修饰符有以下四类:public,private,protected,internal。

782
来自专栏余林丰

初识Java反射

要详细的了解Java反射,就得要了解Java的类加载以及何为运行时动态加载等等概念。本文抛开其余概念,简单介绍Java反射,详细介绍会在以后有一个系统而全面的认...

22710
来自专栏C/C++基础

C++输入输出操作符重载

C++中输入操作符是>>,输出操作符是<<,又叫做流对象的“插入操作符”和“提取操作符“。其实这两个操作符最初是在C语言中用于整数的移位运算,到了C++中才利用...

792

扫码关注云+社区