- 应用程序内存空间(局部内存堆),程序进程结束时,会被统一都回收释放
- 公共内存区(全局内存堆)(写设备驱动程序时会使用),使用不当会造成内存泄漏
extern
不能修饰其他模块的静态变量- 函数内用
extern
修饰的变量要么来自全局变量,要么来自本身模块的静态变量 extern
只能修饰外部变量(就近原则),不能修饰局部变量
test.cpp:
#include <iostream>
int etn = 3; // 全局变量
static int s_m; // 模块静态变量
void layout() {
std::cout << "test.cpp\tetn=" << etn << std::endl;
}
another.cpp:
static int etn = 4; // 模块静态变量
void myFunc(){
int etn = 5; // 局部自动变量
{
extern int etn;
int x = etn;// x 是 4 而不是 5
}
}
charTest.cpp:
#include <iostream>
#include <locale>
void myPrint(){
setlocale(LC_ALL, "chs");
char16_t c1 = u'马';
char32_t c2 = U'马';
wchar_t x = u'马';
wcout << x << endl;
}
main.cpp:
// 模块静态变量
static int x = -1, y = -2;
// 全局变量
int i;
// extern 全局变量
extern int etn;
// 错误,不能 extern 其他模块的静态变量
// extern int s_m;
// x y 也是全局变量,只不过共用一块内存
// 所以会与上面的 x y 冲突
// static union{
// int x = 97;
// char y;
// };
void layout();
int main()
{
extern int x; // OK 自身模块的静态变量
x = 11;
cout << ::x << endl; // 11
static int y = 10; // 局部静态变量
cout<< y << endl; // 10
cout << x << endl; // 11
cout << ::y << endl; // -2 访问模块静态变量
int xx = 555;
// 八进制格式化打印
int z = printf("%#o\n", xx); // 01053
// 十六进制格式化打印
z = printf("%#x\n", xx); // 0x22b
// 打印数字 x 的位数
char buf[256];
z = sprintf(buf, "%d", xx);
cout << z << endl; // 3
// 5 个固定宽度 左对齐
printf("l%-5cr\n", 'A'); // lA r
// 8 位显示浮点数(包括小数点) 用 0 填充 小数位精确到 2 位
printf("l%08.2fr\n", -20.405); // l-0020.41r
cout << strlen("abc") << endl; // 3
cout << sizeof("abc") << endl; // 4
string s = "abc"s;
cout << s.length() << endl; // 3
cout << sizeof(s) << endl; // x86 28
// x64 32(Linux) 指针为 8 字节,32 位的为 4 字节
etn = 4;
layout(); // test.cpp etn=4
return 0;
}