c语言指针与二维数组
欢迎关注AWP资讯
二维数组的定义和内存模型先来了解一下,我们还是先定义一个二维数组
int b[2][3];
先不给它赋值,考虑一下它的具体含义,这里代表的是两组含有3个整形数据的数组,定义的话按照如下形式进行数据的初始化
int b[2][3] = {{2,3,5},{6,8,9}};
两组数据,每组数据含有3个整形元素。
二维数组的内存模型可以看成是这样的
共有2个大组B[0]和B[1],每个组的大小都是12个字节,每个组里面有3个整形元素。
我们如果用指针来操作可以这样定义
int (*p)[3] = b;
定义了一个数组指针,这里的p是一个指针,指针指向了一个数组,数组中有3个元素,元素类型是int型
那么这里我们可以根据上面定义的int (*p)[3] = b;知道指针p中存的地址对应的值是b[0] [0]的地址值。
既然已经看了数组指针的概念,那就有必要趁热再了解一下指针数组,将这两个概念区分一下,指针数组顾名思义它代表是数组,数组中存的是指针,指针数组的定义方式如下:
int *p[3];
首先分析一下定义的元素结合,p先和[]进行结合也就构成了数组,那么这个数组中含有3个指针类型的元素,指向的是int型数据,这个定义也可以这样写int* p[3]这样就好理解了,它对应的内存模型是这样的
int a = 1,b = 2,c = 3;
int *p[3];
p[0] = &c;
p[1] = &b;
p[2] = &a;
回到我们所讨论的指针与二维数组,我们写如下的代码,分析一下各个打印出来的值
#include<stdio.h>
int main(void)
{
int b[2][3] = {{2,4,6},{8,9,10}};
int (*p)[3] = b;
printf("b = %d,&b[0] = %d\n",b,&b[0]);
printf("*b = %d,b[0] = %d\n",*b,b[0]);
printf("b + 1 = %d,&b[1] = %d\n",b + 1,&b[1]);
printf("*(b + 1) = %d,b[1] = %d\n",*(b + 1),b[1]);
printf("*(b + 1)+2 = %d,b[1]+2 = %d\n",*(b + 1)+2,b[1]+2);
printf("*(*b + 1) = %d\n",*(*b + 1));
}
printf(“b = %d,&b[0] = %d\n”,b,&b[0]);这里打印的值是这个二维数组的首地址,也就是&b[0] [0],是地址值
printf(" * b = %d,b[0] = %d\n",*b,b[0]);这里打印的是b的其中一个数组中的第一个数组的首地址,值同上面
printf(“b + 1 = %d,&b[1] = %d\n”,b + 1,&b[1]);这里b+1是指的增加一个数组的空间大小,也就到了b[1]的首地址
printf("* (b + 1) = %d,b[1] = %d\n",*(b + 1),b[1]);这里对b+1解引用可以理解为同上面第二条分析一样,只不过地址空间增加12个字节,也就是b[1]的首地址
printf("* (b + 1)+2 = %d,b[1]+2 = %d\n",*(b + 1)+2,b[1]+2);顺着上面分析,在b[1]地址的基础上增加2个整形变量的空间大小,也就是b[1] [2]的地址
printf("* (* b + 1) = %d\n",* (* b + 1));这里我们先从里面开始看,* b是第一个数组中的首元素地址,+1递增4个字节,也就是b[0] [1]的地址,然后外面解引用得到b[0] [1]的值
我们运行后得到的结果如下: