IMB 文档说:“&(地址)运算符生成指向其操作数的指针。操作数必须是左值、函数指示符或限定名称。它不能是位字段”。
微软表示:“一元取址运算符 (&) 返回其操作数的地址(即指向其操作数的指针)。取址运算符的操作数可以是函数指示符或引用对象的左值这不是一个位域。”
很多书上都说:“地址运算符返回对象的地址”。
考虑以下事项:
int x = 10;
&x;
*(&x) = 20;
1) &x 只是一个 int* 指针吗?
2) &x 是否也封装了它引用 int 的信息?我想是这样,因为如果我编译代码并检查汇编代码,我会看到:
这里 movl 正在清除移动 4 个字节,因此是一个 int
3)既然不同的消息来源说 &a 是一个地址,而其他消息来源则说它是一个指针,这是否会导致最终的结论:地址和指针确实是相同的?
1和2:是的,你可以写
char * foo = &x;
,编译器会向你抱怨,因为char *
和int *
是不同的,这表明编译器知道&x
是一个int *
(指向int
)。
3: 这是一个基于意见的问题,取决于您的意思以及您问的对象。通常编译器会将指针实现为存储在某种内存中的地址,但有时它足够聪明,不需要地址,只需在使用指针时直接访问对象即可。
C 中地址 & 运算符返回指针吗?
是的。
既然不同的消息来源说 &a 是一个地址,而其他消息来源则说它是一个指针,这是否会导致最终结论:地址和指针确实相同?
“不同的来源”是不相关的,除非人们想考虑不同的来源可能以不同的方式使用同一个词。如果这是你的想法,那么这个问题就没有意义了。否则,一个来源胜过所有其他来源:C 语言规范。它说,
一元
运算符产生其操作数的地址。如果操作数的类型为“type”,则结果的类型为“指向type的指针”。&
(C23 6.5.3.2/3)
那么,更准确的说法是,一元
&
运算符 的运算结果具有指针类型。由于这是 C 程序可以获得“地址”作为数据的极少数方法之一,因此可以合理地将其理解为定义指针值作为表示地址的值。*(其他方法是数组衰减,函数衰减和动态内存分配,所有这些都类似于 &
产生指针形式的地址。)
只是一个&x
指针吗?int*
鉴于
x
是 int
类型的左值,是的,&x
具有 int *
类型(见上文)。
是否也封装了它所指的是&x
的信息?int
有点。捕获引用类型的是
&x
、int *
的数据类型。这是语言语义的一部分,特别是一元 &
运算符的语义。但是,(一般来说)它不会被编码到 &x
的 value中。
* 但请注意,“指针值代表地址”与“指针是地址”或反之亦然并不完全相同。
C 中地址 & 运算符返回指针吗?
是的,在C语言中,取址运算符(&)用于获取变量的内存地址。当您对变量使用取址运算符时,它会返回指向该变量的内存位置的指针。
例如,考虑以下代码:
#include <stdio.h>
int main() {
int num = 42;
int* ptr = #
printf("Value of num: %d\n", num);
printf("Memory address of num: %p\n", (void*)&num);
printf("Value of ptr: %p\n", (void*)ptr);
return 0;
}
输出:
Value of num: 42
Memory address of num: 0x7ffee5b85a3c (Address will vary)
Value of ptr: 0x7ffee5b85a3c (Address will vary)
上面的代码中,变量num是一个整数,ptr是一个指向整数的指针。通过使用&num,我们获得num变量的内存地址并将其分配给指针ptr。 printf 中的 %p 格式说明符用于以十六进制格式显示内存地址。
因此,总而言之,是的,取址运算符 (&) 返回一个指向应用它的变量的内存位置的指针。
#3 ...地址和指针确实是相同的...?
地址 / 指针 /
int *
就像int
:
通用/实现/类型。