指针与内存
内存区域划分
- 静态全局区:编译时系统分配内存,程序结束系统回收内存
- 静态变量、全局变量。只初始化一次,系统默认初始化0
- 栈区:调用函数时,系统分配内存,函数调用结束,系统回收内存。
- 普通局部变量
- 堆区:由程序自己手动申请(
malloc和new),由程序自己手动释放(free和delete)。 - 常量区:字符串 调用函数,系统分配内存(只分配一次),程序结束系统自动回收
静态全局变量和普通全局变量
- 生存周期相同(静态全局区)
- 作用域范围不同(普通全局变量项目作用域(在其他文件使用必须先声明,再使用),静态全局变量文件作用域)
静态局部变量和普通局部变量
- 生存周期不同(静态局部变量:
静态全局区;普通局部变量:栈区) - 作用域范围相同(当前语块{})
malloc和new的区别
malloc是函数,new是运算符malloc只是申请内存,new在申请内存的同时,自动调用构造函数(初始化
面试很大概率会问
静态变量和全局变量
- 静态变量:定义时,
static修饰的变量 - 全局变量:定义在函数外的变量
练习代码
int n;//普通全局变量
static int ms = 100;//静态全局变量
int main()
{
//普通局部变量
int n = 20;
static int m = 10;//静态局部变量
cout << n << endl;//局部变量
cout << ::n << endl;//::类作用域符号
for (int i = 0; i < 10; i++)
{
int sum = 0;
sum += i;
cout << sum << endl;
}
for (int i = 0; i < 10; i++)
{
static int sum = 0;//只执行一次,编译
sum += i;
cout << sum << endl;
}
//p是局部变量,p在栈区,p指向的内存在堆区。
int *p = new int;
cout << p << endl;
delete p;//释放内存(p指向的堆区内存),但是p的值没有改变。
cout << p << endl;
p = nullptr;
p = new int[5];
delete[]p;//释放一段连续内存
//动态数组:C/C++
p = (int*)malloc(sizeof(int)* 25);
free(p);
p = NULL;
return 0;
}