1. 一维数组
1.1 本质
数据类型是一种构造类型,内存是一段连续的存储区域。数据类型,决定了连续内存的访问方式,包括起始地址,步长,寻址范围。
1.2 初始化
int array[10] = {1, 2, 3}; //部分初始化
int array1[10] = {[3] = 10};
int array2[10] = {0}; //清零(部分初始化会把其余的元素置0)
int array3[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 11, 22}; 越界不检
1.3 使用
数组名是数组的唯一标识符,数组中的每一个元素都是没有名字的。
数组名有两重含义。
- 作为数组名时,它是一种构造数据类型
#include <stdio.h>
int main(void)
{
int array[10];
printf("&array = %p\n", &array);
printf("&array+1 = %p\n", &array+1);
return 0;
}
此时可以观察到结果,&array+1跳跃的是一个int[10]的长度,此时&array是一个数组指针,可以看成是 int (*p)[10],这个指针的步长是int[10].此时对数组名取地址代表访问的是数组整体。
- 作为访问成员时,它是首元素的地址
#include <stdio.h>
int main(void)
{
int array[10];
printf("array = %p\n", array);
printf("array + 1 = %p\n", array + 1);
return 0;
}
此时观察的话,array+1跳跃的是一个int的长度,此时array相当于一个int *的指针,步长为一个int。
array[i] == *(array+i) == i[array]
1.4 错误的认识及纠正
对一维数组取地址(reference),等价于数组指针而不是二级指针.
int array[10];
int (*pa)[10] = &array; //正确
int **pa = &array; //错误
1.5 关于&(reference)和*(dereference)
两种操作符代表的是互逆的操作,有些时候可能认为是取地址和取值,但在和数组结合的时候,对一维数组进行&(reference)操作,并不是想当然的二级指针。所以一般认为是引用和解引用。
2. 二维数组
2.1. 本质
二维数组的本质也是一个一维数组,只是数组成员,由基本数据类型变成了构造数据类型(一维数组)
2.2. 初始化
行可以省,列不可以省
部分初始化和清零依然适用
2.3. 访问
- 作数组名时
#include <stdio.h>
int main(void)
{
int array[3][4];
printf("&array = %p\n", &array);
printf("&array+1 = %p\n", &array+1);
return 0;
}
当从整体来看的时候,&array代表的是一个二维数组整体的地址,即是一个数组指针int (*array)[3][4],那么此时这个指针的步长即int [3][4],即12个int的跨度。
- 访问成员时
#include <stdio.h>
int main(void)
{
int array[3][4];
printf("array = %p\n", array);
printf("array + 1 = %p\n", array + 1);
return 0;
}
此时差了个int[4]个长度,此时array表示第0行首地址,array+i表示第i行首地址。此时array相当于一个 int(*array)[4]的指针,此时指向在第一行首地址。
本文详细介绍了数组与指针的关系,特别是对一维和二维数组的初始化、使用、访问和操作。一维数组中,数组名既是数组的标识符也是首元素的地址,对数组取地址得到的是数组指针。二维数组本质上是一维数组的数组,访问时可以视为一维数组的指针。文章纠正了关于一维数组取地址的误解,并探讨了&(reference)和*(dereference)在数组中的应用。
1266

被折叠的 条评论
为什么被折叠?



