一 static修饰变量函数作用(可以做函数和变量的前缀)
在不同文件中定义同名函数和同名变量,不必担心命名冲突
1 全局变量 只在本文件可见,全局变量之前加static就构成了静态的全局变量,全局变量本身就是静态存储方式,在存储方式上并无不同,
非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的
而静态全局变量则限制了其作用域只是在定义该变量的源文件中有效,静态全局变量作用域限于一个文件内只能为该源文件
公用,因此可以避免在其他源文件中引起错误。只初始化第一次,防止在其它单元中被引用。
2 函数变量 只在本文件可见,在本文件中作用域不同,只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数
应该在当前源文件中说明和定义,对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件
要包含这个头文件,static函数在内存中只有一份,普通函数每个被调用中维持一份拷贝。
3局部变量 作用域由局部变为全局,生存周期改变为整个程序,只初始化第一次,下一次依据上一次结果值。
二const、
修饰一个变量 c--》 常变量 cpp-》常量 浮点数不能用在case上
三堆和栈
堆: 栈
1程序员自己销毁 1系统自动销毁
2低地址指向高地址 2高地址指向低地址
3内存可能连续 3内存地址都是连续的
#include<iostream>
using namespace std;
int main()
{
int data = 10;
sizeof(data++);
//cout<<data<<endl;
printf("%d\n",data);
return 0;
}
函数中的data不管是在前面++还是加一输出的data都是10;
因为sizeof在预编译的时候就处理了: 冷知识:快排从左边数从右边开始
因为左边有一个空位,左边开始为交换、效率低:右边开始为覆盖、效率高
.data全局已初始化且不为0的数据
.bss全局未初始化且为零数据;
ZONE_DMA 16M
ZONE_DORMAL 892M
ZONE_HIGHMEM 128M
编译
预编译 .i 编译.s 汇编,o/.obj 可重定位二进制 构建.o文件的组成格式
词法分析
语法分析
语义分析
代码优化
链接
合并段 调整段地址偏移
符号重定位
#include<iostream>
using namespace std;
int x;
void fun()
{
x=20;
}
int main()
{
short x=10;
cout<<x<<endl;
}
using namespace std;
int x;
void fun()
{
x=20;
}
int main()
{
short x=10;
cout<<x<<endl;
}
输出结果为十
强类型:已初始化数据 弱类型:未初始化数据 两个弱看哪个内存大取哪个