二维数组指针问题

时间:2014-01-20 16:43:18

标签: arrays pointers

我试图理解C中的2D数组的指针算法。

void pmanipulation(int arr[][5],int rows)
{
printf("arr=%d  arr+1=%d  *(arr)=%d *(arr+1)=%d\n",arr,arr+1,*(arr),*(arr+1));
}

在上面的小代码片段中,我观察到arr + i和*(arr + i)打印的值显然没有区别。为什么会这样?我知道在C arr +中我会给出2D矩阵的第i行的基地址,但不应该*(arr + i)是该地址的打印元素吗?

由于

1 个答案:

答案 0 :(得分:0)

让我们考虑一下这个简单的程序:

#include <stdio.h>

void main(){
    int i,j;
    int a[3][5];
    for(i=0;i<3;i++){
        for(j=0;j<5;j++){
            a[i][j]=i*10+j;
        }
    }
    printf("a=%d a+1=%d *(a)=%d *(a+1)=%d\n", a, a+1, *(a), *(a+1));
}

使用gcc编译时,你得到:

test.c: In function 'main':
test.c:11:2: warning: format '%d' expects argument of type 'int', but argument 2 has type 'int (*)[5]' [-Wformat]
test.c:11:2: warning: format '%d' expects argument of type 'int', but argument 3 has type 'int (*)[5]' [-Wformat]
test.c:11:2: warning: format '%d' expects argument of type 'int', but argument 4 has type 'int (*)' [-Wformat]
test.c:11:2: warning: format '%d' expects argument of type 'int', but argument 5 has type 'int (*)' [-Wformat]

您会注意到*(a+1)仍然是指针。由于这是一个二维数组,因此需要进行双重去引用才能获得值**(a+1)