我试图理解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)是该地址的打印元素吗?
由于
答案 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)
。