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 ...
随机推荐
- java中DatagramSocket连续发送多个数据报包时产生丢包现象解决方案
try { //向指定的ip和端口发送数据~! //先说明一下数据是谁发送过来的! byte[] ip = InetAddress.getLocalHost().getHostAddress().ge ...
- epoll源码实现分析[整理]
epoll用法回顾 先简单回顾下如何使用C库封装的3个epoll相关的系统调用.更详细的用法参见http://www.cnblogs.com/apprentice89/archive/2013/05/ ...
- [OpenCV] HighGUI
From: http://www.cnblogs.com/xylc/p/3406026.html 本模块为跨平台的gui/IO组件,支持平台包括windows,linux,mac,IOS,androi ...
- solrcloud使用中遇到的问题及解决方式
首先声明,我们团队在使用solrcloud过程中踩了一些坑,同事(晓磊和首富)进行了总结,我列到我的博客上做记录用: Q:为什么Solr里面的时间比数据库里面早8小时? Solr默认采用的时区是UTC ...
- Node.js Web 开发框架大全《静态文件服务器篇》
这篇文章与大家分享优秀的 Node.js 静态服务器模块.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编写能 ...
- Fast Image Cache – iOS 应用程序高性能图片缓存
Fast Image Cache 是一种在 iOS 应用程序中高效.持续.超快速的存储和检索图像的解决方案.任何良好的 iOS 应用程序的用户体验都应该是快速,平滑滚动的,Fast Image Cac ...
- Muduo 多线程模型对比
本文主要对比Muduo多线程模型方案8 和方案9 . 方案8:reactor + thread pool ,有一个线程来充当reactor 接受连接分发事件,将要处理的事件分配给thread pool ...
- Android程序ToDoList增加配置项页面
本文要做的事情就是在前面做的简单的ToDoList程序上增加一个配置项页面(Reference).这个Reference页面也非常简单: 这个ToDoList现在有两个页面,主页面能填写待办事项,然后 ...
- IOS开发UI基础UITextFidle相关属性
UITextFidle相关属性 • enablesReturnKeyAutomatically默认为No,如果设置为Yes,文本框中没有输入任何字符的话,右下角的返回按钮是disabled的. ...
- C#客户端Redis服务器的分布式缓存
介绍 在这篇文章中,我想介绍我知道的一种最紧凑的安装和配置Redis服务器的方式.另外,我想简短地概述一下在.NET / C#客户端下Redis hash(哈希类型)和list(链表)的使用. 在这篇 ...