关于数组名的值,地址,表示以及强转等,有些绕的问题

上图:

从输出来看。

第一行跟第二行结果一样。第一行的 &arr,在编译器看来代表的就是整个数组的地址,所以,它的加1时,加的大小是整个数组的大小。然后第二行的 指针 p 就是 &arr,此处的关键点是:声明指针 p 时,需要声明个 指向数组的指针,因为 &arr 这个指针就是 指向包含20个char类型元素 的指针,所以 p 的声明为:char (*p)[20]。

第三行,就是把 &arr 强转成了 指向字符的指针了,所以它在加1时,加的就是一个 char 类型的大小,即 1。

第四行第五行结果也一样。第四行的 arr 指的就是数组的首元素(arr[0]),arr 就是 arr[0] 的地址,所以 arr 跟 &arr[0] 效果一模一样。加1时都是加一个char类型的大小,即 1。

第六行到第七行,地址都不一样,但规律都一样...就是指针的加法。&p、&p1、&p2、&p3,都是指向指针的指针,p、p1、p2、p3都是新建的变量,所以地址肯定不一样,然后他们各自加1,就是在自己的地址上加4个字节(×86上的指针就是4个字节)了。

容易迷糊的点:arr 跟 &arr 为啥一样,因为在编译器看来,前面这个 arr 表示的就是个指针,指向数组首元素的地址;而后面的 arr,因为加了取址符(&),所以在编译器看来,它表示的就是整个数组,所以 &arr,表示的就是整个数组的地址,也就是 数组首元素的地址,并不是 数组首元素的地址的地址! 所以可以这么说:此 arr 非彼 arr。

所以再多说个总结:只有两种情况,arr表示的才是整个数组:一种就是给arr取地址,即&arr,此时的arr表示的就是整个数组,虽然它的值跟arr的值一样,但此arr非彼arr,证据就是给 &arr 和 arr 加1,俩加的大小不一样;另一种表示整个数组的情况是 sizeof(arr),即求数组 arr 的大小。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值