父子数组,为了讲清楚地址的概念,我们呢,把二维回归到一维数组。
父亲是一位数组{子也是一位数组,二维数组就是父的每个元素又是一个数组,
定义为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]。