C语言 day4 | 我的日常分享

C语言 day4

函数

1、 函数的形参 本质 是函数的局部变量
2、 形参在函数定义的时候不会开辟空间,只在函数调用的时候才开辟空间
3、 形参在函数结束的时候才会变量
4、 函数名代表的是函数的入口地址
5、 函数的返回值 <=4字节 存放在寄存器 | >4字节放在栈区

内存的分区

图片
图片

变量的存储类别

1、 普通局部变量

定义形式:在{}里面定义的普通变量
作用范围:离它最近的{}的范围内有效
生命周期:离开{}的局部变量 系统回收
存储区域:栈区
注意事项:
a、普通局部变量不初始化 内容不确定(只要是在栈区的都是不确定的)
b、普通局部变量同名的话 就近原则

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
int main(int argc,char *argv[]){
int data = 100;
{
int data = 200;
printf("A:data=%d",data);
}
printf("B:data=%d",data);
return 0;
}

运行结果:A:data=200 b:data=100
B执行的时候,data=200已经释放了



2、 静态局部变量

定义形式:在{}中定义 前面必须要加static修饰
作用范围:离他最近的{}之间有效
生命周期:整个进程都有效(范围小 活得久)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<stdio.h>
void fun1(void){
int num = 10;
num++;
printf("num=%d",num);
return;
}
void fun2(void){
//静态局部变量只能被初始化一次 当执行第二个函数时,这条语句不执行
static int num = 10;
num++;
printf("num=%d",num);
return;
}
int main(int argc,char *argv[]){
fun1();//11
fun1();//11
fun1();//11
fun1();//11
fun2();
fun2();
fun2();
fun2();
return 0;
}

可以用来统计函数调用的次数
存储区域:全局区(这就是上面的原因)
注意事项:
a、 静态局部变量 不初始化内容为0(全局区)
b、 只能被定义一次



3、 普通全局变量

定义形式:在函数外面定义的
作用范围:
a、 当前源文件都有效,在定义之前使用需要进行声明 (声明的时候尽量推荐加上extern可以不加。不然容易当成是变量的定义)
b、其他源文件都有效 在其他源文件使用全局变量是 必须加上extern
生命周期:整个进程都有效 (程序结束的时候 才被释放)
存储区域:全局区
注意事项:
a、全局变量不初始化,内容为零(全局变量会被放到bss区,bss区会自动补0)
b、如果全局变量 要在其他源文件里使用 必须要加extern声明
c、如果全局变量与局部变量同名 在{}中优先使用全局变量



4、 静态全局变量

定义形式:在函数外面定义 同时加static修饰
作用范围:只能在当前源文件里使用(多人开发 防止重名)
生命周期:整个进程
存储区域:全局区
注意事项:
a、静态全局变量不初始化 内容为0
b、静态全局变量 只在当前源文件内有效



全局函数(普通函数)和静态函数(局部函数)

1. 全局函数(普通函数)

特点:可以在其他源文件中使用 必须加extern声明

2. 静态函数(局部函数)

定义的时候加了static
特点:只能在当前源文件里使用 不能在其他源文件中使用
非得使用也可以,需要将静态函数封装在全局函数中,同时全局函数和静态函数必须是在同一个源文件

练习:写出运行结果。

图片