您的位置:首页 > 其它

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

2017-12-01 13:10 387 查看
上图:



从输出来看。
第一行跟第二行结果一样。第一行的 &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 的大小。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐