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;	

三、多维指针的含义

二维指针本质就是一维数组,只是这个数组里,存的都是地址(钥匙)。

二维数组和二级指针不一样:

  • 二维数组是一段物理上连续的空间,有着不同的访问方式(一行行地访问);
  • 二级指针是描述了一段一维空间,这些空间存的是地址,而这些地址对应的空间在物理上是不连续的,是在逻辑上有序。

注意事项

  • 初始化
  • 结束标志:结束标志很重要,不然就可以无穷访问了

SUFE大二在读