数组指针变量
数组指针变量是什么?
之前我们介绍了指针数组,指针数组是一种数组,它存放的是地址(指针)。
哪我们下面要介绍的数组指针是数组还是指针呢?
答案是:指针
我们已经熟悉的是
整形指针变量:int* ptr,存放的是整型变量的地址,能指向整形数据
浮点指针变量:float* ptr,存放的是浮点变量地址,能指向浮点数据
那么数组指针就是存放数组地址的变量,能够指向数组的地址。
数组指针的书写如下

解释:p先和*结合,说明p是一个指针变量,然后指针指向一个大小为十的整形数组。所以p是一个指针,指向一个数组,叫数组指针。
数组指针初始化
数组指针是用来存放数组地址的,那么怎么获得数组地址呢?就是用我们之前介绍的&数组名的形式。示例如下
int (*p)[10]=&arr
二维数组传参本质
void test(int (*p)[5], int r, int c)
{
int i = 0;
for (i = 0; i < r; i++)
{
int j = 0;
for (j = 0; j < c; 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} };
test(arr, 3, 5);
return 0;
}
这里实参是二位数组,形参也可以写成二维数组的形式,那还有什么其他的写法吗?
首先我们再次理解一下二维数组,二维数组其实可以看作每个元素是一位数组的数组,也就是二维数组的每个元素是一个一维数组。那么二维数组的首元素就是第一行,是个一维数组。
如下图

所以,根据数组名是首元素地址这个规则,二维数组的数组名的表示的就是第一行的地址,是一维数组的地址。根据上面的例子,第一行的一维数组的类型就是int[5],所以第一行的地址的类型就是数组指针类型int(*)[5]。那就意味着二维数组传参本质上传递了地址,传递的是第一行这个一维数组的地址
函数指针变量
什么是函数指针变量呢?
根据上面的学习,我们可以类比一下,函数指针其实就是存放函数的地址,未来可以通过地址调用函数。
我们先来看一段代码
void test()
{
printf("hehe");
}
int main()
{
printf("test: %p\n", test);
printf("&test:%p\n", &test);
return 0;
}

通过这个代码我们确实打印出了函数的地址,证明了函数确实存在地址,并且函数名就是函数的地址。
如果我们要存储函数指针变量,我们就需要一个变量叫函数指针类型,书写如下:

函数指针使用
int Add(int a, int b)
{
return a + b;
}
int main()
{
int (* pf1)(int, int) = &Add;
int (* pf2)(int, int) = Add;
int r1 = (*pf1)(3, 7);
int r2 = (*pf2)(3, 7);
int r3 = Add(3, 7);
printf("%d\n", r1);
printf("%d\n", r2);
printf("%d\n", r3);
return 0;
}
函数指针的可以像其他指针一样,通过*解引用使用。

函数指针数组
数组是一个存放相同类型数据的存储空间,我们已经学习了指针数组,如
int *arr[10];
//数组每个元素是int*
那存储函数指针的数组怎么写呢
int (*parr[3])();
parr先和[ ]结合,说明parr是数组,数组的内容是int(*)()类型的函数指针。
以上几期的内容就是指针的基本应用,希望对大家有所帮助。
深入理解数组指针、函数指针及其在C语言中的应用
本文详细讲解了数组指针的概念,它是存放数组地址的指针;介绍了二维数组传参本质上是传递首行地址;并探讨了函数指针,包括其定义、使用和函数指针数组的实例。这些是C语言中重要的指针概念,对编程有实际帮助。
1868

被折叠的 条评论
为什么被折叠?



