// // main.c // 指向函数的指针 #include <stdio.h> void test() { printf("哥被执行了\n"); } int getAge() { return 30; } void sum(int v1, int v2) { int res = v1 + v2; printf("res = %i\n", res); } int sum2(int v1 , int v2) { int res = v1 + v2; return res; } // 函数也会占用一块存储空间 // 因为函数也会占用一块存储空间所以函数也由自己的地址 // 函数的地址保存在函数名中 // 函数名就是函数的地址 == 数组名就是数组的地址 int main(int argc, const char * argv[]) { printf("test = %p\n", 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\n", *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\n", 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\n", 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\n", sum(10, 20)); // printf("minus = %i\n", minus(20, 10)); // printf("minus = %i\n", demo(20 , 10)); // printf("sum = %i\n", demo2(20 , 10)); printf("mins = %i\n", demo3(20, 10, minus)); printf("sum = %i\n", 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("请输入一句英文, 单词之间用空格隔开\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)); upperCase(&c); // *p == c printf("c = %c\n", c); // 1.接收用户输入的数据 printf("请输入一句英文, 单词之间用空格隔开\n"); char str[100]; gets(str); // 注意: 数组名称不能做+1操作, 只有指针才可以 printf("str = %s\n", str); char *temp = str; // 2.遍历字符串 upperCase(temp); // temp == &str[0] while (*temp != '\0') { // h e l l o 空格 w,获取指针位置的值, // 如果等于空格就需要将下一个字符转换为大写 if ((*temp) == ' ') { upperCase(++temp); }else{ temp++; // 指针加1,移到下一个元素位置,数组的指针类型加1是移到下一个元素位置的地址,通过*temp可以取得该位置的值。 } } ts(str, upperCase); printf("str = %s", str); return 0; } void ts(char *temp, void (*funtionP)(char *)) { // 1.不管三七二十一先将第一个字母转换为大写 upperCase(temp); // temp == &str[0] while (*temp != '\0') { // h e l l o 空格 w // 2.1取出当前的字符, 判断是否等于 空格, 如果等于空格就需要将下一个字符转换为大写 if ((*temp) == ' ') { // 2.2将下一个字符转换为大写 // upperCase(++temp); // temp == &str[6]; == w funtionP(++temp); }else { temp++; // temp == &str[7]; } } } void upperCase(char* p) { // 1.判断是否是小写字母 if (*p >= 'a' && *p <= 'z') { // 2.将小写字母转换为大写字母 *p = *p - ('a' - 'A'); // 32 小写的ascii大于大写 } } char upper(char value) { // 1.判断是否是小写字母 if (value >= 'a' && value <= 'z') { // 2.将小写字母转换为大写字母 value = value - ('a' - 'A'); // 32 小写的ascii大于大写 } return value; }