<C和指针---读书笔记9>

二维数组

 声明和初始化:

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的数组。

原文地址:https://www.cnblogs.com/mokang0421/p/7482587.html