二维数组名代表什么_数组名和取数组名地址的区别

我在正在学习C语言,对于数组名和数组名取地址的区别,我感到有点迷惑。我想尝试用自己的理解去剖析理解。

  1. 首先我们先上程序

a89d23f6a9b9776fe7ec1d079b89c491.png

接下来我们看一下结果:(本结果是运行环境是win10用codeblocks)

d9fb1d0edf75b085c65f6bb21c059aa9.png

通过上面的运行结果可以看出

  • arr 和&arr和&arr[0]的地址是一样的,看起来arr和&arr并没有什么不同
  • arr 和 arr+1的地址相差sizeof(int)4个字节,这是指针的步长这并不难理解
  • 通过上图我们可以看到&arr[4]=FEFC(为了简洁省略前面的值,方便观察) &arr+1=FF00
  • &arr[4]代表第5个元素的首地址,那么这个数组末尾的地址就是FEFC+4=FF00

d46ffc747f80974c789155aa12b84904.png

第5个元素的末尾地址刚好是&arr+1的值,&arr+1就是直接指向了数组的最后,也就是说&arr+1刚好跨过=元素个数*sizeof(int),

这里(元素个数是5)*(sizeof(int)=4)=20=0x14

arr的首地址是 FEEC +0X14=FF00

dfcb7ac905c5e35afe00cd8c2555efeb.png
  • 到这里我们似乎得出结论arr+1是在数组内进行移动,每次移动大小是元素类型的大小,数组名个数组arr[0]是等价的。
  • 如果们先进行&arr+1操作,那么就是每次移动大小是整个数组的大小也就是sizeof(arr);
  • 我们到这里应该似乎明白了这两个的区别:若是对数组名进行取地址(&)操作,每次移动就是整个数组的大小,移动后指向数组末尾地址。;若不对数组名取地址那么移动就是sizeof(类型);
  • 他俩的移动长度不一样那么类型肯定也就不一样,这是从目前结果合理的推断。一个是指向数组末端,一个是数组首端,同一数组内指针地址按道理是可以相减的,但是当我运行下面这个打印操作的时候编译器进行了报错。

75186d30ed035417434a7b3ba9f0f047.png

报错:

E:Codeblocklearntestmain.c|18|error: invalid operands to binary - (have 'int (*)[5]' and 'int *')|

这个错误告诉我们-号两边的类型是不一样的,这似乎就是这个问题的根源

&arr+1类型是int(*)[5]; &arr的类型是int*类型

我们知道()的优先级是最高,我们要把括号里的内容(*p)看成一个整体,其实就是一个数组,只不过这个数组的地址给了p,也就是p指向这个数组。所以这是定义”数组的指针“

int * p可以写成int *(p[ ]),如果把p[ ]看成一个整体,则可以发现其实就是定义一个指针,这个指针指向某个地方,再看个体,其实就是一个全是指针的数组。所以这是定义”指针数组“

到这里我们可以得出结论 &arr +1 和arr 归根到底是类型的不同,前者是数组的指针后者是指针的数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值