C++学习笔记八之指针与内存

159 阅读2分钟

指针与内存

内存区域划分

  1. 静态全局区:编译时系统分配内存,程序结束系统回收内存
    • 静态变量、全局变量。只初始化一次,系统默认初始化0
  2. 栈区:调用函数时,系统分配内存,函数调用结束,系统回收内存。
    • 普通局部变量
  3. 堆区:由程序自己手动申请(mallocnew),由程序自己手动释放(freedelete)。
  4. 常量区:字符串 调用函数,系统分配内存(只分配一次),程序结束系统自动回收

静态全局变量和普通全局变量

  1. 生存周期相同(静态全局区)
  2. 作用域范围不同(普通全局变量项目作用域(在其他文件使用必须先声明,再使用),静态全局变量文件作用域)

静态局部变量和普通局部变量

  1. 生存周期不同(静态局部变量:静态全局区;普通局部变量:栈区)
  2. 作用域范围相同(当前语块{})

malloc和new的区别

  1. malloc函数new运算符
  2. 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;
}