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 (*pC语言)(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);就得展开乘法运算了。