C:地址运算符(&)是否产生指针(地址+类型)或地址?

我读到的关于地址运算符的大部分内容都用来表示它 – 一个地址。 我最近听到它的描述不同,因为它产生了一个完整的指针。

鉴于以下C代码,

 int i1 = 5; int *p1; p = &i1; 

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

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

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

 void myFunc(int *ptr); int i = 5; myFunc(&i); 

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

 #include  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计算两个struct test的偏移量。

虽然你说&i1的类型是int*是正确的,但我认为你给这个想法分配了太多的重量。 我不会将C中的任何内容描述为“类型感知”,并且肯定没有“记住该位置中的数据将被解释为类型int ”。 C类型仅存在于源级别,而不是在编译之后。

在使用union的示例中,这可能更清楚:

 union something { int a; char b; }; 

现在,如果你有类型的变量x ,你可以使用类型为int* &x.b和类型为char* &x.b ,但它们指向相同的地址。

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

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

C. C中没有类型意识不检查类型安全性。 即使您分配了一些不正确的地址(例如&char到int *),它也只会警告您错了。 它不会导致任何错误。