我正试图掌握C中的指针,并且正在努力理解为什么我会得到一个奇怪的输出。
我的代码是:
int main(){
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;
}
我得到的输出是:
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;
这似乎显示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
但肯定这不正确?
答案 0 :(得分:4)
从更简单的事情开始,比如
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
视为pointer to an int
,而&b
则为pointer to an array of 5 ints
。因此,向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
答案 1 :(得分:1)
数组名称相当于指向数组第一项的指针:arr == &arr[0]
您的a
是二维数组,因此a[0]
或a[2]
是一维数组,
因此a[2] == &a[2][0]
。
答案 2 :(得分:1)
如果使用数组的标识符,在大多数情况下它会衰减到指向第一个元素的指针。
所以
int a[3][6];
&a
是int (*)[3][6]
,因此sizeof(*&a)
将为18 * sizeof(int)
。a
和&a[0]
都是int (*)[6]
,因此sizeof(*a)
和sizeof(*&a[0])
将为6 * sizeof(int)
。a[0]
和&amp; a [0] [0]均为int *
,因此sizeof(*a[0])
和sizeof(*&a[0][0])
将为6 * sizeof(int)
。(请注意,*&
表达式中sizeof
的所有出现都可以被优化掉;我将它们留在这里以便更好地理解。)
但是所有提到的指针都指向同一个位置。
始终注意指针由地址和类型(长度)组成,两者都是相关的。