我正在尝试掌握 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/