C语言深入讲解函数的使用

目录
  • 关于函数
  • 1. 函数的定义形式
  • 2. 函数的声明
  • 3. 返回语句
  • 4. 函数参数
    • 4.1 形式参数(传值调用)
    • 4.2 实际参数(传址调用)
    • 4.3 无参数
  • 5. 函数的调用
    • 5.1 嵌套调用
    • 5.2 函数递归
  • 总结:

关于函数

函数是C语言的基本单元,函数中包含实现程序功能的代码。

C语言程序的入口位于main()函数之中,为了方便组织配合,调试和运行,一般是用main函数作为主调函数,通过调用其他的函数来实现程序的运行。

他们的关系图如下:

1. 函数的定义形式

先给大家看看完整的函数代码格式,先有个大概印象

int add(int a,int b);
//这是函数声明,告诉系统有这样一个函数
//注:如果函数写在main函数之前,那这句代码是可以省略的
int add(int a,int b)
{
	int c=a+b;
	return c;
}
  • 函数头

格式:

返回类型 函数名 (参数1,参数2,…)

对于上面函数例子int add(int a,int b)来说,add前面的int是返回类型,add是函数名,int a 是第一个参数,int b 是第二个参数。

翻译: 定义了一个名为add的函数,向函数传入两个整形数据后,函数会返回一个函数内部处理后的整形数据。

  • 函数体

函数名后带括号里的全部内容。函数体内部包括声明变量和执行完成函数功能的代码。

解释: 这里声明了整形变量c,用c接受了参数a和参数b相加后的值,然后add函数返回c的值。

2. 函数的声明

函数的声明的告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体内容还是要看函数内部的功能代码。

形式:

返回类型 函数名 (参数) ;

注意要有";"来结束声明。

3. 返回语句

在C语言学习中会经常看到这样一句代码return 0;这也是main函数的最后一句代码,其作用有以下两点:

  • 立即从当前函数中退出,返回到调运这个函数的程序中。
  • 将函数的返回值待会到调用这个函数的程序中。

来给大家看个例子:

//int Add5(int n);
//这里的函数声明在main函数之前,可以省略上面一行的代码
int Add5(int n)
{
	return n + 5;
	//看看return后面的语句能不能被执行
	printf("能执行的话吱一声");
}

int main()
{
	int a = 1,b=0;
	 b = Add5(b);
	 printf("%d", b);
	 return 0;
}

return 后面的代码是不会运行的。

4. 函数参数

参数根据其传送的方式分为形式参数和实际参数两种。

4.1 形式参数(传值调用)

形式参数的作用就算传送数值,它把参数的数值传入函数,但参数本身的值是不会被函数修改的,前面举的例子都是用的形参(形式参数的简称)。

下面给大家看看例子:

void fuc(int n);
//void类型即返回类型为空,不会有返回值,但还是会运行内部的代码。
//这里的声明不能省!函数的定义在main函数下面。
int main()
{
	int a = 10;
	fuc(a);//将a的值传给了n
	printf("%d", a);
	return 0;
}

void fuc(int n)//这里是函数的定义
{
	n = 0;
}

结果打印a的值为10,没有被fuc()修改成0。

4.2 实际参数(传址调用)

实际参数是通过把参数的地址传到函数内部,函数通过地址直接修改实际变量的值,因此,实际参数是可以通过函数修改的。

这里看看传递实参的效果:

void fuc(int* n);
//改动1 n的类型是指针,它存的是实际变量的地址
int main()
{
	int a = 10;
	fuc(&a);
	//改动二 &为取地址符,直接获取变量的地址,这里是把a的地址传送到函数内部
	printf("%d", a);
	return 0;
}

void fuc(int* n)//改动三 其实和改动一是一样的
//这里的变量是n,n的类型是int*,n现在是变量a的地址
{
	*n = 0;
}

对于*n = 0;

*为解引用操作符,可以取出地址里面储存的值这里是把n中储存的地址对应的数赋值为0

运行结果如下,a的值被更改为0

4.3 无参数

很多时候函数是不需要参数的,没有参数是不会影响函数运行的,一般打印菜单的话是不用设置参数的,这里随便给大家展示一下:

void  Member_Menu();
void  Member_Menu()
{
	printf("*******************\n");
	printf("用户管理:>>\n请输入您想进行的操作:\n1.会员添加\n2.会员删除\n3.会员修改\n");
}

运行时函数的功能就是打印菜单。

5. 函数的调用

5.1 嵌套调用

函数内部是可以再调用其他函数的。如:

void fuc1()
{
 printf("函数1");
 }
 void fuc2()
 {
 printf("函数2");
 }
 void fuc3()
 {
	fuc1();
	fuc2();
 }
 int main()
{
	fuc3();
	return 0;
}

5.2 函数递归

递归简单来说是自己调用自己,这种调用十分巧妙,它可以用少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

递推实现的重点:

  • 找到递推公式
  • 设置结束标志

现在给大家展示一下递归的使用:

斐波那契数列:F(0)=1,F(1)=1,F(n) = F(n-1) + F(n-2) (n>=2)

递归版本:

int fib(int n)
{
 if (n <= 2)
 return 1;
    else
    return fib(n - 1) + fib(n - 2);
}

非递归版本:

int Fib()
{
	int n,m=1,k,j,i=0;
	scanf_s("%d", &n);
	if (n == 0 || 1 == n)
		i = 1;
	if (n > 1)
	{
		for (k = 1, i = 1; k < n; k++)
		{
			j = i;//储存i即n-1
			i += m;//n=n-1  +n-2
			m = j;//m==f(n-2)变成n-1,也就是下一个的n-2
		}
	}
	printf("%d", i);
}

简单对比一下给大家看看二者的区别,不过这里的递归只是以最低要求(完成任务)来写的,实际上这样写道话质量是很低的,这点下一次我们会详细说明的。

总结:

今天给大家带来的是简单的函数介绍,让大家简单了解函数声明,两种参数变量以及函数的调用方法。

到此这篇关于C语言深入讲解函数的使用的文章就介绍到这了,更多相关C语言 函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言三个函数的模拟实现详解

    目录 一.strcpy 二.模拟实现strcat 三.strcmp 总结: 一.strcpy //模拟实现strcpy #include<stdio.h> #include<assert.h> char* my_strcpy(char*dest, char*str) { assert(dest && str); char* tmp = dest; while (*str != '\0') { *dest = *str; dest++; str++; } *dest

  • C语言中函数的声明、定义及使用的入门教程

    对函数的"定义"和"声明"不是一回事.函数的定义是指对函数功能的确立,包括指定函数名,函数值类型.形参及其类型以及函数体等,它是一个完整的.独立的函数单位.而函数的声明的作用则是把函数的名字,函数类型以及形参的类型.个数和顺序通知编译系统,以便在调用该函数时进行对照检查(例如,函数名是否正确,实参与形参的类型和个数是否一致),它不包括函数体.--谭浩强 ,<C程序设计>(第四版),清华大学出版社,2010年6月,p182 这段论述包含了许多概念性错误,这

  • C语言中操作字符串的函数详解

    目录 一.函数表 二.strlen 实例 三.strcmp 实例 四.strcpy 实例 五.stract 实例 六.strchr 实例 总结 一.函数表 函数名 函数 功能 strlen size_t strlen(const char* s); 返回字符串 s 的长度(不包括结尾的0) strcmp int strcmp(const char* s1, const char* s2); 比较两个字符串,返回:如果 s1 == s2,返回 0:如果 s1<s2 则返回小于 0 (如 -1):如

  • C语言 超详细讲解库函数

    目录 1 返回整数的getchar函数 2 更新顺序文件 3 缓冲输出与内存分配 4 库函数 练习 1 返回整数的getchar函数 代码: #include<stdio.h> int main() { char c; while((c = getchar())!=EOF)//getchar函数的返回值为整型 putchar(c); return 0; } 上述代码有三种可能: 某些合法的输入字符在被"截断"后使得c的取值与EOF相同,程序将在复制的中途停止. c根本不可能

  • C语言深入讲解函数的使用

    目录 关于函数 1. 函数的定义形式 2. 函数的声明 3. 返回语句 4. 函数参数 4.1 形式参数(传值调用) 4.2 实际参数(传址调用) 4.3 无参数 5. 函数的调用 5.1 嵌套调用 5.2 函数递归 总结: 关于函数 函数是C语言的基本单元,函数中包含实现程序功能的代码. C语言程序的入口位于main()函数之中,为了方便组织配合,调试和运行,一般是用main函数作为主调函数,通过调用其他的函数来实现程序的运行. 他们的关系图如下: 1. 函数的定义形式 先给大家看看完整的函数

  • C语言深入讲解函数参数的使用

    目录 一.函数参数 二.程序的顺序点 三.小结-上 四.调用约定 五.可变参数 六.可变参数的限制 七.小结-下 一.函数参数 函数参数在本质上与局部变量相同在栈上分配空间 函数参数的初始值是函数调用时的实参值 函数参数的求值顺序依赖于编译器的实现 下面看一个函数参数的求值顺序的示例: #include <stdio.h> int func(int i, int j) { printf("i = %d, j = %d\n", i, j); return 0; } int m

  • C语言超细致讲解函数递归

    目录 前言 什么是递归 递归的两个必要条件 题解递归 递归与迭代 练习题 结束语 前言 最近被函数递归困恼许久,今天就带领大家一起探秘递归. 什么是递归 程序调用自身的编程技巧称为递归( recursion). 递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接 调用自身的 一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解, 递归策略 只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量. 递归的主

  • R语言的xtabs函数实例讲解

    今天在做一个列联表独立性检验的时候,总是无法处理好要求的数据类型,偶然的机会,看到了xtabs()函数,感觉很适合用来做列联表,适合将一列数据转换成列联表. shifou <- c("yes","yes","no","no") xinbie <- c("nan","nv","nan","nv") freq <- c(34,38,2

  • C语言全方位讲解指针与地址和数组函数堆空间的关系

    目录 一.一种特殊的变量-指针 二.深入理解指针与地址 三.指针与数组(上) 四.指针与数组(下) 五.指针与函数 六.指针与堆空间 七.指针专题经典问题剖析 一.一种特殊的变量-指针 指针是C语言中的变量 因为是变量,所以用于保存具体值 特殊之处,指针保存的值是内存中的地址 内存地址是什么? 内存是计算机中的存储部件,每个存储单元有固定唯一的编号 内存中存储单元的编号即内存地址 需要弄清楚的事实 程序中的一切元素都存在于内存中,因此,可通过内存地址访问程序元素. 内存示例 获取地址 C语言中通

  • C语言超全面讲解函数的使用方法上

    目录 一.函数的分类 1.库函数 2.自定义函数 3.库函数的分类 二.函数调用 1.传值调用 2.传址调用 三.函数的声明 四.函数定义 五.函数的参数 1.形式参数(形参) 2.实际参数(实参) 六.函数的练习 C语言超全面讲解函数的使用方法下 一.函数的分类 1.库函数 库函数是C语言基础库为了方便程序员进行软件开发而提供了一系列的函数,可以支持可移植性和提高程序的效率. ️ 注意:库函数需要引头文件. 例如:strlen函数的头文件是<string.h> 2.自定义函数 自定义函数和库

  • C语言超全面讲解函数的使用方法下

    目录 一.函数的嵌套调用 二.函数的链式访问 三.函数递归 递归的优缺点 必要条件 使用场景 函数递归的细节说明 举例说明 对两个必要条件的理解 四.递归练习 C语言超全面讲解函数的使用方法上 一.函数的嵌套调用 在定义函数时,一个函数内不能再定义另一个函数,即不能嵌套定义,但可以嵌套调用函数,即在调用一个函数的过程中,又调用另一个函数. ️注意: 函数可以嵌套调用但是不可以嵌套定义. 每一个函数都应该在大括号的外面独立存在. 代码示例: 根据这张图可以清楚的看到,three_line() 函数

  • C语言超详细讲解函数栈帧的创建和销毁

    目录 1.本节目标 2.相关寄存器 3.相关汇编指令 4.什么是函数栈帧 5.什么是调用堆栈 6.函数栈帧的创建和销毁 (1).main函数栈帧的创建与初始化 (2).main函数的核心代码 (3).Add函数的调用过程 (4).Add函数栈帧的销毁 (5).调用完成 7.对开篇问题的解答 1.本节目标 C语言绝命七连问,你能回答出几个? 局部变量是如何创建的?为什么局部变量不初始化其内容是随机的?有些时候屏幕上输出的"烫烫烫"是怎么来的?函数调用时参数时如何传递的?传参的顺序是怎样的

  • C语言详细讲解strcpy strcat strcmp函数的模拟实现

    目录 一.模拟实现strcpy函数 二.模拟实现strcat函数 三.模拟实现strcmp函数 四.小结 一.模拟实现strcpy函数 strcpy函数是字符串拷贝函数,就是将源字符串拷贝到目标空间中. char * strcpy ( char * destination, const char * source );//库函数中的声明 将源(source)指向的c字符串复制到目标(destination)指向的数组中,包括终止的空字符(并在该点停止). 为避免溢出,目标(destination

  • C语言深入讲解动态内存分配函数的使用

    目录 一.malloc 二.free(用于释放动态开辟的空间) 三.calloc 四.realloc 五.常见的动态内存分配错误 六.柔性数组 局部变量和函数的形参向栈区申请空间 全局变量和static静态变量向静态区申请空间 动态内存分配向堆区申请空间(位于<stdlib.h>或<cstdlib>头文件) 一.malloc void* malloc (size_t size); 分配内存块 分配一个连续可用的字节内存块,返回指向该内存块开头的指针. 新分配的内存块的内容未初始化,

随机推荐