1、数组的概念
数组是相同类型的变量的有序集合
int a[5];
数组包含5个int类型的数据
a代表数组第一个元素的起始地址,这20个字节的名字为a。a[0], a[1]等都是a中的元素,并非元素的名字,数组中的元素没有名字。每个元素都是int型数据。
2、数组的大小
# 数组在一片连续的内存空间中存储元素
# 数组元素的个数可以显式或隐式指定
#include <stdio.h>
#include <string.h>
int main()
{
int a[5] = {1, 2}; //剩余的三个元素,编译器会初始化为0,这是编译器的行为
int c[5];
int d[5] = {0}; //这里对数组进行了初始化,巧妙的运用了编译器特性,
//它会自动对未定义数组元素初始化为0
int b[] = {1, 2};
int i;
//memset(c, 0, sizeof(c)); //这个不是初始化,是对数组赋值
printf("%d, %d \n", sizeof a, sizeof a/sizeof *a);
printf("%0x, %0x \n", a, &a);
printf("%d, %d \n", sizeof b, sizeof b/sizeof *b);
for(i = 0; i < 5; i++)
{
printf("%d\n", a[i]);
}
for(i = 0; i < 5; i++)
{
printf("%d\n", c[i]);
}
for(i = 0; i < 5; i++)
{
printf("%d\n", d[i]);
}
return 0;
}
运行结果:
20, 5
22ff38, 22ff38
8, 2
1
2
0
0
0
2008950864
-1
2009091625
2009091650
4200820
0
0
0
0
0
3、数组地址与数组名
# 数组名代表数组首元素的地址
# 数组的地址需要用取地址符&才能得到
# 数组首元素的地址值与数组的地址值相同
# 数组首元素的地址与数组的地址是两个不同的概念
你家所在的楼房和你家的GPS地址相同,但意义不同。
4、数组名的盲点
# 数组名可以看做一个常量指针
# 数组名“指向”的是内存中数组首元素的起始位置
# 在表达式中数组名只能作为右值使用
# 只有在下面场合中数组名不能看做常量指针
1、数组名作为sizeof操作数的参数时,它代表整个数组,而非首元素的常量指针
2、数组名作为&的参数,它代表整个数组,所以&a(a为一个数组)表示数组地址。
数组小结
# 数组是一片连续的内存空间
# 数组的地址和数组首元素的地址意义不同
# 数组名在大多数情况下被当成常量指针处理
# 数组名其实并不是指针,在外部声明时不能混淆