一. 数组的定义以及访问数组方法
例子: 定义了5个int类型的数组 --> int A[5];
通过下标可以访问数组中每一个成员
--> A[0] ->第一个成员 ... A[4] -> 第五个成员
二. 数组的赋值
1. 定义同时初始化
--> 使用初始化列表 {依次写每一个成员的值,使用","分开}
例子:
int B[3] = {100,200,300}; -> 编译通过
int B[3] = {100,200}; -> 编译通过,但是没有赋值的成员B[2]=0 --> 只要没赋值完全,剩下的变量都是0
int B[3] = {100,200,300,400}; -> 编译警告
warning:excess elements in array initializer --> 初始化数组内存越界
int B[] = {100,200,300}; -> 编译通过 --> 虽然看不到下标,但是初始化列表决定下标等于3
int B[] = {100,200,300,400}; --> 编译通过 --> 虽然看不到下标,但是初始化列表决定下标等于4
int B[] = {}; --> 编译通过,但是给数组的成员赋随机值
int B[3] = {}; --> 编译通过,但是给数组的成员赋值0
int B[3] = {100,200}; --> 局部变量 -> B[0]=100,B[1]=200,B[2]=0
int B[3] = {100,200}; --> 全局变量 -> B[0]=100,B[1]=200,B[2]=0
2. 先定义,后初始化
int B[3]; --> 局部变量 --> 全部成员都是随机值
int B[3]; --> 全局变量 --> 全部成员都是0
int B[]; --> 编译出错: error: array size missing in ‘B’
int B[3]; --> 全部都是随机值
B[3] = {100,200,300}; -> 编译出错:error: expected expression before ‘{’ token
B[] = {100,200,300}; -> 编译出错:error: expected expression before ‘]’ token
B = {100,200,300}; -> 编译出错:error: expected expression before ‘{’ token
int B[3]; --> 全部都是随机值
B[0] = 100;
B[1] = 200;
B[2] = 随机值
与下面的例子容易混淆:
int B[3] = {100,200};
B[2] = 0;
总结
1)如果定义的同时初始化,成员使用","分开。
2)赋值的成员必须与数组的数据类型必须匹配 --> 否则编译出错
3)初始化列表个数必须小于/等于数组的长度才不会收到警告
4)定义的同时初始化,初始化列表中如果没有值,或者赋值的值个数小于数组的长度,则剩余没有赋值的变量都是0
5)定义了一个数组,如果数组是全局变量就会赋值为0,如果是局部是随机值。
6)如果先定义了数组,则就不能整体赋值,只能单个赋值了!
三. 研究数组名字
1. 数组名作用于sizeof()时
例子:int A[5] = {100,200,300};
在内存空间连续申请20个字节,使用变量A间接访问这片内存空间,第一个元素赋值100,第二个元素赋值200,第三个元素赋值300,剩余元素赋值为0。
计算A代表的内存空间是多少? --> sizeof()
int a; -> a代表这个int的4个字节 --> sizeof(a); -> 就可以计算a代表的内存空间是多少 ->4
int A[5]; ---> sizeof(A) = 20
结论: 当数组作用于sizeof(),A就是代表数组的名字。
2. 数组名不作用于sizeof()时
在内存空间打印指针地址:%p
printf("A = %p\n",A); --> A=0xbfbd5cfc
printf("&A[0] = %p\n",&A[0]); --> &A[0]=0xbfbd5cfc
结论:数组名就等价于该数组首元素的地址 --> A = &A[0]