c语言二维数组调用给指针时,C语言,二维数组时候的指针

int iArr[3][3] ={{1,2,3},{4,5,6},{7,8,9}};

printf("%d/n",iArr);//2280752

printf("%d/n",iArr[0]);//2280752

printf("%d/n",*iArr[0]);//1

printf("%d/n",*(iArr[1]));//4

printf("%d/n",(iArr+1));//2280764

printf("%d/n",*(iArr+1));//2280764

printf("%d/n",*(*(iArr+1)));//4

printf("%d/n",&iArr[0]);//2280752

printf("%d/n",*(&iArr[0]));//2280752

个人理解

在多维数组中,* 一般是指向列的地址,而 & 指向行的地址。

何谓指向列的地址:

在定义数组时,我们肯定已经定义了数组的类型,比如int。iArr[0]是0行的首地址。

当用*iArr[0]的时候,编译器会根据首地址开始,查找2个字节大小的内存,等于是调用a[0][0]。

何谓指向行的地址:

iArr[0]是0行的首地址,当调用&iArr[0],它虽然返回的首地址和iArr[0]一样,

但它已经从指向列传为指向行了。调用*(&iArr[0]),编译器是把整行(在本列中是3个int的大小)

作为一个元素。所以*(&iArr[0])仍然取出的是首地址。

根据例子,可以这么说,指向列就是当知道一个首地址后,调用*,编译器将取的内存大小一个int型2个字节;

指向列就是当知道一个首地址后,调用*,编译器将取的内存大小6个字节(int a[3]),因为iArr是一个3*3的大小。

iArr[1]和iArr+1,它们指向的首地址虽然相同,但是代表的意义不一样。

iArr[1]是指向列的。iArr+1是指向行的。*iArr[1]取出的是iArr[1][0]的值。而*(iArr+1)实际上

只是把指向行转为指向列。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值