二维数组学习

父子数组,为了讲清楚地址的概念,我们呢,把二维回归到一维数组。

父亲是一位数组{子也是一位数组,二维数组就是父的每个元素又是一个数组,

定义为int a[3][4]{3,4.5},{1,2,3}

a是二维数组名,啊数组包含3行,即3个行元素:a[0],a[1],a[2]一个是一个一维数组,那么子数组的数组名字是什么啊?

是a[0],a[1]那么就会有人说这里的012不应该是表示大小吗?但是在二维数组里这个东西只表示标识,不表示大小。这里一定要搞清楚,不然偏移的时候a+1漂移多少,a[0]+1又是多少?

之后的学习中可能会有&a[0][0]这种形式,他是与a[0]等价的,因为在C语言中数组名代表数组首元素的地址,因此a[0]代表一维数组a[0]中的第0列元素的地址,即&a[0][0]所以a[1]其实也可以写成a[1][0],a[2]同理。

思考个问题*a是什么,那么*(a+0)呢?

*a=a[0](子数组名,子数组首地址)=*(a+0)

下面我们用代码加深下印象

这个就是数组的其他写法。

#include<stdio.h>

int main()
{
	int arr[3][4] = {{11,22,33,44},{12,13,14,15},{77,66,99,88}};
	//偏移了16个字节,
	printf("arr是父亲地址:%p,偏移1后是%p\n",arr,arr+1);
	//偏移4个地址
	printf("arr[0]是子数组地址:%p,偏移1后是%p\n",arr[0],arr[0]+1);
	//另一种写法
	printf("arr[0]是子数组地址:%p,偏移1后是%p\n",*(arr+0),*(arr+0)+1);
	return 0;
}

指针数组的写法(*p)[]写的原理跟二维数组一样,只不过我们把A[0]改写成了(*p)但这根据下图来看我们这个其实也不犯毛病。

#include<stdio.h>

int getTheData(int (*p)[4],int hang,int lie)
{
	int data;
	data = *(*(p+hang)+lie);//类似p[hang][lie]
	return data;
}

void tipsInputHangLie(int *pm,int *pn)
{
	printf("请输入行列值:\n");
	scanf("%d%d",pm,pn);
	puts("done!");
}

int main()
{
	int arr[3][4] = {{11,22,33,44},{12,13,14,15},{77,66,99,88}};
	int ihang,ilie;
	int data;
	
	//1.提示用户输入行列值
	tipsInputHangLie(&ihang,&ilie);
	//2.找出对应行列值的数
	data  = getTheData(arr,ihang,ilie);
	//3.打印出来
	printf("%d行%d列的值是%d\n",ihang,ilie ,data);
	return 0;
}

这个就是一个指针数组的运用,有一点要切记,这个数组开始是从a[0][0]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值