数组的概念
·数组是相同类型的变量的有序集合
image.png

数组的大小
·数组在一片连续的内存空间中存储元素
·数组元素的个数可以显示或隐式指定
image.png
1.a[2] a[3] a[4]的值为0;
2.b包含了2个元素

数组地址与数组名
·数组名代表数组首元素的地址
·数组的地址需要用取地址符&才能得到
·数组的首元素的地址值与数组的地址值相同
·数组首元素的地址与数组的地址是两个不同的概念

例子27-2:

include"stdio.h"

int main()
{

int a[5] = { 0 };
printf("a = %p\n",a);   
printf("&a = %p\n",&a);    //虽然都是首地址,但是长度不同
printf("&a[0] = %p\n",&a[0]);
return 0;

}
输出结果:
a = 012FF888
&a = 012FF888
&a[0] = 012FF888
a与&a虽然输出结果相同,都是首地址,但是&a的长度不同。

数组名的盲点
·数组名可以看做一个常量指针
·数组名“指向”的是内存中数组首元素的起始地址
·数组名不包含数组的长度信息
·在表达式中数组名只能作为右值使用

·只有在下列场合中数组名不能看做常量指针
-数组名作为sizeof操作符的参数
-数组名作为&运算符的参数

例子27-3:

include"stdio.h"

int main()
{

int a[5] = { 0 };
int b[2];
int* p = NULL;
p = a;
printf("a = %p\n",a);
printf("p = %p\n",p);
printf("&p = %p\n",&p);
printf("&sizeof(a) = %d\n",sizeof(a));
printf("&sizeof(p) = %d\n",sizeof(p));

printf("\n");
p = b;
printf("b = %p\n",b);
printf("p = %p\n",p);
printf("&p = %p\n",&p);
printf("&sizeof(b) = %d\n",sizeof(b));
printf("&sizeof(p) = %d\n",sizeof(p));

}
输出结果:
a = 0087F9E4
p = 0087F9E4
&p = 0087F9C8
&sizeof(a) = 20
&sizeof(p) = 4

b = 0087F9D4
p = 0087F9D4
&p = 0087F9C8
&sizeof(b) = 8
&sizeof(p) = 4

小结:
·数组是一片连续的内存空间
·数组的地址和数组首元素的地址意义不同
·数组名在大多数情况下被当成常量指针处理
·数组名其实并不是指针,不能将其等同于指针


YingLi
6 声望4 粉丝

From zero to hero.