指针函数和函数指针
2021-10-10 本文已影响0人
lxr_
//指针函数int *p():返回值为指针类型的函数,不要返回局部变量的指针,因为其作用域仅限于函数内
//函数指针int (*p)():
#include <stdio.h>
//***********指针函数*****************
char* getWord(char c)
{
char str1[] = "apple";
char str2[] = "banana";
switch (c)
{
case 'A':return "Apple"; //而此字符串存储于常量区
case 'a':return str1; //若运行此语句,出错,不能返回局部变量地址
case 'B':return "Banana";
case 'b':return str2; //出错,不能返回局部变量地址
case 'C':return "Cat";
default:return "None";
}
}
//**************函数指针********************
int square(int num)
{
return num * num;
}
//**************函数指针作为参数********************
int add(int num1, int num2)
{
return num1 + num2;
}
int sub(int num1, int num2)
{
return num1 - num2;
}
int calc(int (*fp)(int , int),int num1,int num2)
{
return (*fp)(num1, num2);
}
//************函数指针作为返回值**************
int (*select(char op))(int, int) //先select(char)是一个函数,再加*返回整形并带有两个参数(int,int)的函数指针
{
switch (op)
{
case '+':return add;
case '-':return sub;
default:
break;
}
}
int main(int argc, char** argv)
{
//*************指针函数**************
char input;
printf("请输入一个字母:");
scanf_s("%c", &input,1); //与scanf一样的功能,此函数更安全,表示最多读取一个字符,防止内存访问越界
printf("%s\n", getWord(input));
//*************函数指针***************
//不直接调用,而通过函数指针引用square,然后通过函数指针调用square
int num;
int (*fp)(int); //定义函数指针fp,指向的函数类型为int
printf("请输入与一个数字:");
scanf_s("%d", &num);
fp = square; //函数名其实就表示地址
printf("%d*%d=%d\n", num, num, (*fp)(num));
//printf("%d*%d=%d\n", num, num, fp(num)); //这样也可以,但不建议,fp容易被认为是函数
//************函数指针作为参数************
printf("3+5=%d\n", calc(add, 3, 5)); //3+5=8
printf("3-5=%d\n", calc(sub, 3, 5)); //3-5=-2
//************函数指针作为返回值**************
int num1, num2;
char op;
int (*fpp)(int, int);
printf("请输入一个式子(如1+3):");
scanf("%d%c%d", &num1, &op, &num2); //visual studio使用scanf时报错的话可采取如下解决办法:https://jingyan.baidu.com/article/49711c616b8a1ffa441b7cdc.html
fpp = select(op);
printf("%d %c %d = %d\n", num1, op, num2, calc(fpp, num1, num2));
return 0;
}