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 ...
随机推荐
- php日期处理 -- 获取本周和上周的开始日期和结束日期(备忘)
Learn From: http://www.phpernote.com/php-function/1019.html 直接贴代码: <?php header('Content-type: te ...
- 编写高质量JS代码的68个有效方法(八)
[20141227]编写高质量JS代码的68个有效方法(八) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...
- Transact-SQL 示例 - UPDATE中使用INNER JOIN
一般情况下博主已经对在SELECT语句当中使用INNER JOIN非常娴熟,但在UPDATE当中使用INNER JOIN的场景就为数不多了.以下博主将为你介绍在UPDATE场景当中使用INNER JO ...
- LeetCode——Jump Game II
Description: Given an array of non-negative integers, you are initially positioned at the first inde ...
- java基础---->java中正则表达式二
跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...
- python——第二天
类和实例: 创建实例是通过类名+()实现 但是!可以自由地给每个实例变量绑定新的属性(特指以前在类定义中没有的属性) __init__方法用来给类定义必要的几个属性,第一个参数永远是self type ...
- 对Mathsapp的测试以及找bug
组员博客地址: 练思明 卓嘉炜:http://www.cnblogs.com/luoliuxi/ 何宇明:http://www.cnblogs.com/40heyuming/ 团队贡献分: 练思明:2 ...
- 网狐6603棋牌游戏源码.rar
网狐6603棋牌游戏源码.rar http://pan.baidu.com/s/1dFgGNq5 网络收集仅供学习,下载后请务必在24小时内删除! 以上是原vc6.0源码,下载后使用vs2015编译, ...
- 【iOS】利用Runtime特性做监控
最近在看Object-C运行时特性,其中有一个特别好用的特性叫 Method Swizzling ,可以动态交换函数地址,在应用程序加载的时候,通过运行时特性互换两个函数的地址,不改变原有代码而改变原 ...
- Java开发中的23种设计模式(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...