指针与二维数组的那些事儿

来源:互联网 发布:网络用语cp是什么意思 编辑:程序博客网 时间:2024/05/03 00:22

不可否认,这两天我被指针搞得头要炸了!!!思考思考思考!想出来了!应该是对的,所以写下理解过程。

话不多说,先上一段代码的部分:

int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};int (*p)[4];int i,j;p = a;for(i=0;i<3;i++){        for(j=0;j<4;j++) printf("%3d\t",*(*(p+i)+j));        printf("\n");    }
首先,有一个int (*p)[4];它表示p是一个指针变量,指向包含四个元素的一维数组

也就是设有整型二维数组a[3][4]如下:
0  1  2   3
4  5  6   7
8  9 10 11

它的定义也可以写作

int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
C语言允许把一个二维数组分解为多个一维数组来处理。因此数组a可分解为3个一维数组,即a[0],a[1],a[2]。每一个一维数组又含有4个(即列数)元素。
      

        所以:   a[3][4] = {a[0],a[1],a[2]};
                       a[0] = {0,1,2,3},a[1] = {4,5,6,7},a[2] = {8,9,10,11};

下面开始艰苦卓绝的分析~~


  p=a就是p指向第一个一维数组a[0];其值等于a,a[0]或&a[0][0],
  p+i 就指向一维数组a[i];
  而a[i]就是a[i][0]的地址哦~(这句相当重要,绕来绕去就是这一点没想明白)
  所以是指针指向了一个地址(地址指向地址)
*(p+i) 就是a[i]中第一个值的地址,即&a[i][0]
*(p+i)+j 就是a[i]中第j个值的地址,即&a[i][ j]
*((p+i)+j) 就是a[i]中第j个值,即第i行第j列这个数,即a[i][j]

综上,p是一个指向指针的的指针,哦天呐,我好晕!!!

文章写得并不长,但我想思考了很久才写清楚这些句子,至少对现阶段的我来说,这还是一个比较复杂东西,以后还是多多运用,多多体会,方能彻底掌握。



0 0
原创粉丝点击