C语言-04-函数
函数
函数是一组一起执行任务的语句,函数是一个可执行C程序必不可少的条件(至少一个main()函数),函数的定义形式
returnType functionName() {
bodyOf of the function
}
定义函数的意义
- 为某个经常使用的功能定义一个函数,可以提高代码的简洁性
- 封装函数功能的实现细节,提供一个可用的接口
- 可以构建函数库,使软件开发变得更加高效
函数的组成部分
- 返回类型
- 函数返回值的默认类型为int,若没有返回值,则返回类型为:void
- 标准函数库中的常见函数返回值的含义】
- main 函数的返回值为函数结束的状态
- printf 函数的返回值为字符常量的字符个数
- 返回值的注意事项
- 一个函数最多能返回一个值(swift语言中使用
元组实现了多返回值方案) - 若指定了返回值得类型,却未返回任何值,此时函数的返回值为一个未知的数
- 一个函数最多能返回一个值(swift语言中使用
- 函数名称
- 函数调用时使用的实际名称
- 函数签名
- 函数名与参数列表共同构成了函数签名
- 参数
- 为函数调用时的实际参数占位,函数可能不包含参数
- 参数的类型
- 形参
- 形参的作用域仅限于该函数,在进入函数时被创建,退出函数时被销毁
- 不能在函数内部定义与形参同名的变量,否则会将形参覆盖
- 实参
- 实参的个数必须与形参的个数相同
- 实参的类型必须与形参的类型一致,否则将造成数据失真
- 形参
- 参数列表
- 包含参数的类型、顺序、数量
- 函数参数的传递方式
- 值传递
- 将参数的实际值复制给形式参数,对实际参数没有影响
- 地址传递
- 将参数的地址复制给形式参数,对实际参数有影响
- 引用传递
- 将参数的引用复制给形式参数,对实际参数有影响
- 值传递
- 函数主体
- 函数执行的一系列语句
- 返回类型
函数的声明
- 为编译器提供函数的相关信息,在编译时只会被拷贝一次,可以重复声明
- 注意
- 函数在使用之前需要先定义或声明
- 每个声明的函数必须定义,否则链接时会报错
- 函数声明一般写在.h文件中,在使用时,用#include包含该文件
- 函数声明时,若有参数,参数列表是必须的,参数名不是必须的,即函数声明时可以没有参数名
函数的注意事项
- 不能定义同名函数
- 函数一般具有文件作用域,不允许嵌套定义
- 函数的嵌套调用要遵循堆栈规则
- 调用未定义和声明的函数,编译器只会发出警告
- 有时候需要写一个空函数,以便在后期的开发中实现相应的功能
函数的执行过程
- 调用函数,操作系统为函数分配一定空间的内存
- 在函数的内存空间定义形参,并将实参的值赋值给形参
- 对形参进行操作,完成指定功能
- 函数返回,操作系统撤销为函数分配的内存
示例
#include <stdio.h>
// 值传递
void swap1(int a, int b);
// 指针传递
void swap2(int *a, int *b);
// 引用传递
void swap3(int &a, int &b);
int main()
{
// 定义两个变量用于交换
int a = 10;
int b = 20;
// 值传递,不会改变a,b的值
swap1(a, b);
printf("a=%d, b=%d\n", a, b);
// 指针传递,会改变a,b的值
swap2(&a, &b);
printf("a=%d, b=%d\n", a, b);
// 引用传递,会改变a,b的值
swap3(a, b);
printf("a=%d, b=%d\n", a, b);
return 0;
}
// 值传递
void swap1(int a, int b)
{
//定义中间变量
int temp;
temp = a;
a = b;
b = temp;
}
//指针传递
void swap2(int *a, int *b)
{
//定义中间变量
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void swap3(int &a, int &b)
{
//定义中间变量
int temp;
temp = a;
a = b;
b = temp;
}
递归函数
- 递归函数注意事项
- 递归是函数反复调用自己
- 每个递归函数都必须有一个出口,一般通过改变参数来实现
- 符合堆栈规则,一般都可以使用递归
- 由于递归需要保持大量的中间数据,所以开销较大
- 迭代与递归的差别
- 迭代常常可以弥补递归开销较大的缺陷
- 迭代可以实现递归,反之不然
- 当递归带来的其他所有方面的好处足以弥补它开销大的缺陷时才使用递归,否则使用迭代
C语言-04-函数的更多相关文章
- C语言-04函数
1.参数 参数注意点 1.形式参数:定义函数时函数名后面中的参数,简称形参 2.实际参数:调用函数式传入的具体数据,简称实参 3.实参个数必须等于形参个数 4.函数体内部不能定义和形参一样的变量 5. ...
- Android C语言_init函数和constructor属性及.init/.init_array节探索
本篇文章主要介绍了"Android C语言_init函数和constructor属性及.init/.init_array节探索",主要涉及到Android C语言_init函数和c ...
- C语言pow函数编写
C语言pow函数编写 #include<stdio.h> double chaoba(double f,double q); //声明自定义函数 void main(void) { dou ...
- C语言-自定义函数
C语言自定义函数 --1-- 自定义函数定义 1.1 无参无返回值函数 1.2 无参有返回值函数 1.3 有参无返回值函数 1.4 有参有返回值函数 --2-- 函数的参数 2.1 形式参数介绍和使用 ...
- C语言printf()函数:格式化输出函数
C语言printf()函数:格式化输出函数 头文件:#include <stdio.h> printf()函数是最常用的格式化输出函数,其原型为: int printf( char ...
- C语言的函数
"函数"在英文的翻译是"function",无论在自然科学还是计算机科学都是这个词,而"function"的本意是"功能" ...
- c语言main函数返回值、参数详解(返回值是必须的,0表示正常退出)
C语言Main函数返回值 main函数的返回值,用于说明程序的退出状态.如果返回0,则代表程序正常退出:返回其它数字的含义则由系统决定.通常,返回非零代表程序异常退出. 很多人甚至市面上的一些书籍,都 ...
- Go语言示例-函数返回多个值
Go语言中函数可以返回多个值,这和其它编程语言有很大的不同.对于有其它语言编程经验的人来说,最大的障碍不是学习这个特性,而是很难想到去使用这个特性. 简单如交换两个数值的例子: package mai ...
- 【学习笔记】【C语言】函数
一. 什么是函数 任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”.所以,你可以说C语言程序是由函数构成的. 比如你用C语言编写了一 ...
- 【转载】 c语言inline函数的使用
c语言inline函数的使用 转载自:http://blog.chinaunix.net/uid-21843265-id-3056446.html 大学在教科书上学习过inline函数,定义为inli ...
随机推荐
- 【转载】dirs、pushd、popd指令
转载自:http://hi.baidu.com/linuxtrip/item/47a38c8eec00e98f4414cfb7 一.目录栈指令 目录栈是用户最近访问过的系统目录列表,并以堆栈的形式管理 ...
- Pagekit – 现代化技术构建的轻量的 CMS 系统
Pagekit 是一个模块化,轻量的 CMS 系统,基于现代化的技术,如 Symfony 组件和 Doctrine.它提供了一个很好的平台,用于主题和延伸开发.Pagekit 为您提供了工具来创造美丽 ...
- SQL Server里的INTERSECT ALL
在上一篇文章里,我讨论了INTERSECT设置操作的基础,它和INNER JOIN的区别,还有为什么需要好的索引设计支持.今天我想谈下SQL Server里并未实现的INTERSECT ALL操作. ...
- 我也想聊聊 OAuth 2.0 —— Access Token
这是一篇待在草稿箱半年之久的文章 连我自己都不知道我的草稿箱有多少未发布的文章了.这应该是我在上一家公司未解散之前写的,记得当时是要做一个开发者中心,很不幸. 今天,打开草稿箱有种莫名的伤感,看到这个 ...
- SQL Server技术问题之视图优缺点
优点: 一.简单性.视图不仅可以简化用户对数据的理解,也可以简化他们的操作.那些被经常使用的查询可以被定义为视图,从而使用户不必为以后的操作每次都指定全部的条件. 二.安全性.通过视图用户只能查询和修 ...
- 奥特曼小分队之四(Work Breakdown Structure)
写在前面的话:游戏介绍http://www.cnblogs.com/atmxfd/p/5415107.html 需求 我们的游戏是一款基于局域网的游戏,用户只需将服务端和客户端置于同一局域网下即可使用 ...
- [CLR via C#]26. 计算限制的异步操作
一.CLR线程池基础 前面说过,创建和销毁线程是一个比较昂贵的操作,太多的线程也会浪费内存资源.由于操作系统必须调度可运行的线程并执行上下文切换,所以太多的线程还有损于性能.为了改善这个情况,CLR使 ...
- 深入.NET内测题
一 选择题 1) 以下关于序列化和反序列化的描述错误的是( C). a) 序列化是将对象的状态存储到特定存储介质中的过程 b) 二进制格式化器的Serialize()和D ...
- ToDoList:一款非常优秀的任务管理软件 —— 工具类
ToDoList是一款非常优秀的任务管理软件,用户可以方便地组织和安排计划.这是一个开源的项目,很多细节都考虑到了,推荐大家使用~ ToDoList 帮你把要做的事情列出来,一项一项,类似思维导图. ...
- csharp:Nhibernate Procedure with CreateSQLQuery and GetNamedQuery
<?xml version="1.0" encoding="utf-8"?> <hibernate-mapping assembly=&quo ...