目录
指针数组
本质是个数组,数组内的都是指针。
用指针数组模拟实现二维数组:
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
int c = 30;
int* arr[3] = {&a,&b,&c}; //z这就是一个指针数组。int代表它数组内的指针是int型的
//有一种用法
int i;
for (i = 0; i < 3; i++)
printf("%d ", *arr[i]);
printf("\n");
//但是这样是比较低效率的,基本没啥用,接下来用它来模拟二维数组,这样能显示更多的数据。
int d[] = { 1,2,3,4,5 };
int e[] = { 2,3,4,5,6 };
int f[] = { 3,4,5,6,7 };
arr[0] = d;
arr[1] = e;
arr[2] = f;
int j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
printf("%d ", *(arr[i] + j));
printf("\n");
}
//这个是比较直接的,但当我们熟知了[] 的使用方法后就可以这样
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
printf("%d ", arr[i][j]);
printf("\n");
}
}
运行结果:
数组指针
本质是指针,指针指向的是一个数组。
这是就要重新回顾arr于&arr的差别。
用代码来解释下
乍一看结果是一样的,结果一样的原因是首元素地址的和整个元素地址是相同的,但是它们两个意义却不一样。
这一次的结果会是什么呢?
一个加4,一个加了40。已知arr是int类型,有十个元素,占40个字节。可以很好得出,它们一个指首元素,一个指整个数组。至于为什么两次首地址不同,问这个就没救了。
讲这么多,就是为了现在铺垫。
是在arr确定指向的数组时,一定要加&;
但是有时候编译器会对你的代码进行处理,像vs2019,就不会报错且正常处理,但是devc++就不行了,上图。
为了写出能够让大多数编译器都能运行的代码,强烈建议还是按照标准,写&a
它的解引用:
先对arr解引用获取a首元素a[0]的地址,在加i后就代表了各元素的地址。
我们会想到二维数组:
二维数组的数组名是首元素的地址,首元素表示:第一行数组。
所以当我们在函数调用时不想因为用太多内存时,就可以用现在的数组指针传参。
比如我要通过传参来实现输出二维数组数组
看图:
在arr还没解引用的时候我们加i,代表的是第几行,经过print函数,我们成功实现了输出a数组的目标。
回顾
他们分别代表什么?