// // main.c // 指向函数的指针 #include <stdio.h> void test() { printf("哥被执行了 "); } int getAge() { return 30; } void sum(int v1, int v2) { int res = v1 + v2; printf("res = %i ", res); } int sum2(int v1 , int v2) { int res = v1 + v2; return res; } // 函数也会占用一块存储空间 // 因为函数也会占用一块存储空间所以函数也由自己的地址 // 函数的地址保存在函数名中 // 函数名就是函数的地址 == 数组名就是数组的地址 int main(int argc, const char * argv[]) { printf("test = %p ", test);//0x100000f00 /* 没有返回值没有参数 没有返回值有参数 有返回值没有参数 有返回值有参数 指向函数的指针的定义格式 void (*funtionP) (); * : 代表是一个指针 funtionP : 代表指针变量的名称, 区分 (*funtionP) : 代表将来指向一个函数 void : 代表将来指向的函数没有返回值 () : 代表将来指向的函数没有参数 普通指针的定义格式 数据类型 *指针变量名称 int *p; */ void (*funtionP) (); funtionP = test; // 注意: 千万不能写成test() test(); // 0x100000f00(); (*funtionP)(); //函数调用, funtionP是一个地址,*funtionP获取地址的值, // test == funtionP funtionP(); ////函数调用, int num = 10; int *p = # printf("%i ", *p); int ages[] = {1 , 3 ,5}; int *p; p = ages; // ages就是数组的地址 // p == ages; // ages[0]; // p[0]; // *(p + n); int (*ageP)(); ageP = getAge; printf("age = %i ", ageP()); // void (*sumP)(int v1, int v2); void (*sumP)(int, int); sumP = sum; sumP(10, 20); int (*sumP2)(int , int); sumP2 = sum2; printf("sum = %i ", sumP2(10, 20)); return 0; }
// // main.c // 指向函数的指针的应用场景 #include <stdio.h> int sum(int v1, int v2) { return v1 + v2; } int minus(int v1, int v2) { return v1 - v2; } // 让demo接受一个指向函数的指针 // 以后我们只需要给demo函数传递对应的指针, 那么函数内部就可以调用不同的函数 int demo(int v1, int v2) { return minus(v1, v2); } int demo2(int v1, int v2) { return sum(v1, v2); } int demo3(int v1, int v2, int (*p)(int, int) ) //回调函数 { return p(v1, v2); } int main(int argc, const char * argv[]) { // 定义一个方法, 给你两个数, 用户要求你做加法你就做加法, 用户要求你做减法, 那你就做减法 // printf("sum = %i ", sum(10, 20)); // printf("minus = %i ", minus(20, 10)); // printf("minus = %i ", demo(20 , 10)); // printf("sum = %i ", demo2(20 , 10)); printf("mins = %i ", demo3(20, 10, minus)); printf("sum = %i ", demo3(20, 10, sum)); return 0; }
// // main.c // 指向函数的指针练习 // 数组的指针类型加1是移到下一个元素位置的地址,通过*temp可以取得该位置的值。 #include <stdio.h> char upper(char value); void upperCase(char *p); //void ts(char *temp); void ts(char *temp, void (*funtionP)(char *)); int main(int argc, const char * argv[]) { // 需求: 要求用户输入一段英文, 将用户输入的英文单词所有的首字母大写 // hello world --> Hello World // 1.接收用户输入的字符串 // 2.遍历字符串, 判断当前字符是否是空格, 如果是空格就将下一个字符转换为大写 // 1.先实现接受字符串 // 2.再实现字母的大小写转换 // 3.再实现替换字符串中的单词首字符 printf("请输入一句英文, 单词之间用空格隔开 "); // char *str; char str[100]; // scanf("%s", str); gets(str); printf("str = %s", str); char c = 'a'; // + - 1 // printf("c = %c ", upper(c)); upperCase(&c); // *p == c printf("c = %c ", c); // 1.接收用户输入的数据 printf("请输入一句英文, 单词之间用空格隔开 "); char str[100]; gets(str); // 注意: 数组名称不能做+1操作, 只有指针才可以 printf("str = %s ", str); char *temp = str; // 2.遍历字符串 upperCase(temp); // temp == &str[0] while (*temp != '