大家都知道数组名就是数组第一个元素的地址,但是如果不是从数组名中取地址,一切都会这么简单。
有这个数组声明:char array[] = "String";
如果我们写:array
or &array[0]
- 我们得到数组中第一个元素的地址,第一个选项是隐式的,第二个是显式的。
我想嗯,如果我写&array
- 乍一看,没什么奇怪的,地址与 forarray
或相同&array[0]
,但如果我们深入挖掘一点,那就是&array+1
- 我们会看到地址会随着行的长度增加(对我来说这很奇怪,从来没有这个我没有看到它,除了在参数中,当参数是指向特定数量元素数组的指针时,就像现在一样)
我想知道是否有替代此行为的方法 ( &array
)?到目前为止,我已经想到了这种方式:(char (*)[sizeof(array)])array
- 但它是对的吗?
此外,以下行为很有趣:如果我们写,*array
我们将得到一个与唯一的区别是它的地址算法从整个数组下降到单个字符。array[0]
*(&array)
是否可以说在这种情况下它正在将指针重命名为指向字符的指针级别(这种指针降级)?
*(&array)
在您看来,当我们编写时,数组通常会发生什么情况?
类型
array
是char[7]
7 个字符的数组。因此,
&array
是指向 7 个字符的数组的指针。所以,
&array+1
是指向下一个7 个字符数组的指针。好吧,a*(&array)
是一个由 7 个元素组成的数组char
(粗略地说,与 相同array
)。“我认同。” (c) 绒毛
如果你有一个视图指针
然后 1) 该值用于指针算术
sizeof( T )
,以及 2) 取消引用指针给出lvalue
指针指向的位置。例如,如果您有以下代码片段
那么执行表达式后指针的值
++p
将等于在这种情况下,结果指针将指向元素
a[1]
。如果有下一个数组的声明
那么它相当于下面的数组声明
如果您输入 typedef 声明
那么上面数组的声明也可以写成
因此,要声明一个指向该对象的指针,应该这样写
并且,如上所示,对于指针 的指针运算
p
,使用表达式sizeof( T )
,它等于sizeof( char[7] )
。通过取消引用此指针,您将获得
lvalue
一个类型的对象char[7]
这可以通过运行句子轻松检查
这将产生一个值
7
,即类型数组的长度char[7]
。然而,当有一个数组作为在取消引用指针后获得的对象时,它被转换为表达式,极少数例外是指向其第一个元素的指针。
来自 C 标准(6.3.2.1 左值、数组和函数指示符)
因此,对于上面的示例,如果表达式
*p
未用作 operatorsizeof
或 operator的操作数&
,则结果数组将隐式转换为指向其第一个元素的指针。因此,例如,表达式**p
将给出一个类型char
为 value的对象'S'
。