深入理解指针(7)

本文详细讲解了数组指针的概念,它是存放数组地址的指针;介绍了二维数组传参本质上是传递首行地址;并探讨了函数指针,包括其定义、使用和函数指针数组的实例。这些是C语言中重要的指针概念,对编程有实际帮助。

数组指针变量

数组指针变量是什么?

之前我们介绍了指针数组,指针数组是一种数组,它存放的是地址(指针)。
哪我们下面要介绍的数组指针是数组还是指针呢?
答案是:指针
我们已经熟悉的是
整形指针变量: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(*)()类型的函数指针。

以上几期的内容就是指针的基本应用,希望对大家有所帮助。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值