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

本文深入探讨了二维数组与指针的关系,指出二维数组名加[]或*代表行指针,加两个[]或**代表元素。通过实例展示了*a、a[i]、&a[i]等表达式的含义,解释了它们在内存布局中的位置。同时,通过printf语句演示了不同指针和数组操作在输出地址和值上的表现。
摘要由CSDN通过智能技术生成

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

这里开始补充一点知识(二维数组名也是一个指针常量

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

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这个数。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值