时间:2022-09-13 08:49:56 | 栏目:C代码 | 点击:次
数组:一个存放相同类型数据的存储空间。
int arr[10]; //数组arr的每个元素是int
指针数组:一个存放指针的数组。
int* arr[10]; //数组arr的每个元素是int*
函数指针:一个指向函数的指针,一般用函数名表示。
int Add(int x, int y) { return x + y; } int main() { int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int (*p)[10] = &arr; //取出数组的地址,p就是指向数组arr的指针,数组中每个元素类型是int,p就是数组指针 //引出函数指针的问题 int (*pf)(int, int) = &Add; //是一个指向函数的指针 - 存放函数的地址
需要注意的是,函数名是函数的地址,&函数名还是函数的地址,在visual stdio编译环境下能打印出同一地址。这里的函数指针pf是指向函数Add,其中(int, int)表示函数需要的两个形参类型是int,函数返回值类型是int。
函数指针数组:一个存放指针的数组,其中的指针都指向各自的函数。
//函数指针 int (*p)(int, int) = Add; int (*p)(int, int) = Sub; //Add和Sub是函数名,需要传入的两个形参和返回值类型都是int //将上面两个同类型的函数指针放入数组中,得到函数指针数组 int (* arr[2]) (int, int) = {Add, Sub};
函数指针数组的用途:转移表
#include <stdio.h> //实现加减乘除 int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } int sub(int a, int b) { return a * b; } int sub(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( "***************************\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; }
这里用到的switch循环语句,实现了数据的输入、输出和函数调用,结构与功能简单易懂,但主函数中代码太过冗长,重复的代码很多,这样的结构导致后期拓展函数功能需改动的地方非常多。
#include <stdio.h> //实现加减乘除 int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } int sub(int a, int b) { return a * b; } int sub(int a, int b) { return a / b; } int main() { int x, y; int input = 1; int ret = 0; int (*p[5])(int x, int y) = { 0, add, sub, mul, div };//转移表 while (input) { printf( "***************************\n" ); printf( " 1:add 2:sub \n" ); printf( " 3:mul 4:div \n" ); printf( "***************************\n" ); printf("请选择:"); scanf("%d", &input); if ((input <= 4 && input >= 1)) { printf("输入操作数: "); scanf("%d %d", &x, &y); ret = (*p[input])(x, y); } else { printf( "输入有误\n" ); printf( "ret = %d\n", ret ); } return 0; }
敲重点!!! 敲重点!!! 敲重点!!!
这里我们看到函数指针数组的用法是:数组内容(函数指针)解引用得到函数地址,接着传入参数,进行函数调用,结果返回一个整形(int)数据由ret接收。
ret = (*p[input])(x, y);
在代码中若出现许多函数同返回值类型,同参数类型时,使用函数指针数组是一个能大大简化代码,消除重复代码,是结构更加轻易易懂,为后期拓展更多功能函数提供便利。