c语言不用指针函数全排列,【C语言】14-返回指针的函数与指向函数的指针

说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对C语言、iOS开发不感兴趣,请忽略

前言

前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧。指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理、提升程序性能。关于指针的内容还非常多,比如指针数组、指向数组的指针、指向指针的指针,呵呵,看到这些名字是否都觉得头大了,不过我就暂时不在博客中讲解这些内容了,我只讲述在iOS开发中指针的最常见用法,比如这一章的内容----返回指针的函数 与 指向函数的指针

一、返回指针的函数

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

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

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

1 //将字符串str中的小写字母变成大写字母,并返回改变后的字符串2 //注意的是:这里的参数要传字符串变量,不能传字符串常量

3 char * upper(char *str) {4 //先保留最初的地址。因为等会str指向的位置会变来变去的。

5 char *dest =str;6

7 //如果还不是空字符

8 while (*str != '\0') {9 //如果是小写字母

10 if (*str >= 'a' && *str <= 'z') {11 //变为大写字母。小写和大写字母的ASCII值有个固定的差值

12 *str -= 'a' - 'A';13 }14

15 //遍历下一个字符

16 str++;17 }18

19 //返回字符串

20 returndest;21 }

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

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

intmain()

{//定义一个字符串变量

char str[] = "lmj";//调用函数

char *dest =upper(str);

printf("%s", dest);return 0;

}

输出结果:

2959c9faaa5f8c2ce0e54bba4431aa6f.png

二、指向函数的指针

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

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

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

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

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

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

1 #include

2

3 int sum(int a, intb) {4 return a +b;5 }6

7 intmain()8 {9 //定义一个指针变量p,指向sum函数

10 int (*p)(int a, int b) =sum;11 //或者 int (*p)(int, int) = sum;12 //或者 int (*p)() = sum;13

14 //利用指针变量p调用函数

15 int result = (*p)(1, 3);16 //或者 int result = p(1, 3);

17

18 printf("%d", result);19 return 0;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行中的做法,这样就跟调用普通函数没什么区别

最后的输出结果:

63658c8ce5b8dfa4c237074dfa52d792.png,毫无意外

3.使用注意

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

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

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

调用函数

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

1 #include

2

3 //减法运算

4 int minus(int a, intb) {5 return a -b;6 }7

8 //加法运算

9 int sum(int a, intb) {10 return a +b;11 }12

13 //这个counting函数是用来做a和b之间的计算,至于做加法还是减法运算,由函数的第1个参数决定

14 void counting( int (*p)(int, int) , int a, intb) {15 int result =p(a, b);16 printf("计算结果为:%d\n", result);17 }18

19 intmain()20 {21 //进行加法运算

22 counting(sum, 6, 4);23

24 //进行减法运算

25 counting(minus, 6, 4);26

27 return 0;28 }

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

int mul(int a, intb) {return a *b;

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值