我所阅读的关于地址运算符&
的大部分内容都表示它已经习惯了这一点 - 一个地址。我最近听到它的描述不同,因为它产生了一个完整的指针。
给出以下C代码,
int i1 = 5;
int *p1;
p = &i1;
我的理解是p1
通过存储5
数据存储的地址来引用int i1
,并记住要解释该位置的数据作为int
(指示要读取多少字节以及如何解释读取数据)。
地址运算符是否同时产生地址和" type-awareness",或者只是隐式的类型感知,因为p1
被声明为int
指针?
让我感到疑惑的一件事就是看到代码:
void myFunc(int *ptr);
int i = 5;
myFunc(&i);
答案 0 :(得分:3)
虽然您确定int*
的类型为int
,但我认为您过分重视这个想法。我不会在C中描述任何类型"类型感知"并且肯定没有"记住该位置的数据将被解释为类型union something {
int a;
char b;
};
"。 C类型仅存在于源级别,而不是在编译之后。
在使用union的示例中,这可能更清楚:
x
现在,如果您的变量something
类型为&x.a
,则可以int*
类型为&x.b
且类型为char*
的{{1}} ,但他们指的是同一个地址。
答案 1 :(得分:3)
&
运算符只返回指向其操作数的指针。如果其操作数为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
计算的偏移量为struct test
{{ 1}} S上。
答案 2 :(得分:0)
变量i1
的类型为int
,因此表达式&i1
采用int
的地址,产生int *
类型的表达式。然后将此表达式分配给p1
,int *
类型为p1
。
所以现在i1
指向*p1
的内存位置,因此表达式5
将为*** 12
*** 12 driverForGraphClustering: ompp_regstat.c:870: void regstat_on_enter(regstat_t*, ompp_reg_type_t, unsigned int, int): Assertion `0' failed.
*** 12 Aborted (core dumped)
。
答案 3 :(得分:-3)
C. C中没有类型意识不检查类型安全性。即使您指定了一些不正确的地址(例如&amp; char到int *),它也只会警告您错了。它不会导致任何错误。