前言
接下来我只讲指针的最常见用法,比如这一章的内容----返回指针的函数 与 指向函数的指针
一、返回指针的函数
指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的。
返回指针的函数的一般形式为:类型名 * 函数名(参数列表) eg: char * upper(参数){} 返回指向char型的指针变量
比如下面这个函数,返回一个指向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 return dest;
21 }
里面的代码我就不详细解释了,重点看第2行的定义形式。
调用这个函数也非常简单:
int main()
{
// 定义一个字符串变量
char str[] = "lmj"; // 调用函数
char *dest = upper(str); printf("%s", dest);
return 0;
}
输出结果:
二、指向函数的指针
看到这个标题,你可能觉得很诧异,指针竟然可以指向一个函数,那我就先解释一下为什么指针可以指向一个函数?
1.为什么指针可以指向一个函数?
函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址。
2.指向函数的指针的定义
定义的一般形式:函数的返回值类型 (*指针变量名)(形式参数1, 形式参数2, ...);
注意:形式参数的变量名可以省略,甚至整个形式参数列表都可以省略
1 #include <stdio.h>
2
3 int sum(int a, int b) {
4 return a + b;
5 }
6
7 int main()
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 }
* 第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> 指向函数的指针变量主要有两个用途:
调用函数
将函数作为参数在函数间传递。我这么一说,可能还不是很明白,举个例子(重要)。
1 #include <stdio.h>
2
3 // 减法运算
4 int minus(int a, int b) {
5 return a - b;
6 }
7
8 // 加法运算
9 int sum(int a, int b) {
10 return a + b;
11 }
12
13 // 这个counting函数是用来做a和b之间的计算,至于做加法还是减法运算,由函数的第1个参数决定
14 void counting( int (*p)(int, int) , int a, int b) {
15 int result = p(a, b);
16 printf("计算结果为:%d\n", result);
17 }
18
19 int main()
20 {
21 // 进行加法运算
22 counting(sum, 6, 4);
23
24 // 进行减法运算
25 counting(minus, 6, 4);
26
27 return 0;
28 }
如果以后想再增加一种乘法运算,非常简单,根本不用修改counting函数的代码,只需要再增加一个乘法运算的函数
int mul(int a, int b) {
return a * b;
}
然后counting(mul, 6, 4);就可以进行乘法运算了
12-返回指针的函数&&指向函数的指针的更多相关文章
-
【C语言】-返回指针的函数与指向函数的指针
本文目录 前言 一.返回指针的函数 二.指向函数的指针 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.i ...
-
【C语言】14-返回指针的函数与指向函数的指针
前言 前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧.指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理.提升程序性能.关于指针的内容还非常多,比如 ...
-
int (*(*fp)(void *))[10]; 指向函数的指针类型
<pre lang="c" escaped="true">int (*(*fp)(void *))[10]; //这个类型用typedef分解出来 ...
-
《C++ Primer》之指向函数的指针
函数指针是指指向函数而非指向对象的指针.像其他指针一样,函数指针也指向某个特定的类型.函数类型由其返回类型以及形参表确定,而与函数名无关: // pf points to function retur ...
-
指向函数的指针 ------ 函数指针(function pointer)
函数指针: 指向函数的指针, 首先是一个指针, 这个指针指向一个函数. 函数具有可赋值给指针的物理内存地址,一个函数的函数名就是一个指针,它指向函数的代码.一个函数的地址是该函数的进入点,也是调用函数 ...
-
c/c++ 函数、常量、指针和数组的关系梳理
压力才有动力,15年中旬就要准备实习,学习复习学习复习学习复习学习复习……无限循环中,好记性不如烂笔头……从数组开始,为主干. c 的array由一系列的类型相同的元素构成,数组声明包括数组元素个数和 ...
-
Keil C51 中的函数指针和再入函数
函数指针是C语言中几个难点之一.由于8051的C编译器的独特要求,函数指针和再入函数有更多的挑战需要克服.主要由于函数变量的传递.典型的(绝大部分8051芯片)函数变量通过堆栈的入栈和出栈命令来传递. ...
-
C/C++ 指针函数 与 函数指针
指针函数是个函数,是返回指针类型到函数. 函数指针是个指针,是指向函数地址到指针. 区分两者的关键点是,函数名是否用*和括号“包围”起来. #include <stdio.h> int * ...
-
typedef void(*Fun) (void)是什么意思 函数指针(回调函数) 和函数对象总结
https://blog.csdn.net/FreeApe/article/details/49124043 bool (*pf)(const string &,const string &a ...
随机推荐
-
Play with docker 1.12
Docker v1.12 brings in its integrated orchestration into docker engine. Starting with Docker 1.12, w ...
-
Java API —— Map接口
1.Map接口概述 · 将键映射到值的对象 · 一个映射不能包含重复的键 · 每个键最多只能映射到一个值 2.Map接口和Collection接口的 ...
-
swing的第一课
Swing介绍 Swing API 可扩展 GUI组件,以减轻开发者的生活创造基于JAVA前端/GUI应用.它是建立在AWT API之上,并作为 AWTAPI 的更换,因为它几乎每一个控制对应 AWT ...
-
c# 函数简述
函数是具有独立功能,并且能够重复使用的代码块.函数必须先声明后调用,使用函数使代码更简洁易读. 一.函数的声明与调用 1.声明格式: static 返回类型 函数名(参数类型 参数名称,参数类型 参数 ...
-
html日历(1)
<html> <head> <link rel="stylesheet" type="text/css" href="S ...
-
js 判断数组中的值是否都相等
function isAllEqual(array) { if (array.length > 0) { return !array.some(function(value, index) { ...
-
python3.6.2(32位)的安装-1
简介:Python不需要编译成机器代码,是解释执行.解释器是机器指令,CPU执行解释器,解释器执行代码. 1.Python官网下载地址:https://www.python.org/,选择Downlo ...
-
Luogu P3957 跳房子
题面 跳房子,也叫跳飞机,是一种世界性儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 n 个格子,这些格子都在同一条直线上.每个格子内有一 ...
-
CentOS 7 - 最小化安装后,安装GNOME!!
CentOS 7的最小化安装,并没有安装任何X Window,GNOME是比较好的一个X Window,我决定安装GNOME! 通过yum grouplist命令,我发现GNOME已经处于可以安装列表 ...
-
mysql 通过sqoop导入hive
sudo -u hdfs sqoop import --connect jdbc:mysql://192.168.33.93:3306/leochentest --username root --pa ...