【问题标题】:C: Does the address operator (&) produce a pointer (address + type) or just an address?C: 地址操作符 (&) 是产生一个指针(地址 + 类型)还是只是一个地址?
【发布时间】:2016-01-10 04:37:43
【问题描述】:

我读过的关于地址运算符& 的大部分内容都说它只是用来获取地址的。不过,我最近听说它以不同的方式描述为产生一个成熟的指针。

给定以下 C 代码,

int i1 = 5;
int *p1;

p = &i1;

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

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

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

void myFunc(int *ptr);

int i = 5;
myFunc(&i);

【问题讨论】:

    标签: c pointers memory-address


    【解决方案1】:

    & 运算符只返回一个指向其操作数的指针。如果其操作数是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,而 &amp;foo 的类型已知是 struct test *,所以 &amp;foo + 2 计算两个 struct tests 的偏移量。

    【讨论】:

      【解决方案2】:

      虽然&amp;i1 的类型是int* 是正确的,但我认为您对这个想法的重视程度过高。我不会将 C 中的任何内容描述为“类型感知”,并且绝对没有“记住该位置中的数据将被解释为类型 int”。 C 类型仅存在于源代码级别,编译后不存在。

      这在联合的例子中可能更清楚:

      union something {
          int a;
          char b;
      };
      

      现在如果你有一个something 类型的变量x,你可以有int* 类型的&amp;x.a&amp;x.b 类型char*,但它们指向同一个地址。

      【讨论】:

      • 我认为类型是预编译概念的理解将在这里帮助我。这很有帮助 - 谢谢!
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-10
        相关资源
        最近更新 更多