鱼C论坛

 找回密码
 立即注册
查看: 1924|回复: 6

[已解决]二维数组

[复制链接]
发表于 2020-12-7 21:10:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 18878977809 于 2020-12-7 21:14 编辑
  1. #include<stdio.h>
  2. void main()
  3. {
  4.         int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
  5.         int *p,i;
  6.         p=a;
  7.         for(i=0;i<12;++i)
  8.         {
  9.            printf("%3d",*(p+i));
  10.            if((i+1)%4==0)
  11.            {
  12.                    printf("\n");
  13.            }
  14.         }
  15. }
复制代码

二维数组名a是a[0]的地址,那么p存入的是a[0]的地址,那p+i是 a【i】 的地址,行循环。没有列,还是一维的,*取值是二维a[0][0],a[1][0],a[2][0]的地址,怎么打印出全部的?

最佳答案
2020-12-8 15:45:40
本帖最后由 风过无痕1989 于 2020-12-8 15:51 编辑
18878977809 发表于 2020-12-8 08:53
这也是我疑惑的地方,在VC++6.0版本是可以运行的,且运行结果还是与a[0]是一样的


int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
则数组 a 有 3 个元素,分别为 a[ 0 ]、a[ 1 ]、a[ 2 ]。而每个元素都是一个一维数组,各包含 4 个元素,如 a[ 1 ]的 4 个元素是 a[ 1 ][ 0 ]、a[ 1 ][ 1 ]、a[ 1 ][ 2 ]、a[ 1 ][ 3 ]。
若有:
int *p = a[ 0 ];
则数组 a 的元素 a[ 1 ] [2 ] 对应的指针为:p + 1 * 4 + 2
元素 a[ 1 ][ 2 ] 也就可以表示为:*( p + 1 * 4 + 2)
用下标表示法,a[ 1][ 2 ] 表示为:p[1 * 4 + 2]

对上述二维数组 a,虽然 a[ 0 ]、a 都是数组首地址,但二者指向的对象不同。
a[ 0 ] 是一维数组的名字,它指向的是一维数组 a[ 0 ] 的首元素 a[ 0 ][ 0 ],对其进行 “*” 运算,得到的是一维数组元素 a[ 0 ][  0]的值,即 *a[ 0 ] 与 a[ 0 ][ 0 ]是同一个值。
而 a 是一个二维数组的名字,它指向的是二维数组a的首元素 a[ 0 ],对 a 进行 “*” 运算,得到的是一维数组 a[ 0 ] 的首地址,即 *a 与 a [0 ] 是同一个值。它的指针移动单位是“行”,所以 a+i 指向的是第 i 个行数组,即指向a[ i ]。
当用 int *p; 定义指针 p 时,p 的指向是一个 int 型数据,而不是一个地址,因此,用 a[ 0 ] 对 p 赋值是正确的,而用 a 对 p 赋值是错误的。这一点请务必注意。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-7 21:28:37 | 显示全部楼层
计算机的内存是一维的对吧,那么在一维的内存里面怎么存储二维的数组呢。

你可以把行当做一块,也可以把列当做一块,一行一行(或者一列一列的存到计算机内存)

所以,总的来说,二维数组是人为定义的,但在计算机内存还是一维的,当然可以根据指针p来对数组进行访问

也不知道讲清楚了没
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-7 21:29:26 | 显示全部楼层
数据结构 数组那一章你可以好好看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-7 21:36:07 | 显示全部楼层
本帖最后由 jackz007 于 2020-12-7 21:40 编辑
  1. #include<stdio.h>
  2. int main(void)
  3. {
  4.         int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}  ;
  5.         int * p , (* q)[4] , i , j                ;
  6.         p = (int *) a                             ;
  7.         for(i = 0 ; i < 12 ; i ++) {
  8.                 printf("%3d" , * (p + i))         ;
  9.                 if((i + 1) % 4 == 0) printf("\n") ;
  10.         }
  11.         q = a                                     ;
  12.         for(i = 0 ; i < 3 ; i ++) {
  13.                 for(j = 0; j < 4 ; j ++) printf("%3d" , * (* (q + i) + j)) ;
  14.                 printf("\n")                                               ;
  15.         }
  16. }
复制代码

        编译、运行实况
  1. D:\00.Excise\C>g++ -o x x.c

  2. D:\00.Excise\C>x
  3.   1  2  3  4
  4.   5  6  7  8
  5.   9 10 11 12
  6.   1  2  3  4
  7.   5  6  7  8
  8.   9 10 11 12

  9. D:\00.Excise\C>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-7 21:47:40 | 显示全部楼层
你的指针定义有错!a 的类型是 int (*)[4] 型,p 的类型是 int * 型,系统是不能将 "int (*)[4]" 类型的值分配到 "int *" 类型的实体的,应该定义为:p = a[0]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-8 08:53:38 | 显示全部楼层
本帖最后由 18878977809 于 2020-12-8 08:59 编辑
风过无痕1989 发表于 2020-12-7 21:47
你的指针定义有错!a 的类型是 int (*)[4] 型,p 的类型是 int * 型,系统是不能将 "int (*)[4]" 类型的值 ...


这也是我疑惑的地方,在VC++6.0版本是可以运行的,且运行结果还是与a[0]是一样的

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-8 15:45:40 | 显示全部楼层    本楼为最佳答案   
本帖最后由 风过无痕1989 于 2020-12-8 15:51 编辑
18878977809 发表于 2020-12-8 08:53
这也是我疑惑的地方,在VC++6.0版本是可以运行的,且运行结果还是与a[0]是一样的


int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
则数组 a 有 3 个元素,分别为 a[ 0 ]、a[ 1 ]、a[ 2 ]。而每个元素都是一个一维数组,各包含 4 个元素,如 a[ 1 ]的 4 个元素是 a[ 1 ][ 0 ]、a[ 1 ][ 1 ]、a[ 1 ][ 2 ]、a[ 1 ][ 3 ]。
若有:
int *p = a[ 0 ];
则数组 a 的元素 a[ 1 ] [2 ] 对应的指针为:p + 1 * 4 + 2
元素 a[ 1 ][ 2 ] 也就可以表示为:*( p + 1 * 4 + 2)
用下标表示法,a[ 1][ 2 ] 表示为:p[1 * 4 + 2]

对上述二维数组 a,虽然 a[ 0 ]、a 都是数组首地址,但二者指向的对象不同。
a[ 0 ] 是一维数组的名字,它指向的是一维数组 a[ 0 ] 的首元素 a[ 0 ][ 0 ],对其进行 “*” 运算,得到的是一维数组元素 a[ 0 ][  0]的值,即 *a[ 0 ] 与 a[ 0 ][ 0 ]是同一个值。
而 a 是一个二维数组的名字,它指向的是二维数组a的首元素 a[ 0 ],对 a 进行 “*” 运算,得到的是一维数组 a[ 0 ] 的首地址,即 *a 与 a [0 ] 是同一个值。它的指针移动单位是“行”,所以 a+i 指向的是第 i 个行数组,即指向a[ i ]。
当用 int *p; 定义指针 p 时,p 的指向是一个 int 型数据,而不是一个地址,因此,用 a[ 0 ] 对 p 赋值是正确的,而用 a 对 p 赋值是错误的。这一点请务必注意。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-13 04:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表