商城网站系,c 手机网站开发,如何做收费会员定制网站,为什么一个网站做中英文双语版在实际c语言编程中#xff0c;三维及以上数组我们使用的很少#xff0c;二维数组我们使用得较多。说到数组#xff0c;又不得关联到指针#xff0c;因为他们两者的联系太紧密了。今天我们就详细介绍下c语言下的多维数组(主要是介绍二维数组)和指针。
一、二维数组
1.1三维及以上数组我们使用的很少二维数组我们使用得较多。说到数组又不得关联到指针因为他们两者的联系太紧密了。今天我们就详细介绍下c语言下的多维数组(主要是介绍二维数组)和指针。
一、二维数组
1.1存储格式 一般大家看待二维数都会把它看作一张表格例如一个int a[3][4]的数组 实际上计算机中二维数组是以顺序的方式存储的其内部存储格式如下还是以int a[3][4]为例子 1.2二维数组声明和访问 我们可以通过如下方式进行二维数组声明和初始化 char c[3][10]; //声明一个char类型的二维数组它是包含3个长度为10的char数组int a[3][4] {1,2,3,4,5,6,7,8,9,10,11,12}; //声明并初始化一个int类型的二维数组并初始化 二维数组的访问 int a[3][4] {1,2,3,4,5,6,7,8,9,10,11,12};for(int i0;i3;i){for(int j0;j4;j){printf(the element a[i][j] is %d\n, a[i][j]);}} 我们也可以利用指针的形式进行访问数组的名字实际代表的数组首地址 int a[3][4] {1,2,3,4,5,6,7,8,9,10,11,12};for(int i0;i3;i){for(int j0;j4;j){printf(the element a[i][j] is %d\n, *(*(ai)j));}} 二、指针数组 2.1指针数组存储格式 指针数组代表某一数组中的所有元素都是指针其内部存储格式如下我们以int *p[3]为例 具体代码如下
int main() {int a 100;int b 200;int c 300;int *p[3] {a, b, c};printf(the a address is %x\n, p[0]);printf(the a address is %x\n, p[1]);printf(the a address is %x\n, p[2]);return 0;
} 2.2指针数组的声明和访问 我们可以通过如下方式进行指针数组的声明和初始化 char *c[10];//声明一个包含10个char类型指针的数组int a 100;int b 200;int c 300;int *p[3] {a, b, c};//声明一个包含3个int类型指针数组并进行了初始化指针数组的访问我们可以通过如下两种方式进行指针数组指向内容的访问
int main() {int a 100;int b 200;int c 300;int *p[3] {a, b, c};for(int i0;i3;i){printf(the element i point to value is %d\n, *p[i]);}for(int j0;j3;j){printf(the element i point to value is %d\n, **(pj));}return 0;
} 三、二维数组与指针数组的比对 我们可以看到对于二维数组和指针数组我们都可以通过*(*(ai)j)的方式去访问于是很多人误认为二维数组和指针数组是同一个东西然两者其实还是有区别的。 对于二维数组 char a[3][4] {{t,p,c},{i,s},{m,a,n}} 无论每个数组中元素是否存储值它的存储空间必需为sizeof(char)*3*4的。 二维数组元素访问(*(*(ai)j))a的地址在程序编译阶段即可知道我们获取数组某个元素然后如下进行 1取a的地址值2取i的值得知需要获取跨过的行长度(sizeof(char)*4*i)然后加到a地址值上3取j的值得知需要获取跨过的元素长度sizeof(char)*j)然后加到上一步得到的地址上4从第3步获取的地址得到需要取得的元素的地址从中取出值 对于指针数组 char *a[3] {tpc,is,good}; a中存在4个char类型指针每个指针指向的一个char类型数组但是每个数组的长度不一样。 指针数组元素访问(*(*(ai)j))a的地址在程序编译阶段即可知道我们需要获取数组某个元素需要如下进行 1取a的地址值假设为1002取i的值得知需要跨过的元素的字节长度(sizeof(char *)*i然后的到具体元素的地址值为100sizeof(char *)*i假设求出来为1043根据地址值104因为a[i]为指针我们需要根据指针值再去获取指向内容我们得到内部存储地址为0x4071d44取j的值得知需要跨过的元素字节长度(sizeof(char)*j)假设j为1)那么我们得到需要取得元素的地址为0x4071d4sizeof(char)*1 0x4071d55从0x4071d5中取出内容对应图中的s) 四、数组指针 对应一个二维数组如果我们需要通过声明一个指针来指向它可以通过如下方式
int main() {int a[2][3] {1,2,3,4,5};int (*p)[3] a;printf(the address of a is %d\n, a);printf(the value of p is %d\n, p);} 我们通过如下方式利用指针访问a中元素。 1获取指针p存储的值得到a的地址a为一个包含2个含有3个元素的数值2我们通过pi及ai获取a中对应2个数组元素的首地址 3我们通过*(pi)j获取对应数组元素中的具体元素地址4我们通过*(*(pi)j)获取到具体的元素值 int main() {int a[2][3] {1,2,3,4,5};int (*p)[3] a;for(int i0;i2;i)for(int j0;j3;j)printf(the element a[%d][%d] is %d\n, i, j, *(*(pi)j));}