C语言-->(八)函数

知识点:
1.函数基础
2.函数参数和返回值
3.形参和实参,变量的类型
4.函数声明
5.函数递归

==========================
函数基础

1.函数的定义格式

返回值类型  函数名(参数列表)

{

函数体

}

功能函数

// 函数可以没有形参play()
{   //  在这个大括号里面说清楚函数是干啥(里面包含了什么代码)
    printf("播放了MP3\n");
}

返回值,参数

形参:定义函数的时候,函数后面()中的变量

实参:调用函数的时候,传进去的值

#include <stdio.h>double average(int v1, int v2)    // 变量v1、v2称为“形式参数”,简称“形参”。 ()中的内容可以称为“形参列表”
{
    // 计算平均数
    double result = (v1 + v2)/2.0;

    // return的2个作用
    // 1.退出函数
    // 2.将右边的值返回给函数调用者
    return result;
}

// 任何C语言程序默认情况下,只会执行main函数
int main()
{
    // 调用函数
    play();

    // 调用average函数
    double d = average(10, 20);

    double d1 = average(30, 40);

    printf("d1 is %f\n", d1);

    return 0;
}

建议:

以后尽量把常用的代码\功能封装到一个函数里面去,这样可以提高代码重用率,可以提高可扩展性

2.函数作用
1)使程序结构清晰简洁
2)部分代码重复利用降低代码冗余
3)独立的工作内容和模块

3.函数的分类
使用角度分类:

API application programe interface

ASCII C89 C99 C11
1)标准c库函数,由系统实现好的一些列功能函数
如:printf, scanf, fabs, labs…

除c库以外的函数称为第三方函数

2)用户自定义函数,由用户自定义的功能函数

从函数形式分类:
1)无参函数 void
2)有参函数
3)有返回值 对应类型
4)无返回值 void

4.函数说明
1)一个程序有若干个文件,每个文件有若干个函数组成
2)c程序由main函数开始,也从main函数结束
3)源程序中的所有函数在结构上是平行的,互相独立的
4)main函数可以调用其他函数,函数之间可以相互调用

===========================
函数参数和返回值

2)调用过程中实参和形参
3.如果没有参数时一般将参数列表置空
没有参数时,参数列表一般填写void

3.return 作用分析
1)当函数需要有返回值的时候,用来将结果返回
2)思考:如果函数没有明确返回值的时候,是否可以使用?
3)return 的另外一个作用是提前结束该函数,并且返回到函数调用者处,return后的代码不会被执行
===========================
形参和实参关系
1.例子:交换两数
2.参数传递的方式和过程
1)值传递

2)地址传递
===========================
全局变量和局部变量
全局变量:共享数据
1.变量的分类
1)函数参数和内部变量称为局部变量
2)在函数外部的变量称为全局变量
2.作用域,生命周期(变量有效范围)
1)局部变量的作用域为当前函数,从变量开始到函数结束
2)全局变量的作用域为所有文件,从变量开始到程序结束
3.生命周期(变量的有效时间)
1)只在函数运行期间有效,一旦函数执行完毕后,变量将会被系统销毁
2)全局变量在整个程序运行期间有效,直到程序退出才会被系统销毁
4.参数屏蔽
局部变量屏蔽全局变量
局部变量和全局变量的变量名一致
===========================
函数声明
1.函数声明的作用
1)让调用者知道如何调用
2)让编译器在编译阶段判断函数调用是否正确
思考:函数声明是否有必要?如果没有声明会如何(从参数和返回值方面思考)

2.声明方式
声明了函数的名字,参数个数和类型,返回值类型
===========================
函数递归
例子:从前有座山…
1.什么是递归
函数调用自身的过程
2.递归作用
递归经常被用于解决计算机科学的问题。
3.应用场合
(1)数据的定义是按递归定义的。(Fibonacci函数)
(2)问题解法按递归算法实现。(回溯)
(3)数据的结构形式是按递归定义的。
(树的遍历,图的搜索)
4.实例:

1)计算1+2+3+…+n
练习:1.用函数递归计算1*2*3*…*n的值
2.用函数递归输入10进制,输出2进制 1010

2)用函数递归计算斐波那切数列
1>示例:通过循环实现斐波那切数列
2> 通过递归实现
5.递归缺点
1)递归算法解题相对常用的算法如普通循环等,运行效率较低。
因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况比
递归更为适合的时候。
2)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。
递归次数过多容易造成栈溢出等。

时间: 2024-07-29 10:29:52

C语言-->(八)函数的相关文章

实验八——函数定义及调用总结

实验八--函数定义及调用总结 1.本次课学习到的知识点: (1)void为不反回结果的函数,且void不能省略,否则默认为int,函数体中没有表达式的return语句,也可省略return. (2)不返回结果的函数在定义.调用.参数传递.函数声明上,思路与以前相同,适用于把一些确定的.相对独立的程序功能封装成函数. (3)局部变量:定义在函数的内部,且有效作用范局部变量一般定义在函数或复合语句的开始处,围局限于所在的函数内部,形参是局部变量. (4)不能定义在中间位置. (5)全局变量:定义在函

【学习笔记】【C语言】函数

一. 什么是函数 任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”.所以,你可以说C语言程序是由函数构成的. 比如你用C语言编写了一个MP3播放器程序,那么它的程序结构如下图所示: 二. 函数的定义 1. 定义函数的目的 将一个常用的功能封装起来,方便以后调用 2. 定义函数的步骤 函数名:函数叫什么名字 函数体:函数是干啥的,里面包含了什么代码 3. 格式 固定格式(很多语言的函数都是这么写的) 返回值类型 函数名(形式参数列

[C/C++基础] C语言常用函数sprintf和snprintf的使用方法

Sprintf 函数声明:int sprintf(char *buffer, const char *format [, argument1, argument2, -]) 用途:将一段数据写入以地址buffer开始的字符串缓冲区 所属库文件: <stdio.h> 参数:(1)buffer,将要写入数据的起始地址:(2)format,写入数据的格式:(3)argument:要写的数据,可以是任何格式的. 返回值:实际写入的字符串长度 说明:此函数需要注意缓冲区buffer溢出,要为写入的arg

C语言strlen()函数用法

C语言strlen()函数:返回字符串的长度 头文件:#include <string.h> strlen()函数用来计算字符串的长度,其原型为:unsigned int strlen (char *s);  s为指定的字符串 eg: #include<stdio.h> #include<string.h> int main() { char *str1 = "http://see.xidian.edu.cn/cpp/u/shipin/"; char

C语言_函数

函数 1.函数构成 int main(int argc, const char * argv[]) { // insert code here... return 0; } 返回值类型  函数名(函数参数) { 函数体语句: return 返回值: } 2.函数分类 1)标准函数 由官方或第三方库提供的函数,可以直接调用,无需实现: 2)自定义函数 由程序员自己实现的函数: 3.编写函数的步骤 1)声明函数 写在头文件 2)实现函数 写在原文件 3)调用函数 C阶段,一般在主函数调用 [注意事项

C语言学习-函数和递归函数

C源程序是由函数组成的,有且只有一个主函数(main()函数). 一.函数 1.自定义函数的书写格式: 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,…) { 函数体 }例如: 1 include <stdio.h> 2 void test(); 3 4 int main() { 5 test(); 6 return 0; 7 } 8 9 void test() { 10 11 printf("hello world!"); 12 13 } 2.定义函数的

C语言基础 函数--思想的体现

1.C语言由函数组成,main函数又称主函数,是程序的入口. 1.1函数定义:    1.1.1    格式:        返回值类型 函数名(形式参数列表)        {            函数体        }     1.1.2    函数名:  不允许相同 1.1.3    参数注意点:        1.形式参数: 定义函数时函数名后面括号中的参数,简称形参        2.实际参数: 调用函数时传入的具体数据,简称实参        3.实参个数必须等于形参个数    

C语言中函数和指针的参数传递

最近写二叉树的数据结构实验,想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个例子讨论一下c语言中指针作为形参的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个数据引用同一个数据,那么更改任意的一个都相当于更改了本体,那么另一个数据所对应的值也会改变,可是C中是没有这个概念的.所以就产生了一些东西.和我们本来想的有差别. 一.明确C语言中函数的入口: C语言中函数的形参负责接收外部数据,那么数据究竟怎么进入函数的呢,其实我们在函数体内操作的形参只是传递进来

从头开始-05.C语言中函数

函数: 完成特定功能代码段 特点:函数只有调用的时候才会执行 定义格式:返回值类型 函数名称(形参类型 形参名称,...){ 语句; ...  } 函数参数 形式参数:在定义函数的时候,函数名后面小括号中的参数 实际参数:在函数调用的时候,函数名后面小括号中的参数 注意点: 形参与实参必须一一对应 实参与形参的类型必须一致 基本数据类型作为函数参数传递是值传递 组作为函数参数传递是地址传递 指针作为函数参数传递是地址传递 结构体作为函数参数传递是值传递 返回值: return 作用: 1.结束函

C语言之函数可变参数

先上一段代码: #include<cstdarg> #include<iostream> #include<string> using namespace std; void error(char* format,...){//至少要有一个参数,后边的...表示参数可变 va_list ap; int d,flag; char c, *s; va_start(ap,*format);//从args参数开始后面都是可变参数,va_start,va_end都为宏 while