文章目录
函数
1.函数概念
函数:C语言中函数是完成某项特定任务的小代码。
C语言中函数分为:
1.库函数
2.自定义函数
2.库函数
2.1标准库和头文件
C语⾔标准中规定了C语⾔的各种语法规则,C语⾔并不提供库函数,
不同的编译器⼚商提供的C语⾔标准就给出了⼀系列函数的实现。这些函数就被称为库函数。如:scanf, printf 等等。
库函数是在标准库中对应的头⽂件中声明的,所以库函数的使⽤,务必包含对应的头文件,不包含是可能会出现⼀些问题的。
3.自定义函数
3.1函数语法形式
type fun-name( 形参)
{
}
即 函数类型 函数名 (形参)
函数返回类型从广义有两种
- viod 表示 什么都不用返回。
- 其他类型 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;
}
上述 我写了两个函数
- 把数组中的所有元素都打印
- 把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进⾏声明,然后使⽤。