C语言学习笔记 (009) - 对函数的进一步讨论
一。给main函数传参:
# include <stdio.h>
int main(int argc,char **argv){
printf("参数个数:%d,第一个参数“%s\n",argc,argv[]);
return ;
}
二。指向函数指针变量的定义
在 C 语言中函数名代表了函数的入口,因此可以定义一种指向函数的指针来存放这种地址。例如:
# include <stdio.h>
int fun(int a,int *p){
return a+*p;
}
int main(void){
int (*fp)(int,int*); /*这里的fp是一个指向函数的指针变量*/
int y,n = ;
fp = fun;
n =;
y = (*fp)(,&n);
printf("%d\n",y); /*此处是通过指向函数的指针调用函数*/
return ;
}
在这里,说明符(*fp)(int,int *)说明fp是一个指向函数的指针变量,这个函数必须是int 类型。说明符中若略去了*fp 外的一对圆括号,写成 *fp(int,int*),则说明的fp就不是指针变量,而是说明 fp 是一个函数,该函数的返回值类型是基类型为 double 的指针类型,这些类型名应与所指的函数参数的类型一一对应。如果所指函数没有形参,这一对圆括号也不能省略。
表达式fp = fun 把 fun 函数的地址赋予指针变量fp,此处 fp 的类型必须与 fun 的类型相同。语句 y = (*fp)(56,&n);实现对函数的调用,它相当于 y = fun(56,&n);
三。函数名或指向函数的指针变量作为实参:
函数名或指向函数的指针变量作为实参传给函数。这时,对应的形参应当是类型相同的指针变量:例如通过给 tran 函数传递不同的函数名,求tan x 和 cot 想值。
#include<stdio.h>
#include<math.h> //声明函数tran的原型,该数的返回值为double类型,
//tran函数第一个和第二个参数类型为返回值是double类型 形参是double类型的函数指针
//第三个参数为double类型变量
double tran(double (*)(double), double (*)(double), double ); int main(){
double y,v;//定义y,v变量他们的类型为double类型
v=*3.1416/180.0; //给变量v赋值,v的值为 60*3.1416/180.0
y=tran(sin,cos,v); //调用tran函数,传入sin,cos函数的指针 以及v变量
printf("tan(60)=%10.6f\n",y);//输出y的值,按照格式10个位宽,精确到小数点后6位
y=tran(cos,sin,v);//调用tran函数,传入cos,sin函数的指针 以及v变量
printf("cot(60)=%10.6f\n",y);//输出y的值,按照格式10个位宽,精确到小数点后6位
return ;
}
//实现tran函数
double tran(double (*f1)(double),double (*f2)(double), double x) {
return (*f1)(x)/(*f2)(x);//比方说第一次调用的时候传入的是sin,cos,v,那么结果就是sin(v)/cos(v)
}
函数 tran 有三个形参数 f1,f2,x。其中 f1 和 f2 是两个指向函数的指针变量,他们所指的返回值必须是 double 类型,所指函数有一个 double 类型的形参;第三个参数 x 是 double 类型的简单变量。
C语言学习笔记 (009) - 对函数的进一步讨论的更多相关文章
- Go语言学习笔记七: 函数
Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...
- Scala语言学习笔记——方法、函数及异常
1.Scala 方法及函数区别 ① Scala 有方法与函数,二者在语义上的区别很小.Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量.换句话来说在类中定义的函数即是方法 ② Scal ...
- [C语言学习笔记二] extern 函数的用法
extern 用来定义一个或多个变量.其后跟数据类型名和初始值.例如: extern int a =10 它与 int,long long int,double,char的本质区别,在于 extern ...
- R语言学习笔记:查看函数的R源代码
getAnywhere 该函数可以返回一些函数的R源代码,如: getAnywhere(kmeans) 该函数具体用法,请参看官方说明. Retrieve an R Object, Including ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 函数
函数是一组一起执行一个任务的语句.每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 可以把代码划分到不同的函数中.如何划分代码到不同的函数中是由您 ...
- 大一C语言学习笔记(5)---函数篇-定义函数需要了解注意的地方;定义函数的易错点;详细说明函数的每个组合部分的功能及注意事项
博主学习C语言是通过B站上的<郝斌C语言自学教程>,对于C语言初学者来说,我认为郝斌真的是在全网C语言学习课程中讲的最全面,到位的一个,这个不是真不是博主我吹他哈,大家可以去B站去看看,C ...
- 2017-04-21周C语言学习笔记
C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...
- GO语言学习笔记(一)
GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...
- ES6学习笔记<三> 生成器函数与yield
为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...
随机推荐
- 65. XPages自定义控件(三)高级搜索之三
RecordView控件的两个文件的完整代码在本文末尾给出.虽说完整,仅靠这两个文件,RecordView控件还不能正常工作,因为在这两个文件里还引用了其他自定义控件,调用了作为managed bea ...
- javascript计算字符串长度
javascript计算字符串长度 学习了:https://blog.csdn.net/u012934325/article/details/75214847 function getByteLen( ...
- Sqlite的多表连接更新
最近处理一个较大数据的sqlite库,基础表300万条,结果表30万条左右,我的笔记本跑起来还算流畅.最后结果,需要两个表连接,把另一个表的计算结果更新过来,却遇到麻烦.sqliter并不支持常见的连 ...
- Discuz常见小问题-如何取消帖子置顶
定位到一个帖子,然后顶部会有置顶的选项,还是勾选置顶,后面下拉列表选择无,然后点击确定,提示解除置顶
- Linux环境下网络编程杂谈《转》
今天我们说说“Pre-网络编程”.内容比较杂,但都是在做网络应用程序开发过程中经常要遇到的问题. 一.大端.小端和网络字节序 小端字节序:little-endian,将低字节存放在内存的起始地址: 大 ...
- Jmeter AbstractJavaSamplerClient 案例
1:首先到apache-jmeter-3.0\lib\ext目录下引用以下两个jar包到Java工程里面 ApacheJMeter_core.jar ApacheJMeter_java.jar 2:新 ...
- Mybatis 自动生成代码,数据库postgresql
最近做了一个项目,使用Mybatis自动生成代码,下面做一下总结,被以后参考: 一.提前准备: 1.工具类:mybatis-generator-core-1.3.2.jar 2.postgresql驱 ...
- Python标准库笔记(3) — datetime模块
datetime模块提供了简单和复杂的方式用于操纵日期和时间的类.虽然支持日期和时间运算,但实现的重点是为了输出格式化和操作高效地提取属性. 1. 模块内容 内容 描述 常量 datetime.M ...
- Webwork【07】文件上传下载
Web上传和下载应该是很普遍的一个需求,无论是小型网站还是大并发访问的交易网站.WebWork 当然也提供了很友好的拦截器来实现对文件的上传,让我们可以专注与业务逻辑的设计和实现,在实现上传和下载时顺 ...
- 【DB2】数据库的事务日志已满。SQLSTATE=57011
问题描述 在使用数据库的时候报错如上图,我们先使用db2 get db cfg for sample查看相关配置参数,其中sample为数据库名称 C:\Users\Thinkpad>db2 g ...