【问题标题】:What's the difference between array and &array?数组和&数组有什么区别?
【发布时间】:2015-05-12 14:59:47
【问题描述】:

假设

int array[16];

有一种标准的转换叫做数组到指针的转换,所以array会被隐式转换成int*,但是为什么&array等于array呢?

例如,

int array[16];
void *p = array;
void *q = &array;
printf("%p\n", p);
printf("%p\n", q);

这将给出相同的地址并且没有编译错误。

为什么?

【问题讨论】:

标签: c arrays pointers


【解决方案1】:

&array 的类型是 int (*)[16](指向 16 个整数数组的指针)。 array 的类型在衰减时是 int*(指向整数的指针)。它们都指向同一个位置,但对编译器具有不同的含义。

如果你做(&array)[0],你最终得到的值是16个整数的原始数组,你可以再次下标,比如(&array)[0][0](&array)[1] 将是下一个由 16 个整数组成的数组,如果有的话。

如果你做array[0],你最终得到的值是一个整数,你不能再下标。 array[1] 只是下一个整数。 (无论arrayint[16] 还是int*,这都是正确的。)

显然,如果您随后将指针转换为 void 指针,您将失去任何可能存在的语义差异。

【讨论】:

    【解决方案2】:

    这就是 数组名称C 中的行为方式。

    数组变量名代表数组第一个元素的地址。

    所以,

    void *p = array;   //array name, gives address of the  first element.
    

    void *q = &array;  //adress-of-array name, also gives address of the first element
                       // actually &array is of type int (*)[16] which is decayed to int * 
                       // and casted to void * here
    

    P.S. 甚至,FWIW,

     void *r = &array[0]; //address of the first element
    

    也会给你同样的地址。

    这将给出相同的地址并且不会出现编译错误。

    它们确实是相同的值,这里编译器没有什么可尖叫的。

    注意点:一旦将地址分配给空指针,您将丢失与它们关联的类型信息。

    【讨论】:

    • 鉴于&array 的类型为int(*)void *q = &array 是否完全有效?
    【解决方案3】:

    C 中的数组表现为指向内存中第一个元素地址的指针。

    【讨论】:

    • 不完全正确。在大多数情况下,数组名衰减为指向数组中第一个元素的指针,但举个例子:char foo[20] = "bar"; size_t size = sizeof foo;,如果foo 是指针,size 会是 4 或 8,但实际上它将是 20
    • @EliasVanOotegem 感谢您指出这一点,您是正确的
    【解决方案4】:

    因为你在这两行中基本上说的是同一件事:

    void *p = array; // Pointer to array, which is an address
    void *q = &array; // Pointer to reference to an array, which is basically saying "A pointer to the same address as the pointer".
    

    换句话说:

    void *p;
    

    等同于:

    &array;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-21
      • 2016-08-10
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 2013-09-21
      • 2015-08-27
      相关资源
      最近更新 更多