关于数组名的值,地址,表示以及强转等,有些绕的问题
2017-12-01 13:10
387 查看
上图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/10/f66bc16b038ae040234d1f8ede7a7233)
从输出来看。
第一行跟第二行结果一样。第一行的 &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 的大小。
从输出来看。
第一行跟第二行结果一样。第一行的 &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 的大小。
相关文章推荐
- 关于数组以及c#学习问题
- java笔记:关于复杂数据存储的问题--基础篇:数组以及浅拷贝与深拷贝的问题(上)
- 关于数组地址问题
- 关于动态存储分配函数的调用,在已经过排序的数组中查找及删除内容的操作,余数的分析,删除字符数组中的空格,对链表的逆置,在源字符串中查找子字符串的个数,函数指针以及函数的调用,循环赋值带来的问题以及插入
- 关于浮点数的小数部分的二进制表示、精度以及浮点数如何在内存中存放问题
- 关于将数组地址赋给指针的问题
- 关于数组地址的问题
- 关于复杂数据存储的问题--基础篇:数组以及浅拷贝与深拷贝的问题
- 关于复杂数据存储的问题--基础篇:数组以及浅拷贝与深拷贝的问题(上)
- 关于对数组名取地址的问题
- 关于复杂数据存储的问题--基础篇:数组以及浅拷贝与深拷贝的问题(下)
- 关于数组两个元素地址相减的问题
- 关于取地址运算符&以及指针的问题
- 数组名、数组名取地址以及作为函数传递带来的问题
- 关于在C/C++语言中,函数如何返回数组,数组如何作为参数传递以及返回数组的函数该如何调用问题的总结
- 关于数组以及函数的一些问题与解答
- [笔记]关于split的数组越界问题以及java.lang.ArrayIndexOutOfBoundsException异常
- java笔记:关于复杂数据存储的问题--基础篇:数组以及浅拷贝与深拷贝的问题(上)
- 关于字符串,字符数组 ,局部和全局地址分配问题
- java笔记:关于复杂数据存储的问题--基础篇:数组以及浅拷贝与深拷贝的问题(下)