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 ...
随机推荐
- How to implement an algorithm from a scientific paper
Author: Emmanuel Goossaert 翻译 This article is a short guide to implementing an algorithm from a scie ...
- iOS-定时器
一.定时器的作用 在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 二.定时器的种类 大概有三种方法:NSTimer.CA ...
- 50 Android Hacks阅读笔记
Hack 1.善用weightSum和layout_weight. 问题提出:尝试做一个button的宽度是父View的一半的效果. 关键词:weightSum = 1 , layout_weight ...
- 关于window.onload,window.onbeforeload与window.onunload
★ window.onload 当页面加载完毕的时候执行,即在当前页面进行其他操作之前执行.如,刚进入某个网页的弹窗提示. ( 与window.onload相近的可以参考我写的另外一篇记录&qu ...
- Weex中文文档
这里整理当前已译出的Weex中文文档,如需查阅完整Weex文档,请访问http://alibaba.github.io/weex/doc/ . 同时也欢迎大家参与Weex中文文档翻译 [Guide] ...
- Azure开发者任务之三:理解Azure应用程序(上)
作为Windows Azure的托管服务被设计和开发的应用程序由这两部分组成: 1,托管代码 2,XML配置文件 托管代码对应不同的角色 XML文件对应不同的配置设置 我们可以看一下下面这张图,它详细 ...
- 重新想象 Windows 8 Store Apps (49) - 输入: 获取输入设备信息, 虚拟键盘, Tab 导航, Pointer, Tap, Drag, Drop
[源码下载] 重新想象 Windows 8 Store Apps (49) - 输入: 获取输入设备信息, 虚拟键盘, Tab 导航, Pointer, Tap, Drag, Drop 作者:weba ...
- js倒计时防页面刷新
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 启动Tomcat出现“Bad version number in .class file (unable to load class XXX)”解决
转载自:http://blog.csdn.net/justdb/article/details/8067887 主要是jdk版本的不搭配 保证tomcat 的jdk版本 项目的jdk版本 还有就是编译 ...
- Python函数:一个简单的迭代
#!/usr/bin/env python # -*- coding: utf-8 -*- def fact(n): if n == 1 : return 1 return n * fact(n-1) ...