数组名、指针、取数组首地址的区别

由于今天与同学讨论这个问题,其中有诸多不解之处,遂查资料并整理之。

数组名并不是常量指针

1.数组名是一个指针常量这种观点来源于数组名在表达式计算中与指针的结果等效性。例如下面的代码:

int a[10], *p = a, *q;
q = a + 1;
q = p + 1;

在效果上看,a + 1与 p + 1是相同的,这很容易给人一种a就是p的假象,但,这仅仅是假象。
a + 1在效果上之所以等同于p + 1,是因为a进行了数组到指针的隐式转换,如果是两个相同的事物,又怎会有转换的过程呢?当把a放在a + 1表达式中时,a已经从一个数组名转换为一个指针,a是作为指针而不是数组名参与运算的;(此处参考https://blog.csdn.net/u014600842/article/details/50805997

2.其次,数组名仅仅是一个符号,不是变量,它没有自己的存储空间,而指针实实在在的是个变量,有自己的空间,很对多人对于数组名就是指针持赞同观点的一个冠冕堂皇的证据是“数组名不能被修改,因为数组名是一个常量指针”,也就是不能执行 a = a+1;这句话对一般,错一半,对的是,数组名确实不能被修改,错的是,不能被修改的原因不是因为数组名是常量指针,而是因为数组名只是一个符号,不是一个变量,因此不能作为一个左值,因此不能被修改(此处参考https://blog.csdn.net/yby4769250/article/details/7294718

array,&array,与数组首地址的区别是什么

  • 一般情况下声明一个数组之后,比如int array[5],数组名array就是数组首元素的首地址(即&array[0]),而且是一个地址常量。但是,在函数声明的形参列表中除外。
  • 在C中, 在几乎所有使用数组的表达式中,数组名的值是个指针常量(隐式转换),也就是数组第一个元素的地址。 它的类型取决于数组元素的类型: 如果它们是int类型,那么数组名的类型就是“指向int的常量指针“。——《C和指针》(PS:这里说数组名是常量指针不妥,作者想要让读者理解更为容易,所以才这么说)

  • 在以下两种场合下,数组名并不是用指针常量来表示,就是当数组名作为sizeof操作符和单目操作符&的操作数时。 sizeof返回整个数组的长度,而不是指向数组的指针的长度。 取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量的指针。所以&a后返回的指针便是指向数组的指针,跟a(一个指向a[0]的指针)在指针的类型上是有区别的。——《C和指针》

  • “+1”就是偏移量问题:一个类型为T的指针的移动,是以sizeof(T)为移动单位
    根据下面参考链接中的博主试验,得出以下结论:array与&array的地址相同,但意义不同。array+1与&array+1的不同印证了这个结论。(下面array与&array的初始地址为0012FF34)
    即array+1:在数组首元素的首地址的基础上,偏移一个sizeof(array[0])单位。此处的类型T就是数组中的一个int型的首元素。由于程序是以16进制表示地址结果 0012FF34 + 1 * sizeof(array[0]) = 0012FF34 + 1 * sizeof(int) = 0012FF38。即&array+1:在数组的首地址的基础上,偏移一个sizeof(array)单位。此处的类型T就是数组中的一个含有5个int型元素的数组。由于程序是以16进制表示地址结果,&array+1的结果为0012FF34 + 1 * sizeof(array) = 0012FF34+1 * sizeof(int) * 5 = 0012FF48。注意 1 * sizeof(int) * 5(等于00000014)要转换成16进制后才能进行相加。
    参考https://blog.csdn.net/jingzi123456789/article/details/66478310
    其中作者用试验验证并详细阐释了&array与array的区别,并解释了&array+1与array+1的地址为什么不同(&array与array的地址相同)

最后引用论坛中的一句话

指针就是指针,数组名就是数组名,只不过二者之间有相同的使用而已

参考资料

https://blog.csdn.net/jingzi123456789/article/details/66478310
https://blog.csdn.net/yby4769250/article/details/7294718
https://blog.csdn.net/u014600842/article/details/50805997

猜你喜欢

转载自blog.csdn.net/weixin_41223818/article/details/80657087