1.自动变量使用栈(LIFO后进先出);
2.静态持续变量
①外部链接性(跨文件访问);
②内部链接性(只在当前文件中访问);
③无链接性(只在当前代码块中访问);
#include "stdafx.h" int global = 1000;//外部链接性(跨文件) static int one_file = 50;//内部链接性(当前文件)
const int num=30;//加入了const,由外部链接性变为了内部链接性;如放入头文件中,则变为了外部链接性 extern const int b=9;//由于加入了extern,覆盖了默认的内部链接性,链接性变为外部,使用时同样要加extern进行声明; int main() { return 0; } void func() { static int count = 0;//无链接性,只能在当前代码块中使用,但是与llama不同的是没有执行函数也存在于内存中。 int llama = 0; }
3. 静态持续变量会被初始化为0;
4.
①静态持续性,外部链接性
(1)单定义规则:变量只有一次定义,外部使用该变量的文件中都必须声明它;
定义声明:给变量分配存储空间,如未进行初始化,则初始化为0;
引用声明:引用已有的变量,使用关键字extern,且不进行初始化
(2) ::variable 可以在存在全局变量与局部变量时使用全局变量;#include "stdafx.h" #include<iostream> using namespace std; int global = 1000;//外部链接性(跨文件) int main() { int global = 500; cout << "global:" << global << endl;//使用局部变量 cout << "global:"<<::global<< endl;//使用全局变量 return 0; }
(3)const char* const months[12]={"January","February","March","April","May",...}
第一个const 防止字符串被修改,第二个const确保数组中的每个指针的指向不变;
②静态持续性,内部链接性
(1)不能违反单定义规则(p314),但静态外部变量会隐藏常规外部变量;
③ 静态存储持续性,无链接性
在函数中被初始化的静态变量,只进行一次初始化,即只在程序运行时被设置为0!参看p316例子!
④ 静态外部变量如果加const修饰,则变为静态内部变量,这种情况一般放到头文件中定义(p318);
⑤普通函数的链接性为静态外部的,所以只能有一处定义,不能违反单定义规则,可以使用static将链接性修改为内部的。
注意内联函数不受单定义规则的约束,所以可以放在头文件中,只要保证内联函数的定义严格相同即可。
5.动态内存的注意点
① 指针是变量,new出来的是内存地址,注意不能让变量结束了而没有用delele释放内存(p320);
②定位new运算符与普通new运算符的区别:
普通new:在heap处创建,需要用delete释放;
定位new:需要先行创建静态内存buffer,不需要使用delete释放。独立控制好buffer即可(自动释放:自动管理释放,还是手动释放:new出来的)【p323】;
③ (void *)的使用方法【p324】
new出来的地址可以强制转换成(void *),来赋值给任何指针类型;【p322 例9.10】