C语言函数完整篇

在本篇中就不说废话了,直接切入正题



前言

函数说白了就是子程序,对代码的细节进行封装隐藏,也可以让代码重复使用

在C语言中函数非常常用,在写一个项目的时候肯定不能把代码全部写在main函数中,要是全写在main函数中代码不能重复使用,代码可读性也会不好。
把代码封装成函数的优点,能让代码重复使用。


一、C语言中函数的分类

函数分为库函数与自定义函数

1、库函数

为什么会有库函?
主要还是为了提高打代码效率,先拿常用的printf打印函数打个比方,要是没有printf库函数,就得靠自己自定义个功能函数,这一套过程下来很浪费时间,众所周知时间就是效率,刚好库函数的出现提高了的代码效率。

2.自定义函数

如果库函数能干所有的事情,那还要程序员干什么?
所有更加重要的是自定义函数。
自定义函数和库函数一样,有函数名,返回值类型和函数参数。
但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。
函数的组成:

代码如下(示例):
比较大小功能函数

后面会详细介绍

接下来介绍自定义函数的组成

int max(a,b)		
{
    
    
	//这种比较大小只能用在两数之间,不能给多组数比较
	if(a>b)				//第一种方法
	{
    
    
	return a;			//返回值得跟返回类型一致
	}
	else
	{
    
    
	return b;
	}

	return (a>b)?a:b;		//第二种方法比较简洁			
}


int main()
{
    
    
	int a = 12;
	int b = 10;
	max(a,b);		//函数传参
	return 0;		//不写程序一样可以运行
}


返回类型分为有返回值跟无返回值

//有返回值先拿int类型做示范
int max(a,b)	//max函数名可自定
				//(a,b)形参
//void是无返回类型
void a(a,b)

3、函数的组成与需要注意的问题

重点:函数先声明在使用,例外条件是函数在main函数之前就不用先声明后使用

自定义函数名可自定,返回值得跟返回类型一致,返回类型根据函数内容返回,一般情况下都是用void。

二、函数的参数

函数得参数分为实参与形参,在来聊实参跟形参的区别。

初学者会迷惑实参与形参有什么实际区别,没详细了解又会有什么影响,我就在这详细的讲解。

涉及到了函数的传值调用与传址调用的区别。

函数的参数中分为实际参数与形式参数。

在调用函数时主函数需要给自定义函数传递参数,函数中有实参与形式之分,在主函数中的传值操作是实参,自定义函数的接收值操作是形参,形参是实参临时拷贝,修改形参对实参没有实际影响。


1、栈、堆、静区介绍

在这里插入图片描述

有利于对函数的了解


2、实参形参重点介绍

说白了就是实参与形参都占有独立的内存块,想用形参修改实参值。就得用实参把需要修改值的地址传递给Swap函数用指针进行接收,因为传过来的是地址必须用指针接收。

接下来代入代码


代码完整实例

接下用代码指出传值调用与传址调用的区别,就以两数互换为实例介绍

正确代码

void Swap(int*x,int*y)//形参
{
    
    
	int tmp = *x;
	*x = *y;
	*y = tmp;
}

int main()
{
    
    

	int a = 10;
	int b = 20;
	Swap(&a,&b);//实参
	printf("%d %d", a, b);
	return 0;
}

错误代码

void Swap(int*x,int*y)//形参
{
    
    
	int tmp = *x;
	*x = *y;
	*y = tmp;
}

int main()
{
    
    

	int a = 10;
	int b = 20;
	Swap(a,b);//实参
	printf("%d %d", a, b);
	return 0;
}

因为a,b值地址没有传递过去,在Swap函数中a,b值的互换是无效的,回顾上文实参与形参都有独立的内存块,形参的对实参值的修改是无效的,必须把a,b地址传递过去,然后在用指针接收进行修改。

3、实参

int main()
{
    
    

	int a = 10;
	int b = 20;
	Swap(&a,&b);//实参
	printf("%d %d", a, b);
	return 0;
}

4、形参

void Swap(int*x,int*y)//形参
{
    
    
	int tmp = *x;
	*x = *y;
	*y = tmp;
}

5、 函数的嵌套调用和链式访问

5.1、嵌套调用

执行顺序,先从main最前面开始往后执行,调用规则同理,在调用print函数时一定要在a函数之前,不然会报错。

#include <stdio.h>
void print()
{
    
    
 printf("hehe\n");
}
void a()
{
    
    
    int i = 0;
 for(i=0; i<3; i++)
   {
    
    
       print();
   }
}
int main()
{
    
    
 print();
 return 0;
}

5.2、链式访问

把一个函数的返回值作为另外一个函数的参数。

#include <stdio.h>
#include <string.h>
int main()
{
    
    
    char arr[20] = "hello";
 int ret = strlen(strcat(arr,"world"));		//字符拼接,然后计算字符串长度,从最里面的依次向外。
 printf("%d\n", ret);
 return 0;
}

6、函数的声明和定义

6.1、函数声明

告诉编译器有一个函数叫什么,参数是什么,返回类型是什么,具体存不存在函数声明决定不了
函数声明一般都在mian函数之前,要满足先声明后使用
函数声明一般都放在头文件中


6.2、函数定义

函数的定义是指函数的具体实现,交待函数的功能实现。

猜你喜欢

转载自blog.csdn.net/m0_66977204/article/details/130647560
今日推荐