用指针表示二维数组

刚开始的时候看的有点懵了,根本搞不清arr与*arr和arr[0]三者的区别

利用指针定位数组元素也常常出错,于是决定用printf测试一下

下面是测试源码

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int arr[3][4]={1,2,3,4,10,20,30,40,100,200,300,400};
//先测试*arr的值与arr的结果
printf(“*arr=%d arr=%d\n”,*arr,arr);
//从输出的结果可以看出arr数组名里存的是地址
//用*运算符取出的还是地址
//要取arr[0][0]的值可以用*arr[0]来表示
printf(“arr[0][0]=%d\n”,*arr[0]);
//或者用*(*arr)也可以
printf(“arr[0][0]=%d\n”,*(*arr));
//注意不能把*(*arr)写成*arr
printf(“*arr=%d\n”,*arr);
//这一点与1维数组不同*一维数组名取出的是数组[0]元素的值
//假如要取arr[0][2]的值
printf(“arr[0][2]=%d\n”,*arr[0]+2);
//要取arr[0][2]的值还可以用*(*arr+2)表示
printf(“arr[0][2]=%d\n”,*(*arr+2));
//继续分析可以知道*arr[0]就是arr[0][0]元素的值
printf(“arr[0][0]=%d\n”,*arr[0]);
//依次类推*arr[1],*arr[2]分别就是arr[1][0]的值和arr[2][0]的值
printf(“arr[1][0]=%d\n”,*arr[1]);
printf(“arr[2][0]=%d\n”,*arr[2]);
//假如要取arr[2][0]的值可以用*arr[2]也可以用*(*arr+2)
printf(“arr[2][0]=%d=%d\n”,*arr[2],*(*(arr+2)));
//由此可知*(arr+2)=arr[2]的地址
printf(“%p=%p\n”,arr[2],*(arr+2));
//那么要取arr[1][1]的值即可以用*(arr[1]+1)也可以用*(*(arr+1)+1)表示
printf(“arr[1][1]=*(arr[1]+1)=*(*(arr+1)+1)=%d\n”,*(arr[1]+1),*(*(arr+1)+1));
//注意 不要把*(arr[1]+1)写成*arr[1]+1这样的意思是先取arr[1]的值再+1
printf(“*arr[1]+1=%d\n”,*arr[1]+1);//结果是11 并不是20
//总结一下:假如要取arr[i][j]的值 可以用*(数组名[i]+j)也可以用*(*(数组名+i)+j)
//下面用个循环遍历一下数组ARR
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf(“arr[%d][%d]=%3d “,i,j,*(arr[i]+j));
}
printf(“\n”);
}
printf(“\n”);
//下面换一种形式表示
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf(“*(*(arr+%d)+%d)=%3d “,i,j,*(*(arr+i)+j));
}
printf(“\n”);
}
//因为arr[0]指向的是二维数组的arr[0][0]
//因此要遍历数组还可以用以下方法
int* p;
for(p=arr[0];p<arr[0]+12;p++)//arr[0]+12指向的是数组的最后一个元素
{
if((p-arr[0])%4==0){printf(“\n”);}//每移动4个次换行
printf(“%4d”,*p);
}
printf(“\n”);
system(“PAUSE”);
return 0;
}

注意在二维数组中数组名存储的并不是第一个元素arr[0][0]的值所以不能直接用*arr来取arr[0][0]的值

用指针表示二维数组

转载请注明来源:幽幽过客_{用指针表示二维数组}