C语言数组和多维空间
一、数组名的含义和初始化语法
1. 含义
空间:基本数据类型分配空间、结构体分配空间
对于多个同样类型(即容量)的空间,C语言认为不该有单独的一个类型去描述,所以就整出了一个[]: data[]
使data变成了一个标签,并不占用空间
int a; // a 变量名(标签) a占用空间
int *p1; // p1 指针类型变量名,p1占用空间
int data[5]; // data 常量标签,data不占用空间。分配5个int类型的无名空间,把这个空间的第一个元素的首地址用data来标记
数组名不是空间名,它只是一个常量地址,地址的访问行为关注的是每个元素多大,而不关注有多少个元素。
2. 对数组名取地址
int data[5];
&data : 本质上,毫无意义,非法使用。不过它被编译器赋予了一种新的行为。
&data : 还是一个地址,值是和data一样,他的访问行为是一个空间一个空间地访问(在这里是5个int、5个int地访问)
data : data data+1 int
&data: &data &data+1 int [5]
想用变量储存&data,C语言经过了这些思路:
int [5]*p2 = &data; ===> int *p2[5] = &data; ===> int (*p2)[5] = &data;
C语言里面,变量先往右边看,再往左边看。
3. 数组的赋值
数组的赋值只有一种方法——逐一赋值。为了方便起见,它提供了一个语法糖,即初始化:只能运行一次的语法,必须在空间定义时直接初始化(C语言内部调用了其他的库函数来隐藏代码写法)。
初始化与赋值完全不同。
二、多维数组的含义和地址表示
多维数组 == 常量地址——标记了一段空间的首地址而已。多维数组的空间访问行为和一维数组不一样。
int data1[5]; // 5个 int 空间
int *p1 = data1;
// 二维数组
int data2[3][4]; // 表示有3个元素,每个元素含有4个东西,每个东西int大小。空间中分配12个int大小的空间 这个空间第一个元素的首地址 用data2标记
int (*p2)[4] = data2;
不同维度的数组都是表示一维空间,只是访问一维空间行为不同,所以产生了多维数组的形式。
data2[1] == *(data2 + 1)
(data2[1])[2] // 认为这个括号没有必要,所以就去了,变成data[1][2]
// 两个地址值一样,但是访问行为不一样
*(data2 + 1) : 地址是int访问
data2 + 1 : 地址是4个int访问
// 三维数组
int data3[3][4][5];
int (*p3)[4][5] = data3;
三、多维指针的含义
二维指针本质就是一维数组,只是这个数组里,存的都是地址(钥匙)。
二维数组和二级指针不一样:
- 二维数组是一段物理上连续的空间,有着不同的访问方式(一行行地访问);
- 二级指针是描述了一段一维空间,这些空间存的是地址,而这些地址对应的空间在物理上是不连续的,是在逻辑上有序。
注意事项
- 初始化
- 结束标志:结束标志很重要,不然就可以无穷访问了