C|二维数组与行指针、列指针

二维数组可以看成由多个长度相同的一维数组组合而成。可以由多个一级指针变量指向每一行,再由一个二级指针指向这些一级指针变量,从而实现分层管理。

1行指针

(){inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};int**p=(int**)a;int(*q)[4]=a;int(*t)[1]=(int(*)[1])a;int*m=a[1][1];printf("%d,%d\n",p,p+1);//1244952,1244956printf("%d,%d\n",q,q+1);//1244952,1244968printf("%d,%d\n",t,t+1);//1244952,1244956printf("%d,%d\n",*p,*(p+1));//1,2printf("%d,%d\n",*q,*(q+1));//1244952,1244968printf("%d,%d\n",*t,*(t+1));//1244952,1244956printf("%d,%d\n",sizeof(*q),sizeof(*(q+1)));//16,16printf("%d,%d,%d,%d\n",**q,**(q+1),**t,**(t+1));//1,5,1,2p=m;printf("%d,%d\n",*p,**p);//1244972,6while(1);return0;}

3指针数组与二级指针

(){char*s[3]={"123","abcde","ABCDEF"};char**ps=s;for(inti=0;i3;i++)printf("%s\n",*(ps+i));while(1);return0;}/*123abcdeABCDEF*/

4列指针

#(){inti,j;intarr1[3]={1,2,3};int*p=arr1;intarr2[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};int(*ap)[4]=arr2;//行指针,等价于二级指针,ap+1偏移4个intfor(i=0;i3;i++)for(j=0;j4;j++)printf("%d",*(*(ap+i)+j));printf("\n");int*pc=*arr2;//列指针,等价于一级指针,ac+1偏移1个intfor(i=0;i3;i++)for(j=0;j4;j++)printf("%d",*(pc+i*4+j));printf("\n");int*pa[3];for(i=0;i3;i++)pa[i]=arr2[i];for(i=0;i3;i++)for(j=0;j4;j++)printf("%d",*(pa[i]+j));printf("\n");int**pp;pp=pa;for(i=0;i3;i++)for(j=0;j4;j++)printf("%d",*(*(pp+i)+j));printf("\n");while(1);return0;}

最后总结一下inta[10]、intb[3][10]和int(*c)[10]等的区别:

a是一维数组名,c是int(*)[10]型指针变量,c也可以理解成int[10]*型,和a是相同的指针类型。

b也是数组名,其类型是int[3][10],可以理解成是int[10]*型,但b还包含了3行的信息,sizeof(b)等于3*10*sizeof(int)。C语言允许:c=b;,这是基于二者的指针类型是一致的前提,而且c是变量;反过来就是错误的:b=c;,因为b是常量,不能赋值更改。

a、b是数组名,编程时的很多操作分别类似于int*和int(*)[10]。例如a+1指向a[1]、b+1指向b[1]。c本质上是一个指针变量,但若指向b,c就变成指向数组的指针变量,给编程增加了更多的灵活性。

--

版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。

相关推荐