为什么这个指针似乎指向自己?

时间:2014-05-04 11:19:32

标签: c pointers multidimensional-array

我正试图掌握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但肯定这不正确?

3 个答案:

答案 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];
  • &aint (*)[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的所有出现都可以被优化掉;我将它们留在这里以便更好地理解。)

但是所有提到的指针都指向同一个位置。

始终注意指针由地址和类型(长度)组成,两者都是相关的。