C:地址运算符 (&) 是生成指针(地址 + 类型)还是仅生成地址?

iva*_*van 2 c pointers memory-address

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

鉴于以下 C 代码,

int i1 = 5;
int *p1;

p = &i1;
Run Code Online (Sandbox Code Playgroud)

我的理解是通过存储存储数据的地址来p1引用 int并记住该位置中的数据将被解释为 an (这决定了要读取的字节数以及如何解释读取的数据)。5i1int

地址运算符是否同时产生地址和“类型感知”,或者类型感知是否只是隐含的,因为它p1被声明为int指针?

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

void myFunc(int *ptr);

int i = 5;
myFunc(&i);
Run Code Online (Sandbox Code Playgroud)

Pau*_*aul 6

&操作员只需返回一个指向它的操作数。如果其操作数是 ,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 );
}
Run Code Online (Sandbox Code Playgroud)

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