(一)指针数组
1、本质:指针数组的本质任然是数组
2、基本格式:int* arr[5]
3、应用:如尝试使用指针来模拟二维数组
先来看代码
#include<stdio.h>
//指针数组——模拟实现二维数组
int main()
{
int a[5] = { 1,2,3,4,5 };//定义两个数组a,b
int b[5] = { 1,2,3,4,5, };
int* arr[2] = { a,b };//定义一个数组存放a和b,由于数组名为首元素地址,所以该数组类型为指针
int i, j = 0;//打印a,b的元素
for (i = 0;i < 2;i++)
{
for (j = 0;j < 5;j++)
{
printf("% d", *(arr[i] + j));//解引用,arr[i]+j 指向第i行,第j列,然后*(arr[i]+j)取出元素
}
printf("\n");
}
return 0;
}
具体原理可以看代码注释
(二)数组指针
1、数组指针基本知识
(1)本质:指针
(2)写法:
int arr[5] = { 0 }; //定义一个数组
int (*parr) [5] = &arr;//&arr取的是整个数组的地址
double* b[5] = {0};//定义一个指针数组
double*(*pb)[5] = &b;//(*pb)表明是个指针,[5]表示指向数组,double*说明指向的数组类型,也就是该指针的类型
2、数组名和&数组名的区别
(1)数组名:在之前的学习中我们已经知道了数组名就是数组首元素的地址。
(2)&数组名:&数组名也是指向数组的首元素。。。
?或许你现在很疑惑,既然这两种方式都会指向数组的首元素,那么究竟有什么不同呢
先来看一段代码:
显然,根据上图我们可以知道,arr和&arr所指向的位置是相同的,但其本质是不同的!!!
(3)不同点:类型不同
1.数组名:代表的是数组首元素的地址
2.&数组名:是整个数组的地址
由上图所示,我们可以看出
(1)数组名和&数组名使用指针来写的时候格式不同
(2)arr 和 arr+1 之间的地址相差了4个字节,也就是一个元素;&arr 和 &arr+1 则是相差了40个字节,也就是一个数组的大小
3、练习
(1)对于该代码:int(*pa[10])[5] 你认为是什么呢?
(2)定义一个二维数组,尝试使用函数的形式来打印其中的元素,要求形参为数组指针类型
(答案将在下一篇文章中呈现,希望读者能自己敲一敲!!!)