C函数编程基础

本文详细介绍了C语言中的函数,包括函数的定义、分类、参数传递、返回值以及调用方式。强调了函数的平行定义特性,主函数的特殊地位,以及函数声明和定义的区别。还探讨了返回语句的作用,函数参数的形参与实参概念,以及数组作为函数参数的处理。最后,讨论了函数调用的多种方式,如直接调用、嵌套调用和递归调用,并强调了合理使用函数能提高代码可读性和复用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

C中所有函数都是平行的,即相互独立,在一个函数中不能嵌套定义另一个函数,函数间可以互相调用,但main()函数不能被调用。
所有的C代码中必须有一个main()函数

一、🎃函数定义

  • 函数是c语言的功能单位,实现一个功能可以封装一个函数来实现。
  • 定义函数的时候一切以功能为目的,根据功能去定义函数的参数和返回值
  • 函数就是将特定功能的代码封装在一个函数内部,当要使用这些代码时,只需要通过函数名就可以使用,这样操作更加方便。

函数分类:
—— 从定义角度分类

  1. 库函数(c库实现的)
  2. 自定义函数(自己定义)
  3. 系统调用(操作系统实现的函数)

——从参数角度分类
- 有参函数
- 无参函数

——从返回值角度

  • 带返回值
  • 无返回值
①、函数定义形式

㈠、函数头:

  • 返回值类型
  • 函数名
  • 形式参数列表

㈡、函数体
由{}大括号括起来。

int  AddTwoNumber(int iNum1, int iNum2)
{
	int sum;
	sum = iNum1+ iNum2;
	return  sum;
}

在这里插入图片描述
在这里插入图片描述

㈢、特殊情况

  • 无参函数
    无参函数没有参数的函数
返回值    函数名()
{
	函数体
}

void ShowTime()
{
	printf("....");
}
  • 空函数
    空函数什么都没有做的函数,
类型说明符 函数名()
{
}

void Show()
{
}

在这里插入图片描述
在这里插入图片描述

注意:
函数名字是标识符,所以要满足标识符的命名规则
形参:可以有,也可以没有,即使没有,函数名字后面必须加大括号
函数体上下位置必须有大括号
如果要返回函数,极返回值,则return后的变量或值,必须与函数名左边返回值类型一致
形参必须带类型,且逗号隔开
函数的定义不能嵌套,即不能在一个函数体内定义另外一个函数
所有函数的定义是平行的
在一个程序中,相同函数名只能定义一次

//无参无返回值
void fun1()
{
	printf("HEllo!");
	printf("welcome to ?");
 } 
 
 //定义有参数
 void fun2(int a, int b)
 {
 	int sum;
 	sum = a + b;
 	printf("%d + %d = %d",a , b, sun);
  } 
  
   //定义有参数有返回值 
 int fun3(int a, int b)
 {
 	int sum;
 	sum = a + b;
 	
 	return sum; 
  } 
②、定义与声明

在这里插入图片描述

int ShowNumber(int num);

🙃如果将函数的定义放在调用函数之前,那就不需要运行运行函数的声明,此时函数的定义就包含函数的声明。

声明的方法:

——什么时候需要声明?

ⅰ、主函数和被调函数在同一个文件中
  1. 主调函数和被调函数在同一个.c文件中,被调函数在上,主调函数在下不需要声明
  2. 被调函数在下,主调函数在上需要声明
#include <stdio.h> 

//函数的声明:一般当子函数在主函数的下方,需要在主函数的上方进行声明

void fun1();
void fun2(int a, int b);
int fun3(int a, int b);

void main()
{
	//函数调用
	//函数在调用时没有参数,必须加括号
	//函数调用时无返回值,不用加返回值类型 
	fun1(); 
	
}

//无参无返回值 
void fun1()
{
	printf("HEllo!");
	printf("welcome to ?");
 } 
 
 //定义有参数
 void fun2(int a, int b)
 {
 	int sum;
 	sum = a + b;
 	printf("%d + %d = %d",a , b, sum);
  } 
  
   //定义有参数有返回值 
 int fun3(int a, int b)
 {
 	int sum;
 	sum = a + b;
 	
 	return sum; 
  } 
ⅱ、主函数和被调函数不在同一个文件中

一般用间接声明法——将函数的声明放在头文件中,.c程序包含头文件

fun.c
#include "fun.h"
void fun1()
{
	printf("HEllo!");
	printf("welcome to ?");
 } 
 
fun.h
#ifndef FUN_H
#define FUN_H

void fun1();

#endif

main.c

#include <stdio.h> 

void main()
{
	//函数调用
	//函数在调用时没有参数,必须加括号
	//函数调用时无返回值,不用加返回值类型 
	fun1(); 
	
}

在这里插入图片描述
在这里插入图片描述

二、🎃了解返回语句

常见的警告提示:
原因:缺少返回语句

return 0;

返回语句用途:

  • 返回语句能够立刻从函数中退出,回到调用程序中
  • 返回语句能返回值,将函数值赋给调用的表达式,
    在这里插入图片描述
①、从函数返回

存在两种方式:

  • 1、在函数体中,从头执行到尾部,程序遇见结束符“ } ” 返回
  • 2、采用函数返回语句 : return (表达式);

在这里插入图片描述

函数值类型和return语句中表达值不同。以返回值类型为准。

三、🎃传递函数参数

在这里插入图片描述

①、形参与实参

形参:形式参数,用于保存实参传递的值,本质跟实参没有任何关系,只是值传递
实参:实际参数,本质就是在函数调用的时候将实参的值传递给形参

在这里插入图片描述
在这里插入图片描述

②、数组做函数参数

数组作为函数的参数时,只传递数组的地址,而不是将整个数组赋值到函数中去。当用数组名作为实参调用函数时,则指向该数组的第一个元素指针就被传递到函数中。

  • 1、 使用数组元素作为函数参数
main()
{
 	int i, n;
 	float ar[10];
 	n=5;
   ......
   avg(ar, n);
}

float avg(float array[], int n)
{
 	int i;
 	float sum;
 	for(i = 0; i < n; i++)
 	{
 	     sum += array[i];
	}

}
  • 2、使用数组名作为函数参数
main()
{
 	int i, n;
 	float ar[10];
 	n=5;
   ......
   avg(ar, n);
}

float avg(float array[10])
{
 	int i;
 	float sum;
 	for(i = 0; i < 10; i++)
 	{
 	     sum += array[i];
	}

}
  • 3、使用指针作为函数参数
void Functoion(int* piont);   /*声明函数*/
int array[10];             	 /* 定义数组*/
Function(array); 			 /*将数组名作为实参传递*/
③、了解main 函数的参数
main(int argc, char* argv[])
  • argc:保存命令行的参数个数
  • argv:指向字符指针数组的指针,在此数组中的每一个元素都指向命令行实参,所有命令行实参都是字符串,任何数字都必须由程序转变成适当格式。

四、🎃调用函数 (使用函数)

在这里插入图片描述

①、调用方式

函数的调用方法:
- 变量 = 函数名(实参列表); // 带返回值
- 函数名(实参列表);//不带返回值

Display();  //显示一条信息
iResult = iNum * AddTow(3, 5);
iResult = AddTow(10, AddTow(3, 5));
#include <stdio.h> 

//函数的声明:一般当子函数在主函数的下方,需要在主函数的上方进行声明

void fun1();
void fun2(int a, int b);
int fun3(int a, int b);

void main()
{
	//函数调用
	
	//没有参数也没有返回值
	//直接写函数名,并且要在后面加括号 
	fun1(); 
	
	//有参数 没有返回值
	//直需要在函数名右边括号中传入参数,参数可以是常量表达式,也可以是变量表达式
	fun2(100, 200); 
	
	int x = 10, y = 20;
	fun2(10, 20);
	
	//有参数 有返回值
	//可以使用一个变量接收函数执行结果,或者直接输出
	int n;
	n = fun3(100, 90);
	printf("%d\n", n);
	printf("%d\n", fun3(200, 90));
}

//无参无返回值 
void fun1()
{
	printf("HEllo!\n");
	printf("welcome to ?\n");
 } 
 
 //定义有参数
 void fun2(int a, int b)
 {
 	int sum;
 	sum = a + b;
 	printf("%d + %d = %d\n",a , b, sum);
  } 
  
   //定义有参数有返回值 
 int fun3(int a, int b)
 {
 	int sum;
 	sum = a + b;
 	
 	return sum; 
  } 

在这里插入图片描述

②、嵌套调用

函数的定义都是互相平行、独立的,在定义函数时一个函数体内不能包含定义的另一个函数。
在这里插入图片描述
提示:
在这里插入图片描述
C语言不允许进行嵌套定义,可以嵌套调用函数

void ShowMSG()
{
	printf("The ");
}

void Display()
{
	ShowMSG\();
}

嵌套过程,例子: CEO下达指令
在这里插入图片描述

③、递归调用

递归函数又称为自调用函数,每个函数可直接或间接调用自己。
在这里插入图片描述

五、🎃灵活应用函数

合理应用函数解决问题,会使程序更加直观易懂,易于修改
常见函数

①、math .h

数学函数:

abs():求整数的绝对值
labs():求长整数的绝对值
fabs():返回实型绝对值

三角函数

sin():正弦函数
cos():余弦函数
tan():正切函数
②、ctype .h

字符和字符串函数

isalpha():检测字母
isdigit():检测数字
isalnum():检测字母或数字

六、🎃函数总结

定义函数时,关于函数的参数和返回值的情况,完全取决于函数的概念
当编写函数时,一开始不用想函数如何传参和函数的返回值是什么?
而是在编写代码的途中,要使用某些值,但是当前函数中不存在,此时就需要进行传参,这时候考虑怎么传参就是合适的时机
当函数编写完毕后,考虑是否要将某些结果返回给其他函数去使用,此时需要考虑返回值。

编写函数的好处?
1.定义一次,多次调用,减少代码冗余度
2.使代码,模块化更好,方便调试程序,阅读方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值