C 语言中的好基友 数组和指针之二

本文详细解析了二维数组的内部结构及如何通过指针访问其元素,通过实例展示了如何像操作一维数组一样访问二维数组的各个元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上节我们搞定了一维数组,这回我们看看二维数组,二维数组实际上是穿了马甲的一位数组,老样子我们看看下面例子

比如我们有如下数组

  int abc[2][8] ={
    {11,12,13},
    {21,22,23},
  };

实际上它由两个一维数组组成,数组名分别是abc[0]和abc[1]

abc[0][8]={11,12,13}  //注意把abc[0]整个看作是数组名,或者是指针名,相当于前一章节的数组名b

abc[1][8]={21,22,23}

那么我们是否能像前一章节那样通过数组名访问数组中的元素呢?比如用 *(abc[0] + 1) 来访问数组abc[0]的第二个元素

敲入如下代码看看结果如何

  int abc[2][8] ={
    {11,12,13},
    {21,22,23},
  };
    printf("size of int is %d\n",sizeof(int));
    printf("size of abc is %d \n",sizeof(abc));//得到整个数组abc的大小
    printf("size of abc[0] is %d \n",sizeof(abc[0])); //可以得到子数组abc[0]的大小
    printf("size of abc[0][0] is %d \n",sizeof(abc[0][0]));
    printf("1abc[0][0]=%d \n",abc[0][0]);
    printf("2abc[0][1]=%d \n",abc[0][1]);
    printf("3abc[0]=%d \n",abc[0]);
    printf("4abc[1]=%d \n",abc[1]);
    printf("5*abc=%d \n",*abc); 
    printf("6*abc[0]=%d \n",*abc[0]);  //把abc[0]看成第一个数组名,然后当成指针来操作
    printf("6*(abc[0]+1)=%d \n",*(abc[0]+1));  
    printf("6*(abc[0]+2)=%d \n",*(abc[0]+2));
    printf("7*abc[1]=%d \n",*abc[1]);  //把abc[1]看成第二个数组名</span>
    printf("7*(abc[1]+1)=%d \n",*(abc[1]+1));
    printf("7*(abc[1]+2)=%d \n",*(abc[1]+2));
    printf("8addr of abc=%p \n",abc);
    printf("9addr of &abc=%p \n",&abc);
    printf("10addr of abc[0]=%p \n",abc[0]);
    printf("11addr of abc[1]=%p \n",abc[1]);
    printf("12addr of &abc[0]=%p \n",&abc[0]);
    printf("13addr of &abc[1]=%p \n",&abc[1]);
    printf("14addr of *abc[0]=%p \n",*abc[0]);
    printf("15addr of *abc[1]=%p \n",*abc[1]);
    printf("16addr of &(*abc[0])=%p \n",&(*abc[0]));
    printf("17addr of &(*abc[1])=%p \n",&(*abc[1]));
    printf("18addr of abc[0][0]=%p \n",abc[0][0]);
    printf("19addr of abc[0][1]=%p \n",abc[0][1]);
    printf("20addr of &abc[0][0]=%p \n",&abc[0][0]);
    printf("21addr of &abc[0][1]=%p \n",&abc[0][1]);


运行结果:

size of int is 4
size of abc is 64 
size of abc[0] is 32 
size of abc[0][0] is 4 
1abc[0][0]=11 
2abc[0][1]=12 
3abc[0]=-1074074872 
4abc[1]=-1074074840 
5*abc=-1074074872 
6*abc[0]=11 
6*(abc[0]+1)=12 
6*(abc[0]+2)=13 
7*abc[1]=21 
7*(abc[1]+1)=22 
7*(abc[1]+2)=23 </span>
8addr of abc=0xbffaeb08 
9addr of &abc=0xbffaeb08 
10addr of abc[0]=0xbffaeb08 
11addr of abc[1]=0xbffaeb28 
12addr of &abc[0]=0xbffaeb08 
13addr of &abc[1]=0xbffaeb28 
14addr of *abc[0]=0xb 
15addr of *abc[1]=0x15 
16addr of &(*abc[0])=0xbffaeb08 
17addr of &(*abc[1])=0xbffaeb28 
18addr of abc[0][0]=0xb 
19addr of abc[0][1]=0xc 
20addr of &abc[0][0]=0xbffaeb08 
21addr of &abc[0][1]=0xbffaeb0c 


结论:

1)对于二维数组 int abc[2][8],abc[0]和abc[1]是两个子数组名,完全可以当作是指针进行指针操作(指针类型是int)来获得子数组中的任意元素,但是abc这个玩意可就不能当作简单的指针来操作了,具体参看例子结果

2)依然只有sizeof才是识别好基友之间的利器,sizeof 一个明确定义的指针永远是4(具体多少依据当前操作系统),而sizeof一个数组名却可以得到数组的元素实际占用空间






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值