二维数组元素的地址问题,超详细解读。

  • Post author:
  • Post category:其他


下面我用一个例子详细说明

这里开始补充一点知识(

二维数组名也是一个指针常量


由图可以得出*与[]运算是一样的,二维数组名加一个[]或者*代表变成行指针,二维数组名加上两个**或者[]代表元素,二者可以混合使用;&代表的是取地址,&与*和&与[]是逆运算。

itn a [3][4] = {

{1,3,5,7},{9,11,,13,15},{17,19,21,23}};这里是定义的一个语句,后面的全部围绕这个展开,这里我画一个图帮助理解。

a代表第0行首地址                                a[0]代表a[0][0]的地址

a+1代表第一行首地址                          a[0]+1代表a[0][1]的首地址

a+2代表第二行首地址                          a[0]+2代表a[0][2]的首地址                                                     由此可以推

a+i代表行号为i的行首地址                    a[i]+j代表a[]i[j]的地址


*(a[i]+j)代表元素a[i][j]        *(*(a+i)+j)代表元素a[i][j]         这里这两者是等价的


补充一点a[i]代表第i行首地址,且是一个列地址

printf(

“%d,%d\n”,a,*a

);  //a行地址,*a列地址                                                                                      printf(“%d,%d\n”,a[0],*(a+0));  //a[0]列地址,*(a+0)也是列地址                          printf(“%d,%d\n”,&a[0],&a[0][0]);//&a[0]行地址,&a[0][0]列地址                                                        这里都是打印出0xa11这样相同的地址,注意这里的地址是我随便给的

printf(“%d,%d\n”,a[1],a+1);//a[1]是列地址a+1是行地址                                                                 printf(“%d,%d\n”,&a[1][0],*(a+1)+0);//&a[1][]0],*(a+1)+0代表的列地址                                        ​​​​​​​     这里都是打印出0xa111这样的相同地址



,注意这里的地址是我随便给的


printf(“%d,%d\n”a[2],*(a+2));//a[2]代表的列地址,*(a+2)代表的列地址                                             printf(“%d,%d\n”,&a[2],a+2);//&a[2],a+2都是代表的行地址                                                                 这里都是打印出0x111122这样的地址,

注意这里的地址是我随便给的

printf(“%d,%d\n”a[1][0],*(*(a+1)+0));//这里不是代表的地址,而是值,他们都是打印出9这个数字

printf(“%d,%d\n”,*a[2],*(*(a+2)+0));//这里都是打印出17这个数。


这里的打印与取地址一定要配合上面的这个图分析看。



版权声明:本文为qq_45710392原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。