理解
函数也会占用一块存储空间
因为函数也会占用一块存储空间所以函数也由自己的地址
函数的地址保存在函数名中
函数名就是函数的地址 == 数组名就是数组的地址
定义
1.没有返回值没有参数
2.没有返回值有参数
3.有返回值没有参数
4.有返回值有参数
指向函数的指针的定义格式
void (*funtionP) ();
* :代表是一个指针
funtionP:代表指针变量的名称,区分
(*funtionP):代表将来指向一个函数
void: 代表有无返回值
(): 将来指向的函数有没有参数
画普通指针的定义格式
变量类型 * 指针名称;
int *p;
void (*funtionP)(void) = test; // 注意: 千万不能写成test()
test(); // 0x100000f00();
//(*funtionP)(); // 0x100000f00()
// test == funtionP
funtionP();
int (*funAge)(void) = getAge;
int age = funAge();
printf("age = %i\n", age);
int (*sumP) (int , int);
sumP = sum;
printf("这两个数的和 = %i\n", sumP(2,3));
void (*sum2P)(int,int) = sum2;
sum2P(4,5);
应用场景
当我们不确定参数 也不确定 是执行哪个函数的时候
让demo接受一个指向函数的指针
以后我们只需要给demo函数传递对应的指针, 那么函数内部就可以调用不同的函数
int sum (int a, int b)
{
return a +b;
}
int minus (int a, int b)
{
return a - b;
}
int demo3(int v1, int v2, int (*p)(int, int))
{
return p(v1,v2);
int (*funP)(int ,int);
funP = sum;
printf("这两个数的和 == %i",demo3(1, 2, funP));
funP = minus;
printf("这两个数的差 == %i", demo3(3, 1, funP));
}
指向函数的指针的练习
需求: 要求用户输入一段英文, 将用户输入的英文单词所有的首字母大写
hello world --> Hello World
1.先实现接受字符串
2.再实现字母的大小写转换
3.再实现替换字符串中的单词首字符
char upper(char value){
//先判断字母是大小写
if (value >= 'a' && value <= 'z') {
// 2.将小写字母转换为大写字母
value = value - ('a' - 'A'); // 32 小写的ascii大于大写
}
return value;
}
void upperCase (char *temp){
if (*temp >= 'a' && *temp <= 'z') {
// 2.将小写字母转换为大写字母
*temp = *temp - ('a' - 'A'); // 32 小写的ascii大于大写
}
}
void ts(char *temp, void (*funtionP)(char *));
int main(int argc, const char * argv[]) {
@autoreleasepool {
printf("请输入一句英文, 单词之间用空格隔开\n");
//char *str;
char str[100];
// scanf("%s", str);
gets(str);
printf("str = %s", str);
char c = 'a'; // + - 1
printf("c = %c\n", upper(c));
char *temp = str;
void (*funP)(char *) = upperCase;
ts(temp, funP);
printf("str = %s\n", str);
}
return 0;
}
void ts(char *temp, void (*funtionP)(char *))
{
funtionP (temp);
while (*temp !='\0') {
if (*temp == ' ') {
funtionP(++temp);
}else{
temp ++;
}
}
}
网友评论