二维数组及指针

二维数组及指针二维数组本质也是一个数组 我们说行和列是为了让大家更好理解 其实二维数组也是连续存储的 所以遍历时也可利用循环算法来实现遍历 与一维数组不同的是二维数组要在行循环的基础上把每一行的所有元素都遍

大家好,欢迎来到IT知识分享网。



一、二维数组的基本用法

1. 二维数组声明生成:

 类型 + 数组名[行数][列数] 
 int arr[3][4] 

2. 二维数组的内存原理

 int arr[3][4]; arr[0][0] = 1; arr[2][0] = 2; arr[0][3] = 3; arr[2][3] = 4; 

在这里插入图片描述
二维数组可以理解为是数组的数组,其中行数表示有多少个数组,列数表示一个数组有多少个元素。

3.二维数组初始化

完全初始化:形式1:一维摸样,形式2:{}行方式

 int arr1[2][3] = { 
     1,2,3, 4,5,6}; int arr2[2][3] = { 
      { 
     1,2,3}, { 
     4,5,6} }; 

不完全初始化、其它成员默认 0

 int arr3[2][3] = { 
      1,2, }; int arr4[2][3] = { 
      { 
     1, }, { 
     4,5 } }; 

需要注意的是二维数组在初始化成员个数时列数不能省略,但是会根据列数自动决定行数。

 int arr5[][3] = { 
      { 
     1,2,3},{ 
     4,5,6},7 }; 

4.二维数组的遍历

二维数组本质也是一个数组,我们说行和列是为了让大家更好理解,其实二维数组也是连续存储的,所以遍历时也可利用循环算法来实现遍历,与一维数组不同的是二维数组要在行循环的基础上把每一行的所有元素都遍历,因此要用到嵌套循环来实现

 int arr[3][4]; arr[0][0] = 1; arr[2][0] = 2; arr[0][3] = 3; arr[2][3] = 4; int hs = sizeof(arr) / sizeof(arr[0]); int ks = sizeof(arr[0]) / sizeof(arr[0][0]); 

这里计算行数和列数的思想和当时一维数组计算长度的思想类似,都是利用总字节数除以每个元素字节数,这里就不做太多解释了。

 for ( int h=0; h<hs;h++ ) { 
      for (int k=0 ;k<ks ;k++ ) { 
      printf("%d ",arr[h][k]); } printf("\n"); } 

这样我们就实现了循环遍历数组。

二、维数组的数组名的用法

1.找到某行的首地址

 int arr[3][4] = { 
      { 
     1,2,3,4},{ 
     5,6,7,8},{ 
     9,10,11,12} }; printf("%x %x %x\n",arr,arr+1,arr+2); 

在这里插入图片描述
由此可见,数组名加上偏移量得到行的首地址

2.得到某行的存储空间

 int arr[3][4] = { 
      { 
     1,2,3,4},{ 
     5,6,7,8},{ 
     9,10,11,12} }; printf("%p %p %p\n",arr,arr+1,arr+2); printf("%p %p %p\n", *(arr+0), *(arr + 1), *(arr + 2)); 

在这里插入图片描述
这里可以看到,两个程序的结果是一样的,但是这两个本质上不是一个事情,第一行仅仅是得到了行的首地址,第二个则是的到了行的全部地址,在讲解指针时给大家说过,C语言里用首地址来代表全部地址,所以这两个输出的结果才是一样的。
我们可以通过字节数来验证

 printf("%d %d %d\n", sizeof(*(arr + 0)), sizeof( *(arr + 1)), sizeof(*(arr + 2))); printf("%d %d %d\n", sizeof(arr + 0), sizeof(arr + 1), sizeof(arr + 2)); 

在这里插入图片描述

3.找到某行内,某列的地址

 int arr[3][4] = { 
      { 
     1,2,3,4},{ 
     5,6,7,8},{ 
     9,10,11,12} }; printf("%p %p %p\n", *(arr + 1)+0, *(arr + 1) + 1, *(arr + 1) + 2 ); 

在这里插入图片描述
我们首先用数组名加偏移量得到行空间,对行空间 * 操作就得到了行空间存储的内容,也就是这一行里面的对应的列的地址。

4.得到某行某列的内容

int arr[3][4] = { 
      { 
     1,2,3,4},{ 
     5,6,7,8},{ 
     9,10,11,12} }; printf("%d %d %d\n", *(*(arr + 1) + 0), *(*(arr + 1) + 1),* (*(arr + 1) + 2)); 

在这里插入图片描述
按照上面说的我们得到了行空间的存储内容也就是这一行对应列的地址后,再进行取 * 操作就得到了列的内容。

三、利用指针遍历二维数组

根据以上内容,我们大概了解了如何利用指针来遍历二维数组,本质上也是循环,但是由于数组时二维的,我们可以用数组指针来实现遍历

 int arr[3][4] = { 
      { 
     1,2,3,4},{ 
     5,6,7,8},{ 
     9,10,11,12} }; int(*pm)[3][4] =&arr;//定义一个指向 arr 数组的指针 for (int h=0 ;h<3 ;h++ ) { 
      for (int k = 0; k < 4; k++) { 
      printf("%d %d %d\n",arr[h][k],(*pm)[h][k],*(*( *pm+h)+k) ); } } 

在这里插入图片描述

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/110746.html

(0)
上一篇 2026-01-29 14:20
下一篇 2026-01-29 14:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信