提问人:alessio solari 提问时间:7/29/2023 更新时间:7/30/2023 访问量:122
地址和运算符是否在C语言中返回指针?
Does the address & operator return a pointer in C?
问:
IMB文档说:“&(地址)运算符产生指向其操作数的指针。操作数必须是左值、函数指示符或限定名。它不能是位字段”。
Microsoft说:“一元地址运算符(&)返回其操作数的地址(即指向的指针)。address-of 运算符的操作数可以是函数指示符,也可以是引用非位字段的对象的左值。
很多书都说:“地址运算符返回对象的地址”。
请考虑以下几点:
int x = 10;
&x;
*(&x) = 20;
1)&x 只是一个 int* 指针吗?
2)&x 是否也封装了它所引用的 int 的信息?我想是这样,因为如果我编译代码并检查汇编代码,我会看到:
- MOVL $10, -4(%RBP)
- MOVL $20, -4(%RBP)
这里 movl 正在清除移动的 4 个字节,所以一个 int
3)由于不同的来源说&a是地址,而其他来源说它是指针,这是否最终得出地址和指针确实相同的结论?
答:
1 和 2:是的,你可以写,编译器会向你抱怨,因为和是不同的,表明编译器知道是一个(指向一个的指针)。char * foo = &x;
char *
int *
&x
int *
int
3:这是一个基于意见的问题,取决于你的意思和你问谁。通常,编译器会将指针实现为存储在某种内存中的地址,但有时它足够智能,不需要地址,并且可以在使用指针时直接访问对象。在这种情况下,对象甚至可能没有地址(例如,如果它存储在单个 CPU 寄存器中)。
地址和运算符是否在C语言中返回指针?
是的,在 C 语言中,地址运算符 (&) 用于获取变量的内存地址。当您对变量使用 address-of 运算符时,它会返回指向该变量的内存位置的指针。
例如,请考虑以下代码:
#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 格式说明符用于以十六进制格式显示内存地址。
因此,总而言之,是的,address-of 运算符 (&) 返回指向应用它的变量的内存位置的指针。
地址和运算符是否在C语言中返回指针?
是的。
由于不同的消息来源说 &a 是地址,而其他消息来源说它是指针,这是否会导致地址和指针确实相同的最终结论?
“不同的来源”是无关紧要的,除非人们想考虑到不同的来源可能以不同的方式使用同一个词。如果这是你的思路,那么这个问题就毫无意义了。否则,一个来源胜过所有其他来源:C 语言规范。它说,
一元运算符产生其操作数的地址。如果操作数的类型为“type”,则结果的类型为“pointer to type”。
&
(C23 6.5.3.2/3)
因此,更准确地说,一元运算符的运算结果具有指针类型。由于这是 C 程序可以获取“地址”作为数据的极少数方法之一,因此将其理解为将指针值定义为表示地址的值是合理的。* (其他方式是数组衰减、函数衰减和动态内存分配,所有这些都类似于以指针的形式生成地址。&
&
只是一个指针吗?
&x
int*
给定是 type 的左值,是的,具有类型(见上文)。x
int
&x
int *
是否还封装了它所引用的信息?
&x
int
算是吧。捕获引用类型的数据类型是 , 。这是语言语义的一部分,尤其是一元运算符。但是,它(通常)不会编码为 的值。&x
int *
&
&x
*但是请注意,说“指针值表示地址”与说“指针是地址”并不完全相同,反之亦然。
#3 ...地址和指针确实是一样的......?
地址/指针/像
值/整数/:int *
int
泛型/实现/类型。
评论