深入理解数组的本质



  (一)数组的基本概念

(二)数组和指针的关

(一)数组的基本概念.

        (1)数组:相同类型的元素的集合。     type array__name[const]

        (2)注意点:

<1>在函数中创建数组的同时必须进行初始化 .不能只创建而不初始化数组。

创建并初始化时,可以不完全初始化,在花括号里面附上一个0即可;但是此种情况要求创建含有不少于1个元素的数组时,常量表达式不能省略;最终创建出 一个包含CONST个元素,并且每个元素的初始值为0的数组。 数组创建时,如果省略常量表达式,那么得进行完全初始化。数组的元素个数根据初始化的内容来确定

 创建n维数组,就会有n个常量表达式。其中,只有第一个常量表达式可以省略,其余常量表达式不可省略。

   <2>任何一个c语言当中的变量取地址时,取出来的地址值一定是此变量所开辟的众多字节当中的最小地址

(3)&a和&a[0]的区别:

 &a[0]:数组名a分别和运算符&和运算符[]结合,我们知道,运算符[]的运算优先级比运算符&高,所以数组名a先和运算符[]结合,此时表示首元素,在与运算符&结合表示首元素地址,就是数组内第一个元素的地址

&a:数组名与运算符&结合表示数组的地址,就是数两者在数字层面上的值是一样的,主要差别是体现在类型上。我们知道两者的数组整体都是地址,而地址就是指针,对此进行指针+1,即&a[0]+1和&a+1时;我们发现指针移动的步长不一样,对&a[0]+1,指针移动的步长为该元素保存的数据的类型大小;对&a+1,指针移动的步长为该数组中元素保存的数据类型大小乘上元素个数。

因为首元素的地址和数组的地址在内存开辟总多字节中对应的最低字节是重叠的!所以,地址数据值相等

当一个数组名表示整个数组只有俩种情况:

 &a++++sizeof(a)    数组名可以充当右值,代表首元素地址!但是数组名不能充当左值..

(4)多维数组

1.二维数组的存储方式

  

2. 数组中元素的类型,就是去掉数组名和第一个方括号[ ]及其里面的常量表达式,剩余的就是数组中元素类型;数组中第一个方括号代表的是该数组包含的元素的个数,里面的常量表达式可以省略不写,如果不写,数组的元素个数由初始化决定。

例如:

char x[2][3][4] = {0};

是一个三维数组,由 于第一个方括号中常量表达式为2,所以该数组有2个元素,每个元素的类型就是去掉x[2],剩余的char [3][4]就是元素的类型;

char a[3][4] = {0};

是一个二维数组,由于第一个方括号中常量表达式为3,所以该数组有3个元素,每个元素的类型就是去掉a[3],剩余的char [4]就是元素的类型;

char arr[4] = {0};

是一个一维数组,由于第一个方括号中常量表达式为4,所以该数组有4个元素,每个元素的类型就是去掉arr[4],剩余的char就是元素的类型

 3.二维数组,可以被看做“一维数组”,只不过内部“元素”也是一维数组。那么内部一维数组在内存中布局是“线性连续且递增”的,多个该一维数组构成另一个“一维数组”,那么整体便也是线性连续且递增的。二维数组可以被看做内部元素是一维数组的一维数组。

 

 任何一个多维数组来说,数组名使用的时候代表整个数组只有两种情况,一种是对数组取地址,另一种是用sizeof关键字内部单独使用数组名求数组的类型。其余情况,数组名一律代表首元素地址。这个首元素,我们现在就要特别关注了,在一维数组中,由于一维数组内部包含的元素都是基本数据类型,所以首元素其实就是数组的第一个元素;但是到了多维,我们以二维数组为例,二维数组的首元素是一个一维数组,而二维数组的第一个元素是二维数组的首元素中的首元素。

(二)指针和数组的关系.

  结论:指针和数组没有关系!!!

 

 指针和数组指向一块空间的时候,访问的方式可以互通,具有相似性,不代表具有相关性。

猜你喜欢

转载自blog.csdn.net/m0_63203388/article/details/121241123