C语言iOS开发 — C语言基础11(重临指针的函数与针对函数的指针)

iOS开发 — C语言基础11(再次来到指针的函数与针对函数的指针)

前言

眼前大家花了接近3个章节学习指针,应该都感受到指针的兵不血刃了吗。指针可以按照地点直接操作内存中的多少,使用万分的话,不仅能使代码量减少,还是可以优化内存管理、进步程序品质。关于指针的始末还卓殊多,比如指针数组、指向数组的指针、指向指针的指针,呵呵,看到那几个名字是不是都觉着头大了,可是自己就临时不在博客中助教那些情节了,我只讲述在iOS开发中指针的最普遍用法,比如这一章的内容—-重回指针的函数
指向函数的指针

一、再次回到指针的函数

指南针也是C语言中的一种数据类型,由此一个函数的重回值肯定能够是指针类型的。

回到指针的函数的形似形式为:类型名 * 函数名(参数列表)

例如上面那几个函数,重回一个指向char类型变量的指针

// 将字符串str中的小写字母变成大写字母,并赶回改变后的字符串

// 注意的是:那里的参数要传字符串变量,不可以传字符串常量

char * upper(char *str) {

// 先保留最初的地点。因为等会str指向的职责会变来变去的。

char *dest = str;

// 假设还不是空字符

while (*str != ‘\0’) {

// 假若是小写字母

if (*str >= ‘a’ && *str <= ‘z’) {

// 变为大写字母。小写和大写字母的ASCII值有个稳定的差值

*str -= ‘a’ – ‘A’;

}

// 遍历下一个字符

str++;

}

// 重返字符串

return dest;

}

里头的代码我就不详细解释了,重点看第2行的概念方式。

调用那个函数也极度简单:

int main()

{

// 定义一个字符串变量

char str[] = “lmj”;

// 调用函数

char *dest = upper(str);

printf(“%s”, dest);

return 0;

}

输出结果:

二、指向函数的指针

来看这几个标题,你可能认为很惊讶,指针竟然可以针对一个函数,那自己就先解释一下为啥指针可以本着一个函数?

1.怎么指针可以本着一个函数?

函数作为一段程序,在内存中也要占有部分存储空间,它也有一个发端地址,即函数的入口地址。函数有温馨的地方,那就好办了,大家的指针变量就是用来存储地点的。由此,可以行使一个指南针指向一个函数。其中,函数名就代表着函数的地点。

2.指向函数的指针的概念

概念的相似格局:函数的回到值类型 (*指南针变量名)(形式参数1, 方式参数2,
…);

小心:格局参数的变量名可以简单,甚至整个方式参数列表都得以省略

#include<stdio.h>

int sum(int a, int b) {

return a + b;

}

int main()

{

// 定义一个指南针变量p,指向sum函数

int (*p)(int a, int b) = sum;

// 或者 int (*p)(int, int) = sum;

// 或者 int (*p)() = sum;

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

int result = (*p)(1, 3);

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

printf(“%d”, result);

return 0;

}

* 首先在第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行中的做法,那样就跟调用普通函数没什么差异

最终的输出结果:

绝不意外

3.选择注意

1>
由于那类指针变量存储的是一个函数的输入地址,所以对它们作加减运算(比如p++)是空虚的。难道p++就会针对下一个函数了?可笑相当!!没那回事。

2> 重回指针的函数的定义char *upper(char *str) 和
指向函数的指针的定义int (*p)(int a, int b)卓殊相似,使用时尤其注意区分

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

调用函数

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

#include<stdio.h>

// 减法运算

int minus(int a, int b) {

return a – b;

}

// 加法运算

int sum(int a, int b) {

return a + b;

}

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

void counting( int (*p)(int, int) , int a, int b) {

int result = p(a, b);

printf(“总括结果为:%d\n”, result);

}

int main()

{

// 进行加法运算

counting(sum, 6, 4);

// 进行减法运算

counting(minus, 6, 4);

return 0;

}

若果之后想再追加一种乘法运算,万分不难,根本不用修改counting函数的代码,只须求再充实一个乘法运算的函数

int mul(int a, int b) {

return a * b;

}

接下来counting(mul, 6, 4);就足以开展乘法运算了。