文章目录
- 1. 字符指针变量
- 2. 数组指针变量
- 3. 二维数组传参的本质
- 4. 函数指针变量
- 5. typedef关键字
- 6. 函数指针数组
- 7. 函数指针数组的应用—转移表
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;
}