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 *),它也只会警告您错了。 它不会导致任何错误。