在多维数组中,为什么再次引用行的地址会导致地址而不是值

los*_*ika 2 c pointers multidimensional-array

#include <stdio.h>

void main() {
    int a[4][3] = {
        { 3, 5, 7 },
        { 2, 4, 67 },
        { 21, 8, 9 },
        { 2, 45, 6 }
    };
    printf("%u ", *(&a[0]+1));
}
Run Code Online (Sandbox Code Playgroud)

表达式(&a[0]+1)给出&a[1]和输出应该是2但上面代码的输出是&a[1]为什么?这可能看起来很傻,但请帮助我.

Eri*_*hil 5

你注意到的&a[0]+1&a[1].a[1]是3的数组,3的数组的地址也是int如此.&a[1]int

这意味着*&a[1]是一个3的数组int.在C中,数组自动转换为其第一个元素的地址(除非它是sizeof一元的操作数&,_Alignof或者是用于初始化数组的字符串文字).所以*&a[1]自动成为&a[1][0].

由于这是一个指针,因此不应该打印%u.打印它的正确方法是:

printf("%p\n", (void *) *(&a[0]+1));
Run Code Online (Sandbox Code Playgroud)

但是,鉴于你确实使用过%u,似乎发生的事情是程序打印指针的值被重新解释为unsigned int.这不是你应该依赖的行为.

  • @ChristianGibbons:C 2011(草案N1570)6.5.3.2 3说`&*something`被视为`something`,除了约束仍然适用且结果不是左值.但我没有看到类似的声明`*&something`.并且`*&a [1]`没有出现在代码中;它只是一种谈论表达式评估的方式. (2认同)