内容:
回忆1,2,3
四,数组传参和指针传参
一维数组的传参
[]里面的内容能够省略
arr是首元素地址
传递的是地址可使用指针变量接收
也可使用相同类型的数组进行接收,可是不要求数组长度
二维数组的传参
能够省略行可是不能省略列
二维数组传参时
当作一维数组的组合
首元素看作一维数组首元素的地址
利用数组指针进行接收
int (*)[5]是指针类型
arr是指针变量名
指向的是数组长度为5类型为int的数组
指针传参
形式参数是一级指针
实际参数能够是变量的地址
也能够是一级指针变量
形式参数是二级指针
实际参数能够是一级指针变量的地址
也能够是二级指针变量
还能够是指针数组
五,函数指针
&数组名取出的是数组的地址
数组名取出的是函数首元素的地址
类比:
&函数名取出的是函数的地址
函数名取出的是函数的地址,两者如出一辙
函数指针的写法
函数的返回类型 (void)(指针变量p )(形参类型char*)
函数指针的指针类型为
void (*)(char*)
两段有趣的代码(推荐一本书《C陷阱与缺陷》)
代码分析:
括号里面放一个类型,说明进行强制类型转换
(0强制类型转换为函数指针类型)就是函数的地址
这个函数为无参,无返回类型的函数
(*)解引用,找到这个函数
()而后调用这个函数
代码分析:
函数的返回类型是去掉函数名(形式参数)剩下 的就是函数的返回类型
signal函数的返回类型为void(*)(int)
他的返回类型也是个函数指针
代码二太复杂进行简化
重命名产生函数指针类型
注意:
函数指针的重命名与普通类型的重命名不同
将void(*)(int)函数的返回类型重命名为pfun_t
因此函数的声明变为(函数返回类型)pfun_t (函数名)signal (函数形参)(int , *pfun_t )
函数指针的使用:
解引用*函数指针变量名,而后传参
也能够屡次解引用
或者不解引用
均可以
pa是函数指针变量名
存放的是函数的地址
通常函数的调用Add(2,3);
因此(pa)(2,3);也能够
pa是函数指针变量名
存放的是函数的地址
*pa解引用pa就是根据pa所存储的函数的地址调用这个函数
因此(*pa)(2,3);也能够
注意:
*的优先级低于()的优先级
因此若是没打括号pa先与函数调用的括号结合在与*结合
就使用错误了
若是要使用*pa必须将其用括号括起来(*pa)
六,函数指针数组
函数指针数组的定义
多个函数的返回类型与参数都同样
相似指针数组,建立函数指针数组
parr先与[4]结合说明parr[4]是一个数组,每一个元素的类型是int(*)(int,int)
函数指针数组的使用:(*可加可不加)
练习:
1.char* my_strcpy(char* dest,const char* src);
char*(*pf)(char* ,const char* )=my_strcpy;
2.char*(*pfArr[4])(char* ,const char* )={my_strcpy1,my_strcpy2,my_strcpy3,my_strcpy4};
函数指针数组的案例:(计算器)
算法的通常实现:算法
#include<stdio.h> void mnue() { printf("------------------------------------------\n"); printf("------1.Add 2.Sub-----------------\n"); printf("------3.Mul 4.Div-----------------\n"); printf("------ 0.exit -----------------\n"); printf("------------------------------------------\n"); } 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 input = 0; int x = 0; int y = 0; do { mnue(); printf("请选择:"); scanf("%d", &input); switch (input) { case 1: printf("请输入两个操做数:"); scanf("%d%d", &x, &y); printf("%d + %d = %d\n", x, y, Add(x, y)); break; case 2: printf("请输入两个操做数:"); scanf("%d%d", &x, &y); printf("%d - %d = %d\n", x, y, Sub(x, y)); Sub(x, y); break; case 3: printf("请输入两个操做数:"); scanf("%d%d", &x, &y); printf("%d * %d = %d\n", x, y ,Mul(x, y)); break; case 4: printf("请输入两个操做数:"); scanf("%d%d", &x, &y); printf("%d / %d = %d\n", x, y, Div(x, y)); break; case 0: printf("退出\n"); break; default: printf("输入错误,请从新输入!\n"); } } while (input); return 0; }
封装函数,利用回调函数优化case里面的冗余项:
回调函数:数组
#include<stdio.h> void mnue() { printf("------------------------------------------\n"); printf("------1.Add 2.Sub-----------------\n"); printf("------3.Mul 4.Div-----------------\n"); printf("------ 0.exit -----------------\n"); printf("------------------------------------------\n"); } 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 Cacl(int (*pf)(int, int)) { int x = 0; int y = 0; printf("请输入两个操做数:"); scanf("%d%d", &x, &y); printf("%d\n", pf(x, y)); } int main() { int input = 0; do { mnue(); printf("请选择:"); scanf("%d", &input); switch (input) { case 1: Cacl(Add); break; case 2: Cacl(Sub); break; case 3: Cacl(Mul); break; case 4: Cacl(Div); break; case 0: printf("退出\n"); break; default: printf("输入错误,请从新输入!\n"); } } while (input); return 0; }
利用函数指针数组实现:
当功能多了的时候,case语句不会那么长了ide
#include<stdio.h> void mnue() { printf("------------------------------------------\n"); printf("------1.Add 2.Sub-----------------\n"); printf("------3.Mul 4.Div-----------------\n"); printf("------ 0.exit -----------------\n"); printf("------------------------------------------\n"); } 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 input = 0; int x = 0; int y = 0; do { mnue(); printf("请选择:"); scanf("%d", &input); int (*pArr[5])(int, int) = { 0,Add,Sub,Mul,Div }; //故意设5个,使得选择的函数能够对应下标 if (input >= 1 && input <= 4) { printf("请输入两个操做数:"); scanf("%d%d", &x, &y); printf("%d\n", pArr[input](x, y)); } else if (input == 0) { printf("退出\n"); } else { printf("输入错误,请从新输入!\n"); } } while (input); return 0; }