数组是相同类型的变量的有序集合。
int a[5]; // 5个int类型数据,每个元素都是int型数据;a代表数组第一个元素的起始地址。这20个字节空间的名字
为a,a[0]、a[1]等都是a中的元素,并非元素的名字。数组中的元素没有名字。
数组的大小:
数组在一片连续的内存空间中存储元素
数组元素的个数可以显式或隐式指定
int main()
{
int a[5] = {1, 2};
int b[] = {3, 4};
printf("%d, %d, %d\n", a[2], a[3], a[4]);
int a1 = sizeof(a);
int b1 = sizeof(b);
printf("%d, %d\n", a1, b1);
int an = a1/sizeof(int);
int bn = b1/sizeof(int);
printf("%d, %d\n", an, bn);
return 0;
}
编译运行:
~/will$ ./a.out
0, 0, 0
20, 8
5, 2
数组名代表
数组首元素的地址;
数组的地址需要用取地址符&才能得到;
数组首地址的地址值与数组的地址值相同;
数组 首元素的地址与 数组的地址是两个不同的概念。//首地址是一个地址,而 数组的地址是一个包含数组长度的地址
int main()
{
int a[5] = {1, 2, 3, 4, 5};
printf("%p\n", a);
printf("%p\n", &a);
printf("%p\n", &a[0]);
return 0;
}
但是编译运行的结果是一样的:
~/will$ ./a.out
0xbfae18fc
0xbfae18fc
0xbfae18fc
数组名可以看做一个
常量指针
数组名“指向”的是内存中 数组首元素的起始位置
数组名 不包含数组的长度信息
在表达式中数组名只能作为右值使用
只有在 下列场合中数组名不能看做常量指针数组名作为sizeof操作符的参数
数组名作为&运算符的参数
观察下面代码:
int main()
{
int a[5] = {1, 2, 3, 4, 5};
int b[2];
int* p = NULL;
p=a;
printf("%p\n", a);
printf("%p\n", p);
printf("%p\n", &a);
printf("%p\n", &p);
printf("sizeof(a) = %d\n",sizeof(a));
printf("sizeof(p) = %d\n",sizeof(p));
printf("\n");
p=b;
printf("%p\n", b);
printf("%p\n", p);
printf("%p\n", &b);
printf("%p\n", &p);
printf("sizeof(b) = %d\n",sizeof(b));
printf("sizeof(p) = %d\n",sizeof(p));
//b = a; error
return 0;
}
编译运行:
~/will$ gcc test.c
~/will$ ./a.out
0xbfeb7260
0xbfeb7260
0xbfeb7260
0xbfeb727c
sizeof(a) = 20
sizeof(p) = 4
0xbfeb7274
0xbfeb7274
0xbfeb7274
0xbfeb727c
sizeof(b) = 8
sizeof(p) = 4
数组是一片连续的内存空间
数组的地址和数组首元素的地址意义不同
数组名在大多数情况下被当做常量指针处理
数组名其实不是指针,不能将其等同于指针,比如两个大小不同的数组,是不能用数组名相互赋值的。