Summary
1)数组是相同类型
的变量
的有序集合
,数组在一片连续的内存空间
中存储元素。
2)数组名a
代表数组首元素的地址
,a同时也代表数组这一段连续的内存
;
- a是数组首元素的地址,
类型是int*
;*a
就是首元素,sizeof(*a)
可以获得数组首元素的内存大小;a同时也代表这一段内存,sizeof(a)
可以获得数组的内存大小;sizeof(a) / sizeof(*a)
= 数组元素的个数
数组的地址
需要用取地址符&取到,&a
;- &a是数组的地址,
类型是int(*)[n]
.
数组首元素的地址
值与数组的地址
值相同,但是意义不同
;(比如现实生活中,小区的地址和我家的地址是相同的,但并不能说小区就是我家的)我们所说的地址通常包含2个概念:起始地址 + 长度
- 在
值上,a == &a[0] == &a
;但意义不同
,体现在指针运算
上,a + 1,会移动sizeof(*a)个字节,&a + 1,会移动sizeof(a)个字节
看做
一个指针常量
(注意是看做,数组名并不是指针
),因为数组名指向的是首元素的起始位置,是一个地址
,并且不能作为左值
,同时数组名在很多时候可以像指针一样操作,比如指针运算
等。6)在下列场合中,数组名就不能看做指针常量(也证明了数组名并不是指针)
数组名作为sizeof的参数
,这时候取的是数组内存的大小。(a就不是个指针了,如果看做指针,就永远取到的是4或8字节,而不是数组a的大小)数组作为&运算符的参数
,此时取到的是数组a的地址,同首元素的值。
相同类型
的变量
的有序集合
,数组在一片连续的内存空间
中存储元素。文章图片
数组元素的个数可以显示或隐式指定:
详见:【C入门】7、C语言中的数组
int a[5] = {1, 2};
int b[] = {1, 2};
问题:
1. a[2], a[3], a[3]的值是多少? -- 0,如果前面的元素指定了值,后续未初始化的均为0
2. b包含了多少个元素? -- 2,编译器会隐式推断b有多少元素
2、数组名的盲点 2.1
数组名a
代表数组首元素的地址
,a同时也代表数组这一段连续的内存
;- a是数组首元素的地址,类型是int*;
*a
就是首元素,sizeof(*a)
可以获得数组首元素的内存大小;a同时也代表这一段内存,sizeof(a)
可以获得数组的内存大小;sizeof(a) / sizeof(*a)
= 数组元素的个数
数组的地址
需要用取地址符&取到,&a
;- &a是数组的地址,类型是int(*)[n].
数组首元素的地址
值与数组的地址
值相同,但是意义不同
;(比如现实生活中,小区的地址和我家的地址是相同的,但并不能说小区就是我家的)我们所说的地址通常包含2个概念:起始地址 + 长度
- 在
值上,a == &a[0] == &a
;但意义不同
,体现在指针运算
上,a + 1,会移动sizeof(*a)个字节,&a + 1,会移动sizeof(a)个字节
看做
一个指针常量
(注意是看做,数组名并不是指针
),因为数组名指向的是首元素的起始位置,是一个地址
,并且不能作为左值
,同时数组名在很多时候可以像指针一样操作,比如指针运算
等。2.5 在下列场合中,数组名就不能看做指针常量(也证明了数组名并不是指针)
数组名作为sizeof的参数
,这时候取的是数组内存的大小。(a就不是个指针了,如果看做指针,就永远取到的是4或8字节,而不是数组a的大小)数组作为&运算符的参数
,此时取到的是数组a的地址,同首元素的值。
如有错漏之处,恳请指正。
推荐阅读
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- C/C++|C/C++ basis 02
- Qt实战|Qt+OpenCV联合开发(二十一)--图像翻转与旋转
- Qt实战|Qt+OpenCV联合开发(十四)--图像感兴趣区域(ROI)的提取
- Qt实战|Qt+OpenCV联合开发(十三)--通道分离与合并
- opencv|Qt+OpenCV联合开发(十六)--图像几何形状绘制
- Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色
- SNAT的MASQUERADE地址选择与端口选择
- IPTABLES的连接跟踪与NAT分析
- IPVS分析