c - 为什么这个指针看起来指向它自己?

标签 c pointers multidimensional-array

我正在尝试掌握 C 中的指针,并且正在努力理解为什么我会得到一个奇怪的输出。

我的代码是:

int main(){<p></p>

<pre><code>int a[3][6];
int i,j,k = 0;

for(i = 0; i < 3; i++){
    for (j = 0; j < 6; j++) {
        a[i][j] = k++;
    }
}

int c = 5;
int *p = &c;
printf("address of p = %p\n",&p);
printf("p = %p\n",p);
printf("address of c = %p\n",&c);

printf("address of a[2] = %p\n", &a[2]);
printf("address of a[2][0] = %p\n", &a[2][0]);
printf("a[2] = %p\n", a[2]);
printf("a[2][0] = %d\n",a[2][0]);

return 0;
</code></pre>

<p>}</p>

我得到的输出是:

address of p = 0x7fff6cbabf88
p = 0x7fff6cbabf90
address of c = 0x7fff6cbabf90
address of a[2] = 0x7fff6cbabf70
address of a[2][0] = 0x7fff6cbabf70
a[2] = 0x7fff6cbabf70
a[2][0] = 12

这似乎表明 a[2] == &a[2] 但这肯定不正确吗?

最佳答案

从更简单的开始,像这样

int main( void )
{
    int b[5];

    printf( "b      = %p\n", b      );
    printf( "&b     = %p\n", &b     );

    printf( "b+1    = %p\n", b+1    );
    printf( "(&b)+1 = %p\n", (&b)+1 );
}

编译器将 b 视为一个 指向 int 的指针,而 &b 是一个 指向 5 个 int 的数组的指针。因此,向 b 加 1 会将地址更改为 4(假设为 32 位 int),而向 &b 添加 1 会将地址更改为十进制数 20。


一旦你理解了这一点,你就可以用 a[3][6] 数组把自己搞砸了。

a        is a pointer to     int [6]
a[i]     is a pointer to     int
a[i][j]  is an int

&a       is a pointer to     int [3][6]
&a[i]    is a pointer to     int [6]
&a[i][j] is a pointer to     int

关于c - 为什么这个指针看起来指向它自己?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23455604/

相关文章:

从输入文件创建 3D 阵列?

c - 使用管道复制字符串

c - 无法将 linux 程序的输出存储到文件中

c - 是否可以在 C 中 printf 数组第一个元素的内存地址?

c - c实现链表添加节点时出现段错误

使用 ARM 编译器时的 C 死代码检测

c++ - 初始化数组的数组 - 问题

java - "NewStringUTF"是指向函数的指针吗?或功能?

c++ - 函数指针不是函数或函数指针

javascript - 如何在javascript中将零填充到我的多维数组中?