9、C语言中二维数组及数组名及指向二维数组的指针变量
#include <stdio.h> #include <stdlib.h> //与二维数组相关的指针变量([] 比 *优先级高) //在一般指针变量指向二维数组,或者n维数组,要直接操作a[i][j],对指针的操作必须有两个符号(其中不出现&,如果有&则相应的加上* 的个数): //1、两个* //2、两个[] //3、一个* 一个[] //4、有一个*或[ ]代表数组中某个元素的首地址 //同理n维,或者就是数组中某些地址而不是数组中元素的值 int main() { int arr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};//3行4列,也可以理解成3个长度为4的一维数组组成 int *p1=arr;//arr代表指向首行的首地址. int *p2=*arr;//元素arr[0][0]的首地址. p2=arr[0];p2=*(arr+0); 相当于 &arr[0][0] printf("数组所占字节数:sizeof(arr)=%d\n",sizeof(arr));//数组所占字节数 int i=0,j=0; printf("&arr=%d,arr=%d\n",arr,&arr);//内存地址代表一样。 printf("================\n"); printf("直接利用数组名来操作:\n"); for(i=0;i<3;i++) { //记住:[]的优先级大于* //所有出现*(arr+i)<<==>>arr[i]<<==>>*(arr+i)+0 //所有出现*(arr+i)+j<<==>>arr[i][j]<<==>> printf("第%d行的首地址(相当于&arr[%d]):arr+%d=%d\n",i,i,i,arr+i);//相当于 &arr[i] //第i行了首地址 printf("元素arr[%d][0]的首地址(相当于&arr[%d][0]):*(arr+%d)=%d\n",i,i,i,*(arr+i));//相当于 &arr[i][0] 元素arr[i][0]的首地址 for(j=0;j<4;j++) { printf("元素arr[%d][%d]的首地址(相当于&arr[%d][%d]):*(arr+%d)+%d=%d\n",i,j,i,j,i,j,*(arr+i)+j); printf("元素arr[%d][%d]的值:arr[%d][%d]=%d\n",i,j,i,j,*(*(arr+i)+j)); } printf("================\n"); } //指针p1完全可以和上面一样的完全操作,但p2有自己的方式,可以自增,减 //记住:[]的优先级大于* //所有出现*(p+i)<<==>>p[i]<<==>>*(p+i)+0 //所有出现*(p+i)+j<<==>>p[i][j]<<==>> printf("直接利用指针变量名来操作():\n"); for(i=0,j=1,p2=arr[0];p2<arr[0]+sizeof(arr)/sizeof(int);p2++) { printf("元素arr[%d][%d]的首地址:&arr[%d][%d]=%d\n",i,j-1,i,j-1,p2); printf("元素arr[%d][%d]的值:arr[%d][%d]=%d\n",i,j-1,i,j-1,*p2); if(j%4==0) { i++; j=1; printf("================\n"); } else { j++; } } return 0; }
程序输出结果:
数组所占字节数:sizeof(arr)=48
&arr=2686668,arr=2686668
================
直接利用数组名来操作:
第0行的首地址(相当于&arr[0]):arr+0=2686668
元素arr[0][0]的首地址(相当于&arr[0][0]):*(arr+0)=2686668
元素arr[0][0]的首地址(相当于&arr[0][0]):*(arr+0)+0=2686668
元素arr[0][0]的值:arr[0][0]=1
元素arr[0][1]的首地址(相当于&arr[0][1]):*(arr+0)+1=2686672
元素arr[0][1]的值:arr[0][1]=2
元素arr[0][2]的首地址(相当于&arr[0][2]):*(arr+0)+2=2686676
元素arr[0][2]的值:arr[0][2]=3
元素arr[0][3]的首地址(相当于&arr[0][3]):*(arr+0)+3=2686680
元素arr[0][3]的值:arr[0][3]=4
================
第1行的首地址(相当于&arr[1]):arr+1=2686684
元素arr[1][0]的首地址(相当于&arr[1][0]):*(arr+1)=2686684
元素arr[1][0]的首地址(相当于&arr[1][0]):*(arr+1)+0=2686684
元素arr[1][0]的值:arr[1][0]=5
元素arr[1][1]的首地址(相当于&arr[1][1]):*(arr+1)+1=2686688
元素arr[1][1]的值:arr[1][1]=6
元素arr[1][2]的首地址(相当于&arr[1][2]):*(arr+1)+2=2686692
元素arr[1][2]的值:arr[1][2]=7
元素arr[1][3]的首地址(相当于&arr[1][3]):*(arr+1)+3=2686696
元素arr[1][3]的值:arr[1][3]=8
================
第2行的首地址(相当于&arr[2]):arr+2=2686700
元素arr[2][0]的首地址(相当于&arr[2][0]):*(arr+2)=2686700
元素arr[2][0]的首地址(相当于&arr[2][0]):*(arr+2)+0=2686700
元素arr[2][0]的值:arr[2][0]=9
元素arr[2][1]的首地址(相当于&arr[2][1]):*(arr+2)+1=2686704
元素arr[2][1]的值:arr[2][1]=10
元素arr[2][2]的首地址(相当于&arr[2][2]):*(arr+2)+2=2686708
元素arr[2][2]的值:arr[2][2]=11
元素arr[2][3]的首地址(相当于&arr[2][3]):*(arr+2)+3=2686712
元素arr[2][3]的值:arr[2][3]=12
================
直接利用指针变量名来操作():
元素arr[0][0]的首地址:&arr[0][0]=2686668
元素arr[0][0]的值:arr[0][0]=1
元素arr[0][1]的首地址:&arr[0][1]=2686672
元素arr[0][1]的值:arr[0][1]=2
元素arr[0][2]的首地址:&arr[0][2]=2686676
元素arr[0][2]的值:arr[0][2]=3
元素arr[0][3]的首地址:&arr[0][3]=2686680
元素arr[0][3]的值:arr[0][3]=4
================
元素arr[1][0]的首地址:&arr[1][0]=2686684
元素arr[1][0]的值:arr[1][0]=5
元素arr[1][1]的首地址:&arr[1][1]=2686688
元素arr[1][1]的值:arr[1][1]=6
元素arr[1][2]的首地址:&arr[1][2]=2686692
元素arr[1][2]的值:arr[1][2]=7
元素arr[1][3]的首地址:&arr[1][3]=2686696
元素arr[1][3]的值:arr[1][3]=8
================
元素arr[2][0]的首地址:&arr[2][0]=2686700
元素arr[2][0]的值:arr[2][0]=9
元素arr[2][1]的首地址:&arr[2][1]=2686704
元素arr[2][1]的值:arr[2][1]=10
元素arr[2][2]的首地址:&arr[2][2]=2686708
元素arr[2][2]的值:arr[2][2]=11
元素arr[2][3]的首地址:&arr[2][3]=2686712
元素arr[2][3]的值:arr[2][3]=12
================
Process returned 0 (0x0) execution time : 0.897 s
Press any key to continue.