函数的基本知识

函数

1.函数概念

函数:C语言中函数是完成某项特定任务的小代码。

C语言中函数分为:
1.库函数
2.自定义函数

2.库函数

2.1标准库和头文件

	C语⾔标准中规定了C语⾔的各种语法规则,C语⾔并不提供库函数,

不同的编译器⼚商提供的C语⾔标准就给出了⼀系列函数的实现。这些函数就被称为库函数。如:scanf, printf 等等。
库函数是在标准库中对应的头⽂件中声明的,所以库函数的使⽤,务必包含对应的头文件,不包含是可能会出现⼀些问题的。

3.自定义函数

3.1函数语法形式

type fun-name( 形参)
{

}
即 函数类型 函数名 (形参)

函数返回类型从广义有两种

  1. viod 表示 什么都不用返回。
  2. 其他类型 int char int* 等等。

3.2函数举例

经典加法函数举例 (单片机经典点亮LED)

#include <stdio.h>

int Add(int x, int y)
{
	return x + y;
}

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int c = Add(a, b);
	printf("%d\n", c);
	return 0;
}

在这里插入图片描述

4. 形参和实参

4.1 实参

#include <stdio.h>

int Add(int x, int y)
{
	return x + y;
}

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int c = Add(a, b);
	printf("%d\n", c);
	return 0;
}

传递给函数的参数a和b,称为实际参数,简称实参。实际参数就是真实传递给函数的参数

4.2 形参

定义函数的时候,在函数名 Add 后的括号中写的 x 和 y ,称为形式参数,简称形参。
在没有调用函数的时候形参是没有开辟空间的

4.3 实参和形参的关系

形参是实参的一份临时数据拷贝,形参与实参的存储空间地址不一样。
当传的是数组时,在函数中改变数组里的元素,会实际改变数组的元素。

5. return 语句

1.return 后面可以接数值,有可以接表达式,如果是表达式,则先执行表达式,在返回表达式结果。
2.return语句执行后,后面的语句不在执行。
3.如果函数中存在分支结构如:if,switch,则要保证每一种情况都要有return。

6. 数组做函数参数

#include<stdio.h>
void Printf(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("arr[%d]=%d ", i, arr[i]);
	}
}

void Assign(int arr[], int sz)
{
	{
		int i = 0;
		for (i = 0; i < sz; i++)
		{
			arr[i] = 1;//把数组的每一个元素都赋值为1
		}
	}
}

int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("未改变前的数组\n");
	Printf(arr, sz);
	Assign(arr, sz);//重新对数组赋值
	printf("\n");
	printf("改变后的数组\n");
	Printf(arr, sz);
	return 0;
}


上述 我写了两个函数

  1. 把数组中的所有元素都打印
  2. 把arr数组内所有元素改为1

我们可以得出结论:
数组传参,形参是不会创建新的数组的。
形参操作的数组和实参的数组是同⼀个数组

7. 函数的声明和定义

函数的调用⼀定要满足,先声明后使用

7.1 单个⽂件

#include <stdio.h>

int Add(int x, int y)
{
	return x + y;
}

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int c = Add(a, b);
	printf("%d\n", c);
	return 0;
}

上述自定义函数在函数调用的之前
还可以把自定义函数放在函数调用之后
但是一定要先声明函数

#include <stdio.h>

int Add(int x, int y)//函数声明 要有“ ;”

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int c = Add(a, b);
	printf("%d\n", c);
	return 0;
}

int Add(int x, int y) //无“ ;”
{
	return x + y;
}

如果上述代码 没有第二行 编译器 会报错

7.3 static和extern

static是 静态的 的意思,可以⽤来:
• 修饰局部变量
• 修饰全局变量
• 修饰函数
extern是⽤来声明外部符号的。

#include <stdio.h>
void test()
{
	//static修饰局部变量
	static int i = 0;
	i++;
	printf("%d ", i);
}
int main()
{
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		test();
	}
	return 0;
}

在这里插入图片描述
可以发现 在 test 函数中 i 的值没有被覆盖 而是每次运行时 都存储了上一次的值 这是因为 static 修饰局部变量改变了变量的⽣命周期 只有程序结束,变量才销毁,内存才回收

⼀个全局变量被static修饰,使得这个全局变量只能在本源⽂件内使⽤,不能在其他源⽂件内使⽤

extern 是⽤来声明外部符号的,如果⼀个全局的符号在A⽂件中定义的,在B文件中想使用,就可以使用extern进⾏声明,然后使⽤。

小结

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值