day_one_指针与内存

指针与内存

变量地生命周期

定义:是否有内存

作用域范围

定义:能不能访问这个变量,能否只用该变量。

四大内存区域

1,静态全局区

(1)静态变量:static修饰的变量
(2)全局变量:定义在函数外的变量 一般定义方式为 int g_a(g代表全局global的意思);
(3)局部变量:定义在函数内的变量。
生存周期:编译时系统自动分配内存并初始化(系统默认值为0)程序结束,系统自动回收内存。
静态全局变量和普通全局变量的异同:
1,生存周期相同(都在静态全局区,)
2,作用于范围不同()静态全局变量:文件作用域,普通全局变量,项目作用域
3,普通全局变量在其他文件使用时,必须先声明在使用,extern 类型 变量名
静态局部变量和普通局部变量地异同;
1,当前语句块内作用在
2,静态局部变量存在静态全局区,普通全局变量存在栈区

2,栈区

函数调用时系统时分配内存

3,堆区

由程序员手动申请(new malloc),由程序员手动释放(delete free)

#include 
using namespace std;
//普通全局变量(非静态,定义在函数体外)
int g_n;
//静态全局变量
static int g_sn;
int main()
{
	//pInt的内存在栈区,pInt指向的内存在堆区
	int *pInt = (int*)malloc(sizeof(int)* 10);//C语言申请一段10个单位(每个单位4个字节)的连续内存,并把该段内存首地址保存到指针变量pInt中
	//没有该行代码,造成内存泄漏
	//free(pInt);//释放申请的内存空间(必须是堆区的)  
	pInt = nullptr;

	//C++语言申请一段连续内存(sizeof(int)*10),把首地址保存到变量pInt中
	pInt = new int[10];
	cout << pInt << endl;
	//释放内存,把申请的堆区归还给系统,但是指针变量的值没有改变
	delete []pInt;//释放内存的单位>=1 必须添加[],[]里面不需要添加任何值
	//如果没有该行代码,该指针称为野指针(坏指针)
	//pInt = nullptr;
	cout << pInt << endl;
	if (pInt != nullptr)
	{
		*pInt = 200;
		cout << *pInt << endl;
	}
	//程序可以输出,但是不安全
	char c1[10] = "abcd";
	char *pchar = c1;
	*pchar = '\\';//栈区中数据可以改变 原因是数组存在于栈区。
	pchar = "abcd";
	*pchar = '\\';//不可以,编译不报错,修改常量区的内容。运行可以导致程序崩溃或终止
	cout << pchar << endl;
	//全局变量
	cout << g_n << endl;
	//静态局部变量
	static int s=20;
	cout << s << endl;
	//定义一个和全局变量同名的局部变量
	int g_n = 100;
	//局部变量
	cout << g_n << endl;//此处为就近原则。输出局部变量的值
	cout << ::g_n << endl;//:: 类作用域符  全局变量


	for (int i = 0; i < 10;i++)
	{
		int sum = 0;//多次 每次都会为sum重新复制 输出123456789
		sum += i;
		cout << sum << endl;
	}
	for (int i = 0; i < 10; i++)
	{
		static int sum;//只初始化一次 
		sum += i;
		cout << sum << endl;
	}
	
	return 0;
}

4,常量区

常量区只存储字符串

你可能感兴趣的:(c语言)