c语言指针与二维数组

c语言指针与二维数组

欢迎关注AWP资讯
二维数组的定义和内存模型先来了解一下,我们还是先定义一个二维数组

int b[2][3];

先不给它赋值,考虑一下它的具体含义,这里代表的是两组含有3个整形数据的数组,定义的话按照如下形式进行数据的初始化

int b[2][3] = {{2,3,5}{6,8,9}};

两组数据,每组数据含有3个整形元素。

二维数组的内存模型可以看成是这样的

image-20210128221457373

共有2个大组B[0]和B[1],每个组的大小都是12个字节,每个组里面有3个整形元素。

我们如果用指针来操作可以这样定义

int*p)[3] = b;

定义了一个数组指针,这里的p是一个指针,指针指向了一个数组,数组中有3个元素,元素类型是int型

image-20210128223305288

那么这里我们可以根据上面定义的int (*p)[3] = b;知道指针p中存的地址对应的值是b[0] [0]的地址值。

既然已经看了数组指针的概念,那就有必要趁热再了解一下指针数组,将这两个概念区分一下,指针数组顾名思义它代表是数组,数组中存的是指针,指针数组的定义方式如下:

int *p[3];

首先分析一下定义的元素结合,p先和[]进行结合也就构成了数组,那么这个数组中含有3个指针类型的元素,指向的是int型数据,这个定义也可以这样写int* p[3]这样就好理解了,它对应的内存模型是这样的

image-20210128224614957

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]的值

我们运行后得到的结果如下:

image-20210130204356476

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值