二维数组
声明和初始化:
Type 数组名[m][n] : 声明了一个二维数组。
Int matrix[3][4] = { { 00, 01, 02, 03} ,
{ 10, 11, 12, 13} ,
{ 20, 21, 22, 23} }
视角分析:
二维数组可以看成一个数组:只不过这个数组由复杂元素组成。
Int matrix[3][4] = {?, ?, ?} ,复杂元素?是一个数组。
存储方式:
编译器遇到二维数组的声明时,会为其分配一段空间,顺序如图。
并记录下来, matrix ---- 第一维数组的首地址。 并记录它的指向性。 它是一个地址数据,指向复杂元素0的首地址。
v
数组名纠纷
我现在认为: 数组名仅仅是一个代号,它和其他形式定义的变量名称不一样。
比如: int a =9; 编译器记录下: 代号a , 地址为 0x880,值为9. 无指向性。
Int *p = &a; 编译器记录如下: 代号p,地址为0x884,值为 0x880, 具有一级指向性。
Int arry[3] = { 1, 2,3} 编译器记录如下: 代号arry, 地址为 0x888,值为0x888,具有一级指向性。
同时分配地址: 0x88C值为1,同时0x890值为2,同时0x894值为3
Int matrix[2][3] = {2,2,2,1,1,1} 编译器记录如下: 代号matrix, 地址为 0x898,值为0x898,具有二级指向性。
同时分配地址: 0x89C值为2,同时0x8A0值为2,同时0x8A4值为2
0x8A8值为1,同时0x8AC值为1,同时0x8B0值为1
Matrix的值为430765216
Matrix的地址,读出也为430765216。
Matrix[0] ,将执行 *(matrix +0) = *(matrix) 获得该地址内的值。
Matrix[1] ,将执行 *(matrix +1) = *(matrix + 1*3*4) ,相当于加12
Matrix[0][0],是元素值,为2.
&(Matrix[0][0]) 是元素的地址。
P 是p的值。
&p是p的地址,很显然是自己独立的一个地址。
*p是获得p地址内存储的值。
下标访问
Matrix[1] 会被编译器转换成 *(matrix +1) ,其中matrix符号会取其值,即地址。所以+1,将 +1*sizeof(复杂元素),即行跳
Matrix[1][2] 会被编译器转换成 *( *(matrix +1) + 2) , *(matrix +1)的结果仍是地址,对地址+2,将执行 +2*sizeof(int)。即元素2。 此时*(地址)就能获取数据了。
我觉的就是 x+1操作,主要看 x是否具有指向性,如果具有指向,则 +1*sizeof(指向..) 。没有才老老实实+1.
指针数组
A arrary of point :归根结底是一个数组,只是这个数组的元素有点特别,它们都是 指针。
char *p[10] ; 定义了一个数组,它具有10个元素,且这10个元素都是 指向char的指针。
数组指针
A point to A array : 归根结底是一个指针,它指向的内容比较特别,指向的是一个数组。那指向数组的哪一部分?
Char (*p)[10] ;定义了一个指针*p, 它指向一个 长度为10,元素为char的数组。