数组指针
“数组指针”是一种指针,该指针指向一个数组。就类似于“红苹果”,本质是一种苹果,“红”只是修饰苹果的一个定语。
int arr[5] = { 1,2,3,4,5 };
int(*p)[5] = &arr;//p表示一个指针,存放了一个数组的地址,该数组有5个元素,每个元素是一个整形。
其中p就是一个数组指针,存放着整个数组的地址。需要注意的是,在书写数组指针时必须要将p用()括起来,否则,int* p[5]中p会因为[ ]的结合性更高,而优先与[]进行结合,表示一个五个元素的数组,每个元素是一个指针。也称为指针数组。
二维数组传参
数组方式传参
二维数组传参中最常见的一种方式就是以数组的形式进行传参。
#include<stdio.h>
void print(int brr[3][2], int x, int y)//打印二维数组
{
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
printf("%d ", brr[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[3][2] = { {1,2},{2,3},{3,4} };//定义一个二维数组
print( arr, 3, 2);
return 0;
}
打印的结果如图:
其中,print 函数中的形参就是数组形式,这种数组传参方式也最为常见。
将arr这个数组进行传参,在函数中也只需将函数形参设定为一个数组的形式即可,但需要注意的是,形参中数组的形式必须与传参的数组形式一致,即:所传二维数组是一个三行两列的整形数组,那么形参数组也必须是一个三行两列的数组。
指针方式传参
指针方式传参时我们要应用数组指针。但数组指针多在二维数组中应用,一维数组中应用会显得比较复杂,不方便。
数组指针在一维数组中的应用对比:
#include<stdio.h>
//将指针数组应用于一维数组,会比较复杂,不简单
int main()
{
int arr[5] = { 1,2,3,4,5 };
int(*p)[5] = &arr;//p表示一个指针,存放了一个数组的地址,该数组有5个元素,每个元素是一个整形。
int i ;
for (i = 0; i < 5; i++)
{
printf("%d ", ( * p)[i]);
printf("%d ", *(*p + i));
}
return 0;
}
int main()
{
int arr[5] = { 1,2,3,4,5 };
int i;
for (i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
上面两种打印出的结果都是相同的,但在一维数组中应用数组指针,会比较复杂,不简便,不如运用平常一维数组的直接引用方便。
言归正传,现在我们就来聊聊如何用指针形式进行二维数组的传参。
在传参直接将二维数组名arr传过去的时候,实际穿的是arr[0]的地址,这是第一行所有元素的地址,此时所传的参数是一个数组指针,存放着第一行元素地址,因此形参也必须是数组指针的形式来接收。
#include<stdio.h>
//指针数组进行传参
void print(int(*p)[5],int x,int y)//arr是指arr[0]的地址,arr[0]中又包含有五个元素。
//即arr就是一种数组指针,该指针指向第一行的数组,有五个元素,每个元素是一个整形
//因此形参也用数组指针的形式来表现
{
int i,j;
for (i = 0; i < x; i++)
{
for (j = 0; j < y; j++)
{
printf("%d ", (*(p+i))[j]);//第一种输出方式
//printf("%d ", *((*(p + i) + j)));//第二种输出方式
}
printf("\n");
}
}
int main()
{
int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
print( arr, 3, 5);//arr--数组名--数组首元素地址-在二维数组中首元素是指arr[0],即是指第一行所有元素的地址
return 0;
}
在输出数组时有两种输出方式,第一种*(p+i))[j],p+i是指将p跳过i行,(p+i)是说现在我们拿到了第i行的所有元素地址,(p+i)[j]是输出第i行j列的元素。
第二种 *((p + i) + j)),(*(p + i) + j)则是指拿到了第i行j列的元素地址,在进行一次解引用操作,就可以输出元素本身了。