C语言学习笔记:C语言的指针函数与函数指针??
前言
在C语言里函数、指针这两个词结合的顺序不同其意义也不同,即指针函数与函数指针的意义不同,这是什么情况呢?估计许多学习C语言的小伙伴已经感觉自己懵懵的了,别急且听小编来说个明白。
指针函数
指针函数的本质是一个函数,其返回值是一个指针。示例如下:
int *pfun(int, int);
由于“*”的优先级低于“()”的优先级,因而pfun首先和后面的“()”结合,也就意味着,pfun是一个函数。即:int *(pfun(int, int));
接着再和前面的“*”结合,说明这个函数的返回值是一个指针。由于前面还有一个int,也就是说,pfun是一个返回值为整型指针的函数。
指针函数示例程序如下:
#include <stdio.h>//这是一个指针函数的声明int *pfun(int *arr, int n);int main(void){int array[] = {0, 1, 2, 3, 4};int len = sizeof(array)/sizeof(array[0]);int *p;int i;//指针函数的调用p = pfun(array, len);for (i = 0; i < len; i++){printf("array[%d] = %d\n", i, *(p+i));}return 0;}//这是一个指针函数,其返回值为指向整形的指针int *pfun(int *arr, int n){int *p = arr;return p;}
程序运行结果如下:
主函数中,把一个数组的首地址与数组长度作为实参传入指针函数pfun里,把指针函数的返回值(即指向数组的指针)赋给整形指针p。最后使用指针p来遍历数组元素并打印输出。
这里推荐一下我建的C/C++语言学习交流秋秋裙,前三位是:110,中间三位是:355,最后三位是:025,里面有学习不错视频教程、开发工具、电子书籍,完整的项目源码等,专业的老师解答问题!
函数指针
函数指针其本质是一个指针变量,该指针变量指向一个函数。C程序在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。函数指针示例:
/*声明一个函数指针 */int (*fptr) (int, int);/* 函数指针指向函数func */fptr = func; // 或者fptr = &func;
func是一个函数名,那么func与&func都表示的是函数的入口地址。同样的,在函数的调用中可以使用:方式一:func(),也可以使用方式二:(*fun)()。这两种调用方式是等价的,只是我们平时大多都习惯用方式一的调用方法。
至于为什么func与&func的含义相同,《嵌入式Linux上的C语言编程实践》这本书中有如下解释:
对于函数func来说,函数的名称就是函数代码区的常量,对它取地址(&func)可以得到函数代码区的地址,同时,func本身也可以视为函数代码区的地址。因此,函数名称和对其取地址其含义是相同的。
函数指针示例程序如下:
#include <stdio.h>int add(int a, int b);int main(void){int (*fptr)(int, int); //定义一个函数指针int res; fptr = add; //函数指针fptr指向函数add/* 通过函数指针调用函数 */res = (*fptr)(1,2); //等价于res = fptr(1,2);printf("a + b = %d\n", res);return 0;}int add(int a, int b){return a + b;}
程序运行结果如下:
以上就是关于指针函数与函数指针的简单区分。其中,函数指针广泛应用于嵌入式软件开发中,其常用的两个用途:调用函数和做函数的参数。
C语言学习笔记:C语言的指针函数与函数指针??相关推荐
- c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...
C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...
- C语言学习笔记---001C语言的介绍,编译过程原理,工具等
C语言学习笔记---001C语言的介绍,编译过程原理,工具等 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技术交流平台:cre.i ...
- C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针
目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...
- 12-黑马程序员------C 语言学习笔记--- C语言指针与函数
黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培 ...
- c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...
目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...
- C语言学习笔记-01-C语言简介
1.1 C语言简介 C语言是一门面向过程.抽象化的通用程序设计语言,广泛应用于底层开发.C语言能以简易的方式编译.处理低级存储器,是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设 ...
- C语言学习笔记(1)--基本概念和函数用法
最近开始重新学习C语言,所谓"好记性不如烂笔头",把一些要记住的基本概念和一些函数用法,无论是书上看到的,或者是在别人的博客和论坛上帖子看到的,都归纳到这篇文章中: 2014-10 ...
- Go语言学习笔记——Go语言数据类型
布尔型 布尔型的值只可以是常量 true 或者 false.一个简单的例子:var b bool = true. 数字类型 整型 int 和浮点型 float32.float64,Go 语言支持整型和 ...
- C语言学习笔记---8C语言中的英文字符
在C语言中,单个字符的数据类型是char,长度是1字节,且只能容纳ASCII码表中的字符,也就是英文字符.字符类型由单引号' '包围,字符串由双引号" "包围. //正确的写法 c ...
- c语言float二进制输出代码_C语言学习笔记——学前知识概述
将我大一学习C语言时做的笔记拿来与大家分享,内容比较浅显,比较适合初学者,如有错误还请见谅,提出改正,谢谢! 前言:此C语言笔记是本人在自学时记录的一些重点或初学者常犯的错误,希望我的这本笔记能够对大 ...
最新文章
- jfinal框架下使用c3P0连接池连接sql server 2008
- 白话Elasticsearch30-IK中文分词之热更新IK词库
- CVPR2019接收结果公布了,但CVPR 2018的那些论文都怎么样了?
- leetcode 395. Longest Substring with At Least K Repeating Characters| 395. 至少有 K 个重复字符的最长子串(分治法)
- PHP以xml形式获取POST数据
- DropDownList实现无限分级
- Nexus 3.X(Maven仓库私服)仓库迁移与备份
- 为什么学习web前端,必须掌握JavaScript这门编程语言
- 一次Python性能调优经历
- 禅道程序员的10条原则--转载--为了不忘
- 从delegate到lambda表达式
- JZOJ 4230. 淬炼神体
- CSS综合案例——淘宝焦点图(轮播图)布局及网页布局总结
- 机器人翻译软件测试,对我国几种机器翻译软件译文质量的测评
- 嵌入式软件工程师和嵌入式硬件工程师有什么区别
- RT5350订制WIFI转串口
- 教你一招:使用最快速的方式激活windows10专业版
- Hackme Writeup
- 朝花夕拾 - 基金定投回顾及 2022 定投计划
- Python编曲实践(五):通过编写爬虫来爬取海量MIDI文件,预备构建数据集(附有百度云下载链接)
热门文章
- Python Socket 编程详细介绍
- Matlab利用牛顿迭代法求解非线性方程组
- markdown 图片索引
- 2019.8.1 每周反思
- 独家 | 数据化思维、 数字化陷阱和 0.01 突破
- 80句励志名言名句-用来时刻鞭策自己
- Jmeter 安装历史版本
- 用计算机做有理数混合运算,七年级数学上册1.12用计算器做有理数的混合运算教案(新版)北京课改版.doc-汇文网...
- 2023轩辕奖出炉,怿星科技共创荣誉
- cv2.RETR_TREE输入参数