c语言指针(2)

本文详细介绍了C++中的二级指针、指针数组以及如何用它们模拟二维数组,还探讨了函数指针变量和函数指针数组的概念,并通过一个简易计算器示例展示了其在减少代码冗余方面的应用。
摘要由CSDN通过智能技术生成

目录

1.二级指针

2.指针数组

 2.1指针数组模拟二维数组

3.函数指针变量

4.函数指针数组 

 4.1使用函数指针数组做简易计算器


1.二级指针

二级指针也是指针,是指针就是用来存放地址的,那么它存放的是谁的地址呢?

             二级指针存放的就是一级指针的地址,有几个 *  我们就成它为几级指针。 

对二级进行指针运算:

2.指针数组

指针数组:用来存放指针的数组

 2.1指针数组模拟二维数组

int main() {
		int arr1[] = { 1,2,3,4 };
		int arr2[] = { 2,3,4,5 };
		int arr3[] = { 3,4,5,6 };
		//数组名是数组⾸元素的地址,类型是int*,可以存放在parr数组中
		int* parr[3] = { arr1, arr2, arr3 };
		for (int i = 0; i < 3; i++)
		{
			for (int j = 0; j < 4; j++)
			{
				printf("%d ", parr[i][j]);
			}
			printf("\n");
		}
	return 0;
}

———————————————————————————————————————————

                                                         指针数组在内存中的情况 

—————————————————————————————————————————— 

                                                               程序运行时的情况 

3.函数指针变量

顾名思义就是,函数的指针。函数指针里存放的是函数的地址,可以在我们使用时进行调用。

函数的地址

有的人会说函数也有地址吗? 

答案是肯定的,下面我们看一段代码 

可以看见函数其实也是有地址的

并且&数组名,与数组名,都是函数的地址,没有任何区别

函数指针变量的创建

函数指针变量的调用

void test() {
	printf("haha\n");
}
int main() {
	void (*p1)() = &test;
	void (*p2)() = test;
	test();               //实际上test里存的就是函数的地址

	(*p1)(1,2);       //我们通过对p1解引用也可以找到函数的地址,一样调用  

	p2(1, 2);    //*是可以省略的,因为我们p2存放的就是函数的地址,与第一种调用没差

	return 0;
}

4.函数指针数组 

 数组是一个存放相同元素的粗存空间,当让也就可以存放函数指针

函数指针数组,就是用来存放函数指针的数组

函数指针数组的创建

int main() {

	int (*parr1[3])();   //parr1 先和 [] 结合,说明 parr1是数组
	                     //数组的内容是int (*)() 类型的函数指针。                       

	return 0;
}

 4.1使用函数指针数组做简易计算器

有人可能会有疑惑,说感觉这函数指针数组也没什么用,是不是搞出来唬人的东西

然而,非也函数指针数组可以帮助我们解决代码冗余等问题

简单计算器

int add(int a, int b)
{
	return a + b;
}
int sub(int a, int b)
{
	return a - b;
}
int mul(int a, int b)
{
	return a * b;
}
int div(int a, int b)
{
	return a / b;
}
int main()
{
	int x, y;
	int input = 1;
	int ret = 0;
	do
	{
		printf("*************************\n");
		printf(" 1:add 2:sub \n");
		printf(" 3:mul 4:div \n");
		printf(" 0:exit \n");
		printf("*************************\n");
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("输⼊操作数:");
			scanf("%d %d", &x, &y);
			ret = add(x, y);
			printf("ret = %d\n", ret);
			break;
		case 2:
			printf("输⼊操作数:");
			scanf("%d %d", &x, &y);
			ret = sub(x, y);
			printf("ret = %d\n", ret);
			break;
		case 3:
			printf("输⼊操作数:");
			scanf("%d %d", &x, &y);
			ret = mul(x, y);
			printf("ret = %d\n", ret);
			break;
		case 4:
			printf("输⼊操作数:");
			scanf("%d %d", &x, &y);
			ret = div(x, y);
			printf("ret = %d\n", ret);
			break;
		case 0:
			printf("退出程序\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
	return 0;

可以看出代码非常的冗余

使用函数指针数组完成简易计算器

int add(int x, int y) {
	return x + y;
}
int sub(int x, int y) {
	return x - y;
}
int mul(int x, int y) {
	return x * y;
}
int div(int x, int y) {
	return x / y;
}
void calc(int (*p)(int, int), int input) {  //设置转移表
	int ret = 0;
	int x, y;
	printf("输入操作数:");
	scanf("%d %d", &x, &y);
	ret = (*p)(x, y);          
	printf("ret = %d\n", ret);
}
int main() {
	int input = 1;
	int(*p[5])(int x, int y) = { 0,add,sub,mul,div };//创建函数指针数组
	do {
		printf("------1.add  2.sub---------\n");
		printf("------3.mul  4.div---------\n");
		printf("------0.exit      ---------\n");
		printf("请选则");
		scanf("%d", &input);
		if ((4 >= input) && (input >= 1))
		{
			calc(p[input], input);      //通过输入的input来决定使用的函数
		}
		else if (input == 0) {
			printf("退出计算器\n");
		}
		else
		{
			printf("输入有误\n");
		}
	} while (input);
	return 0;
}

代码非常的简洁

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值