返回指针的函数与指向函数的指针

£神魔★判官ぃ 2022-05-31 07:39 328阅读 0赞

一、返回指针的函数

指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的。

返回指针的函数的一般形式为:类型名 * 函数名(参数列表)

比如下面这个函数,返回一个指向char类型变量的指针

复制代码

  1. 1 // 将字符串str中的小写字母变成大写字母,并返回改变后的字符串
  2. 2 // 注意的是:这里的参数要传字符串变量,不能传字符串常量
  3. 3 char * upper(char *str) {
  4. 4 // 先保留最初的地址。因为等会str指向的位置会变来变去的。
  5. 5 char *dest = str;
  6. 6
  7. 7 // 如果还不是空字符
  8. 8 while (*str != '\0') {
  9. 9 // 如果是小写字母
  10. 10 if (*str >= 'a' && *str <= 'z') {
  11. 11 // 变为大写字母。小写和大写字母的ASCII值有个固定的差值
  12. 12 *str -= 'a' - 'A';
  13. 13 }
  14. 14
  15. 15 // 遍历下一个字符
  16. 16 str++;
  17. 17 }
  18. 18
  19. 19 // 返回字符串
  20. 20 return dest;
  21. 21 }

复制代码

里面的代码我就不详细解释了,重点看第2行的定义形式。

调用这个函数也非常简单:

复制代码

  1. int main()
  2. {
  3. // 定义一个字符串变量
  4. char str[] = "lmj";
  5. // 调用函数
  6. char *dest = upper(str);
  7. printf("%s", dest);
  8. return 0;
  9. }

复制代码

输出结果:19105516-7a4ae30d001945aaa1217394a0ecf10a.png

回到顶部

二、指向函数的指针

看到这个标题,你可能觉得很诧异,指针竟然可以指向一个函数,那我就先解释一下为什么指针可以指向一个函数?

1.为什么指针可以指向一个函数?

函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址。

2.指向函数的指针的定义

定义的一般形式:函数的返回值类型 (*指针变量名)(形式参数1, 形式参数2, …);

注意:形式参数的变量名可以省略,甚至整个形式参数列表都可以省略

复制代码

  1. 1 #include <stdio.h>
  2. 2
  3. 3 int sum(int a, int b) {
  4. 4 return a + b;
  5. 5 }
  6. 6
  7. 7 int main()
  8. 8 {
  9. 9 // 定义一个指针变量p,指向sum函数
  10. 10 int (*p)(int a, int b) = sum;
  11. 11 // 或者 int (*p)(int, int) = sum;
  12. 12 // 或者 int (*p)() = sum;
  13. 13
  14. 14 // 利用指针变量p调用函数
  15. 15 int result = (*p)(1, 3);
  16. 16 // 或者 int result = p(1, 3);
  17. 17
  18. 18 printf("%d", result);
  19. 19 return 0;
  20. 20 }

复制代码

* 首先在第3行定义了一个sum函数,接收2个int类型的参数,返回值类型为int

* 然后在第10行定义了一个指向sum函数的指针变量p。注意p的定义形式:int (*p)(int a, int b),第1个int代表sum函数的返回值是int类型,然后*p是用括号()包住的,后面的int a和int b代表着sum函数的形参,其实完全可以省略。第10行、11行、12行都是可行

* 在第15行,先利用*p取出指向的函数,再传入参数调用函数。也可以采用第16行中的做法,这样就跟调用普通函数没什么区别

最后的输出结果:19015731-cb60d5d995364fb4ba493f932365d49b.png,毫无意外

3.使用注意

1> 由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的。难道p++就会指向下一个函数了?可笑至极!!没这回事。

2> 返回指针的函数的定义char *upper(char *str) 和 指向函数的指针的定义int (*p)(int a, int b)非常相似,使用时特别注意区分

3> 指向函数的指针变量主要有两个用途:

  • 调用函数
  • 将函数作为参数在函数间传递。我这么一说,可能还不是很明白,举个例子。

复制代码

  1. 1 #include <stdio.h>
  2. 2
  3. 3 // 减法运算
  4. 4 int minus(int a, int b) {
  5. 5 return a - b;
  6. 6 }
  7. 7
  8. 8 // 加法运算
  9. 9 int sum(int a, int b) {
  10. 10 return a + b;
  11. 11 }
  12. 12
  13. 13 // 这个counting函数是用来做a和b之间的计算,至于做加法还是减法运算,由函数的第1个参数决定
  14. 14 void counting( int (*p)(int, int) , int a, int b) {
  15. 15 int result = p(a, b);
  16. 16 printf("计算结果为:%d\n", result);
  17. 17 }
  18. 18
  19. 19 int main()
  20. 20 {
  21. 21 // 进行加法运算
  22. 22 counting(sum, 6, 4);
  23. 23
  24. 24 // 进行减法运算
  25. 25 counting(minus, 6, 4);
  26. 26
  27. 27 return 0;
  28. 28 }

复制代码

如果以后想再增加一种乘法运算,非常简单,根本不用修改counting函数的代码,只需要再增加一个乘法运算的函数

  1. int mul(int a, int b) {
  2. return a * b;
  3. }

然后counting(mul, 6, 4);就可以进行乘法运算了

发表评论

表情:
评论列表 (有 0 条评论,328人围观)

还没有评论,来说两句吧...

相关阅读

    相关 指向函数指针

    (一) 用函数指针变量调用函数   可以用指针变量指向整形变量、字符串、数组、结构体、也可以指向一个函数。一个函数在编译时被分配一个入口地址。这个入口地址就称为函数指针。可以

    相关 指向函数指针

    C/C++中的指针可以指向一个函数,也叫函数指针。 注:函数返回值是指针的叫指针函数,中心词在后面,即函数指针其实质是一个指针,指针函数其实质是函数。 还是以实例说话,下