一.函数
1.无返回值
内容:不携带返回值的,在定义时前面加上void
#include<stdio.h>
void no(){
printf("12300");
}
int main(){
no();
}
2.有返回值
内容:在定义时前面加上返回值的数据类型
注意返回值:因为函数返回的是局部变量的地址,地址所指向的内容在函数结束的时候已经释放,变量已经被销毁,现在根本不知道地址指向的内容的是什么。
2.1 值传递
#include<stdio.h>
int no(int a){
return a*3;
}
int main(){
int c = no(5);
printf("%d",c);
}
2.2 地址传递
解释:数组是采用地址传递的方式,对应函数只是去获取数组的内存地址,然后对其进行操作
注意:
- 在调用函数里面进行的操作,对应数组也会被修改
- 关于在
int no(int a[]){}
这个位置一维数组可以省略;但是如int no(int a[][5])
的第二维数组数值是不能省略的
#include<stdio.h>
int no(int a[]){
a[2]=86952;
}
int main(){
int a[5] = {111,444,555,888,999};
no(a);
}
3.嵌套调用
// 一个套一个
void dod() {
printf("one ");
}
void bbo() {
dod();
printf("bbb ");
}
int main()
{
int a, b;
bbo();
}
4.递归调用
解释:递归调用运用起来特别灵活。可以向下面那样每次都对递归的值进行变化(需要return),还可以递归值不变化重点是通过if控制次数,递归来控制进出(无需return)
注意:当给递归函数参数是临时变量,它进入递归的状态,会在出递归时保持进入时的值。当给递归函数参数是地址的话,则不会这样
// 计算5!
int abc(int a){
if(a==0){
return 1;
}
return a*abc(a-1);
}
int main(){
int a=5;
printf("%d",abc(a));//120
return 0;
}
5.声明
内容:一般情况下调用的函数必须写在主函数上面否则就会报错,但是可以采取声明的方式来解决
5.1 声明变量
5.1.1 普通调用
内容:对于写在主函数下面的全局变量,想要调用需要在上面先声明
#include<stdio.h>
extern int aa;
void no(){
printf("%d",aa);
}
int main(){
no();
}
int aa = 55;
5.1.2 跨文件调用
A:1.c
#include<stdio.h>
int abc = 596;
B:b.c
#include<stdio.h>
extern int abc;
void no(){
printf("%d",abc);
}
int main(){
no();
}
5.2 声明函数
5.2.1 普通调用
#include<stdio.h>
void no();
int main(){
no();
}
void no(){
printf("d");
}
5.2.2 跨文件调用
A:1.c
#include<stdio.h>
void no(){
printf("d");
}
B:b.c
#include<stdio.h>
extern void no();
int main(){
no();
}
二.总结
1 static
注意点:
- 定义内容为静态
- 编译器编译时分配内存
- 其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束
- 它始终驻留在全局数据区,直到程序运行结束