地址和运算符是否在C语言中返回指针?

Does the address & operator return a pointer in C?

提问人:alessio solari 提问时间:7/29/2023 更新时间:7/30/2023 访问量:122

问:

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是地址,而其他来源说它是指针,这是否最终得出地址和指针确实相同的结论?

C 指针内存 地址

评论

1赞 alessio solari 7/29/2023
来自丹尼斯·里奇(Dennis Ritchie)手册:“一元&运算符获取其操作数的地址。操作数必须是一个 I值,既不指代位域,也不指代声明为 r e g i s t e r 的对象,或者必须是函数类型。结果是指向 Ivalue 引用的对象或函数的指针。如果操作数的类型为 T,则结果的类型为“指向 T 的指针”。这是给所有一直说 &x 不是指针的人
1赞 David Grayson 7/29/2023
地址和指针是否是一回事的问题非常基于意见。这是一个关于软件开发的客观问题的网站,所以你应该试着根据程序的行为、编译器的行为或C标准来构建你的问题。
0赞 alessio solari 7/29/2023
David Grayson,这绝对是一个关于软件开发的问题,因为如果你不知道C语言中的指针,你就对它一无所知。至于它是基于意见的事实,它不是。C 的创造者的 C 圣经实际上说 &x 是 INT* 类型的指针。没有进一步的“意见”。请参阅附录 A,位于 Brian Kernighan 和 Dennis Ritchie 合著的“The C Programming Language”的 A7.4.2 点。软件不是哲学,而是科学,它要么是 0,要么是 1。暂无意见
1赞 chux - Reinstate Monica 7/29/2023
“要么是0,要么是1。” -->让我想起了“有三种人:那些把事情分成两组的人和那些不分的人。
0赞 David Grayson 7/29/2023
阿莱西奥,你只是在和我争论,谈论指针,但你没有讨论地址,你没有澄清你在第 3 点问的问题。如果有人花时间写下#3的答案,你会用什么标准来判断它?请记住,“地址”在英语中是非常笼统的术语。与其问“A和B是否确实是一样的”的哲学问题,不如试着问一些客观的问题。

答:

0赞 David Grayson 7/29/2023 #1

1 和 2:是的,你可以写,编译器会向你抱怨,因为和是不同的,表明编译器知道是一个(指向一个的指针)。char * foo = &x;char *int *&xint *int

3:这是一个基于意见的问题,取决于你的意思和你问谁。通常,编译器会将指针实现为存储在某种内存中的地址,但有时它足够智能,不需要地址,并且可以在使用指针时直接访问对象。在这种情况下,对象甚至可能没有地址(例如,如果它存储在单个 CPU 寄存器中)。

1赞 chamanswami 7/29/2023 #2

地址和运算符是否在C语言中返回指针?

是的,在 C 语言中,地址运算符 (&) 用于获取变量的内存地址。当您对变量使用 address-of 运算符时,它会返回指向该变量的内存位置的指针。

例如,请考虑以下代码:

#include <stdio.h>

int main() {
    int num = 42;
    int* ptr = &num;

    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 运算符 (&) 返回指向应用它的变量的内存位置的指针。

3赞 John Bollinger 7/29/2023 #3

地址和运算符是否在C语言中返回指针?

是的。

由于不同的消息来源说 &a 是地址,而其他消息来源说它是指针,这是否会导致地址和指针确实相同的最终结论?

“不同的来源”是无关紧要的,除非人们想考虑到不同的来源可能以不同的方式使用同一个词。如果这是你的思路,那么这个问题就毫无意义了。否则,一个来源胜过所有其他来源:C 语言规范。它说,

一元运算符产生其操作数的地址。如果操作数的类型为“type”,则结果的类型为“pointer to type”。&

(C23 6.5.3.2/3)

因此,更准确地说,一元运算符的运算结果具有指针类型。由于这是 C 程序可以获取“地址”作为数据的极少数方法之一,因此将其理解为将指针值定义为表示地址的值是合理的。* (其他方式是数组衰减、函数衰减和动态内存分配,所有这些都类似于以指针的形式生成地址。&&

只是一个指针吗?&xint*

给定是 type 的左值,是的,具有类型(见上文)。xint&xint *

是否还封装了它所引用的信息?&xint

算是吧。捕获引用类型的数据类型是 , 。这是语言语义的一部分,尤其是一元运算符。但是,它(通常)不会编码为 的&xint *&&x


*但是请注意,说“指针值表示地址”与说“指针地址”并不完全相同,反之亦然

-1赞 chux - Reinstate Monica #4

#3 ...地址和指针确实是一样的......?

地址/指针/像
/整数/:
int *int

泛型/实现/类型。