C:地址运算符 (&) 产生一个指针(地址 + 类型)还是只是一个地址?

C: Does the address operator (&) produce a pointer (address + type) or just an address?

我读到的关于地址运算符 & 的大部分内容都说它用于获取地址。不过,我最近听说它的描述有所不同,因为它生成了一个成熟的指针。

给定以下 C 代码,

int i1 = 5;
int *p1;

p = &i1;

我的理解是 p1 通过存储存储 i1 数据的地址来引用 int 5 并记住该位置的数据将被解释为int(指示要读取多少字节以及如何解释读取的数据)。

地址运算符是否同时产生地址和 "type-awareness",或者类型意识只是隐含的,因为 p1 被声明为 int 指针?

让我对此感到疑惑的一件事是看到如下代码:

void myFunc(int *ptr);

int i = 5;
myFunc(&i);

虽然您认为 &i1 的类型是 int* 是对的,但我认为您对这个想法的重视程度过高。我不会将 C 中的任何内容描述为 "type-awareness",而且绝对没有 "remembering that the data in that location is to be interpreted as type int"。 C 类型仅存在于源代码级别,编译后不存在。

这在联合示例中可能更清楚:

union something {
    int a;
    char b;
};

现在,如果您有一个类型为 something 的变量 x,您可以有类型为 int*&x.a 和类型为 [=19] 的 &x.b =],但他们指向同一个地址。

变量 i1 的类型为 int,因此表达式 &i1 采用 int 的地址,产生类型为 int * 的表达式。然后将此表达式分配给 p1,它也是 int *.

类型

所以现在 p1 指向 i1 的内存位置,所以表达式 *p1 将是 5.

& 运算符只是 returns 指向其操作数的指针。如果其操作数是 int,则结果类型将为 int*。如果其操作数是 int*,则结果类型将为 int**。例如这个程序:

#include <stdio.h>

struct test {
  int a;
  int b;
  int d;
};

int main ( ) { 
    struct test foo = { 0, 0, 0 } ; 
    printf( "%lu\n", (unsigned long)(&foo + 2) - (unsigned long)&foo );
}

在我的机器上输出24,因为sizeof(struct test)是12,而&foo的类型已知是struct test *,所以&foo + 2计算的偏移量是2 struct tests.