C语言进阶版第9课—指针(3)

1. 字符指针变量

在这里插入图片描述
在这里插入图片描述

  • 练习题
    在这里插入图片描述
    在这里插入图片描述

2. 数组指针变量

  • 在学习数组指针前,我们先回忆一下什么是指针数组
  • 指针数组 → 存放指针的数组 → char* arr[ ] = { ‘a’, ‘b’ ,‘c’};
  • 那么什么是数组指针变量呢?
  • 数组指针变量 → 存放数组地址,指向数组的指针变量
  • 我们来看一段代码
#include <stdio.h>
int main()
{
	int* p1[10];     //p1是什么
	int(*p2)[10];    //p2是什么
	return 0;
}
  • 指针数组
  • int*  p1   [10];
      |     |    |
      |     |  数组元素个数
      |   数组名
    表示数组每个元素都是int*类型
  • 数组指针变量
  • int  (*p2)   [10];
      |     |    |
      |     |  p2指向数组的元素个数
      |   p2是数组指针变量
    p2指向的数组的元素类型

在这里插入图片描述

3. 二维数组传参的本质

  • 前面我们学过二维数组
  • int  arr  [5]   [10];
      |     |    |   |
      |     |    | 数组每个元素的内容
      |     | 数组元素个数
      |  数组名
    表示数组每个元素都是int类型
  • 二维数组传参
    在这里插入图片描述
    在这里插入图片描述
    二维数组传参,形参可用数组,也可用指针

4. 函数指针变量

  • 函数地址
    在这里插入图片描述
  • 函数指针变量 —→ 存放函数地址
  • int  (*p1)   (int x,int y);
       |     |     ------------
       |     |       |
       |     |     p1所指函数的参数类型和个数
       |   函数指针变量
    p1指向函数的返回类型在这里插入图片描述
  • 练习
    在这里插入图片描述
    在这里插入图片描述

5. typedef关键字

  • typedef是用来类型重定义的
    在这里插入图片描述

6. 函数指针数组

  • 存放函数指针(相同类型)的数组
    在这里插入图片描述

7. 函数指针数组的应用—转移表

转移表
优化前
#include <stdio.h>
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;
}
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("请选择:");
		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("输入错误");
			break;
		}
	} while (input);
	return 0;
}
  • 优化
    在这里插入图片描述
//优化后
#include <stdio.h>
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;
}
int main()
{
	int x, y;
	int input = 1;
	int ret = 0;
	int(*ptr[5])(int, int) = { 0,add,sub,mul,div };
	do
	{
		printf("-----------------------\n");
		printf("-----1.add    2.sub----\n");
		printf("-----3.mul    4.div----\n");
		printf("-------- 0.exit -------\n");
		printf("请选择:");
		scanf("%d", &input);
		if (input <= 4 && input >= 1)
		{
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = (*ptr[input])(x, y);
			printf("ret=%d\n", ret);
		}
		else if (input == 0)
			printf("退出\n");
		else
			printf("输入错误\n");
	} while (input);
	return 0;
}
  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值