总结:
函数:
1.一维整型数组 作为函数形参
形参:
int a[10],int len // int *a, int len
实参:
a len
len = sizeof(a)/sizeof(a[0]); //不是真正长度
2.一维字符型数组 作为函数形参
形参:
char s[10]; //操作 字符串
实参:
//注:
字符串有自己结束的标志 '\0'
字符数组
字符串
char s[10] = "hello";
char s[10]
3.二维数组
二维整型数组 作为函数的形参
形式上:
printArray(int a[][4],int row);
形参: 数组形式,行数
实参: 数组名 ,函数
int a[3][4] ;
int a[][4]; //一维数组
//int[] a[]; //
//
printArray(int a[][4],int row);
printArray(int[4] a[],int row);
printArray(int[4] a[],int len);
printArray(int[4] *a,int len); //编译器的处理
//
printArray(int (*a)[4],int len)//编译器最终理解的形式
二维字符型数组:
char s[3][100];
做函数的形参:
形参
数组形式,行数
实参:
数组名, 行数
标识符的作用域 与 可见性问题:
作用域:
起作用的范围
全局作用域:
不在任何一个 {} (花括号)范围内
局部作用域:
一定是某个{} (花括号)范围内
变量:
全局变量
局部变量
可见性问题:
程序代码的角度去看,哪些标识符起作用
标识符的可见性的规则:
1.先定义,后使用
2.同一作用域中,不能有同名标识符
3.在不同的作用域,同名标识符,相互之间没有影响
4.如果是不同的作用域,
但是作用域之间存在嵌套关系,
则,内层的作用域的同名标识符,会屏蔽外层的作用域的同名标识符。
(就近原则)
空间的角度:
全局变量
局部变量
时间角度看:
动态变量
从定义处开始,到作用域结束时,释放
eg:
局部变量
静态变量:
从程序开始执行时,存在,到程序执行结束时,销毁
eg:
全局的变量
静态局部变量 (static)
注意:
全局变量 初始化时 ,必须用常量
静态局部变量(static 修饰的) 初始化时 ,必须用常量
特点:
1. 值 只需要初始化一次
2. 值 具有继承性
变量存储类型:
栈:
局部变量
特点: 自动申请,自动释放
堆:
特点: 手动申请,手动释放
全局区(静态区):
全局变量,静态变量,放在这
特点:
这块区域,是代码编译好之后就确定的。
字符串常量区: (只读)
"hello"
代码区:
放代码 (只读)
程序 = 代码 + 数据
局部变量
静态局部变量
全局变量
int c=20; //全局变量
int main()
{
int a=10; //局部变量
static int b=30;//静态局部变量
}
定义变量:
[存储类型] 数据类型 变量名;
auto //自动变量
//局部变量 -- 栈区
auto int a = 10;
static int a = 10; //静态局部变量 --- 变量就被存储到了 静态区 --- 相当于 延长了生命周期
register int a = 10; //注册 -- 寄存器
// register 表示 建议将该变量放到cpu的寄存器中
for (i = 0; i < 100000000; ++i)
//注意: register 修饰的变量 ,不能作 & 取地址运算
extern int a; //多文件编程中
//声明
//声明变量a,是外部(别的文件)的一个变量,如果要用,请到别的文件寻找
//static
static 修饰全局变量
表示,该全局变量,只能作用域当前文件 (限定作用域为当前文件)
static 修饰函数
表示 该函数 只能作用域当前文件 (限定作用域为当前文件)
static 避免冲突
static 避免数据泄露
static 修饰
变量
局部变量
作用: 延长了生命周期
全局变量
作用: 限定了作用域,只能作用域当前文件
函数
作用,与修饰全局变量类似,只能作用域当前文件