8.函数和一维字符型数组
传参:
char 数组名[100];
定义:
返回值 函数名(char 数组名[])
{
函数体;
}
调用:函数名(数组名);
注意:
1.传参时只需要传递数组,不需要传递长度len,因为末尾有'\0'结束标志
2.数组作为函数参数传递时,本质传递的是数组首元素的地址(sizeof(数组名形参)本质是求地址在计算机内存中的大小)8字节
3.strlen等函数在被调函数中可以正常使用
9.函数和二维整型数组
传参:
返回值 数组名(int a[ ][列数],int hang)
{
int lie=sizeof(a[0])/sizeof(a[0][0]);//列可以正常计算
}
//行数在main()里计算并传递
注意:
1.二维整型数组做形参时,必须说明是二维数组。列必须要写,int a[ ][4];
2.行数在形参中可以省略,但无法在自定义函数中计算,因此必须有个参数传递行数int len;
2.二维整型数组做参数传递时,本质传递的是数组首元素地址(8字节)
10.函数和二维字符型数组
传参:
返回值 函数名(char 数组名[ ][列数],行数)
{}
函数名(数组名,行数);
11.变量的作用域和生命周期
1.变量的作用域(空间角度
作用域:标识符/变量可以被使用的范围
- 局部作用域:在{ }内部被定义的变量,作用范围在{ }内部,被称为局部变量。
比如:在函数内部定义的变量、函数形参
- 全局作用域:可使用范围在全局,在任何{ }的外部的变量,被称为全局变量。
比如:定义函数
注意:
1.在同一个作用域中,不能定义同名变量
2.标识符必须先定义再使用
3.在具有包含关系的作用域中,若定义了同名标识符,外层标识符在内层不可见(就近原则
int j=0; //全局变量
int main()
{
int i=10;
int j=20;
{
int i=100;
printf("%d\n",i); //100
}
printf("%d\n",i); //10
printf("%d\n",j); //20
}
2.变量的生命周期(时间角度
生命周期:从变量的空间开辟到空间回收的整个生存期
- 动态生命周期:
局部变量:在被定义时开辟内存空间,超出其作用域范围空间被回收
- 静态生命周期:
全局变量:从程序运行之前空间开辟,到程序运行结束空间被回收,和程序运行生命周期一样长
static修饰的静态变量:1.作用域不变,仍处于局部作用域;2.生命周期改变,由动态变为静态。例如:
int fun()
{
static int a=10;
printf("%d ",a);
i++;
}
int main()
{
fun();
fun();
fun();
return 0;
}
//结果:10 11 12

总结:
局部变量:
1.作用域在局部,超出局部无法访问
2.动态生命周期,定义时开辟空间,超出作用范围空间被回收
3.保存在栈区,未被初始化就为随机值
全局变量、static静态变量:
1.全局变量作用于在全局,static静态变量作用域在局部
2.静态生命周期,程序运行前开辟,程序运行结束后回收
3.保存在数据区,未被初始化默认初值为0
4.未初始化的储存在.bss段,系统默认清0;已初始化的存储在.data段
3.变量的存储类型
存储类型 数据类型 变量名;
变量的存储类型分为以下四种:
- auto:默认存储类型
- static:1.static修饰局部变量,变为静态变量,具备静态生命周期(延长局部变量的生命周期),位置由栈区变到数据区。2.static修饰函数/全局变量:该函数/全局变量只允许在当前原文件中被调用。
- register:寄存器变量。register修饰变量时,建议编译器将改变量存储在寄存器中。寄存器离CPU近,读取更方便。寄存器没有地址,无法取址。
- extern:修饰全局变量/函数。用来声明全局变量/函数。允许被外部的.c使用。

2480

被折叠的 条评论
为什么被折叠?



