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

时间:2016-01-10 04:37:43

标签: c pointers memory-address

我所阅读的关于地址运算符&的大部分内容都表示它已经习惯了这一点 - 一个地址。我最近听到它的描述不同,因为它产生了一个完整的指针。

给出以下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);

4 个答案:

答案 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 *类型的表达式。然后将此表达式分配给p1int *类型为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 *),它也只会警告您错了。它不会导致任何错误。