c++学习打卡(2)

本文详细介绍了C++编程中不同类型的变量在内存中的存储位置,包括全局变量、静态变量、局部变量、const修饰的变量以及堆和栈区的使用。强调了栈区中局部变量的生命周期和返回局部变量地址的危险性,以及堆区的动态内存分配与释放。
摘要由CSDN通过智能技术生成

代码区特点是共享和只读。
全局区存放全局变量,静态变量(实质就是static修饰的变量),常量。
常量又分为字符串常量以及const修饰的全局变量。

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
int a_g = 10;
int b_g = 10;//全局变量
const int c_a_g = 10;
const int c_b_g = 10;
int main()
{
	int a = 10;
	int b = 10;//局部变量
	cout << "局部变量a的地址为:" << (int)&a << endl;
	cout << "局部变量b的地址为:" << (int)&b << endl;//只要带有局部那么在内存区中就不在全局区中
	const int a_l = 10;
	const int b_l = 10;//const修饰的局部变量。
	cout << "局部变量a_l的地址为:" << (int)&a_l << endl;
	cout << "局部变量b_l的地址为:" << (int)&b_l << endl;
	static int a_q = 10;//静态变量
	static int b_q = 10;
	cout << "静态变量a_q的地址为:" << (int)&a_q << endl;
	cout << "静态变量b_q的地址为:" << (int)&b_q << endl;
	cout << "全局变量a_g的地址为:" << (int)&a_g << endl; //全局变量
	cout << "全局变量a_g的地址为:" << (int)&a_g << endl;
	cout << "c_a_g的const修饰的全局常量地址为:" << (int)&c_a_g << endl;
	cout << "c_b_g的const修饰的全局常量地址为:" << (int)&c_b_g << endl;//const修饰的全局变量为常量
	cout << "字符串常量s_a的地址为:" << (int)&"你啊哈哦啊" << endl;
	cout << "字符串常量s_b的地址为:" << (int)&"你啊哈哦啊" << endl;//字符串常量与const修饰的全局变量统称为常量
	string s_a = "你啊哈哦啊";//注意此时的s_a不属于字符串常量
	system("pause");




	return 0;
}


栈区
由编译器自动分配释放。存放的函数的参数值。局部变量
注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放。

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
//栈区
//由编译器自动分配释放。存放的函数的参数值。局部变量
//注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放。
int* fun_c()
{
	int a = 10;
	return &a;
}
int main()
{
	int* p = fun_c();
	cout << *p << endl;//第一个能打出来10是因为编译器能够保留一份数据
	cout << *p << endl;//第二个以及后边的打印不出来是因为当打印完第一个10之后,
	//编译器会自动释放栈区开辟的这块空间,如果再打印属于是非法对这片内存空间进行操作
	cout << *p << endl;
	
	system("pause");
	return 0;
}


堆区
由程序员分配释放,若程序员不释放程序结束时由操作系统释放。
在c++中主要利用new在堆区开辟内存。

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
//堆区
//由程序员分配释放,若程序员不释放程序结束时由操作系统释放。
//在c++中主要利用new在堆区开辟内存。
int* fun_c()
{
	int *p = new int(10);//用指针返回开辟的这块堆内存的编号
	return p;
}
int main()
{
	int* p = fun_c();
	cout << *p << endl;
	cout << *p << endl;
	cout << *p << endl;
	cout << *p << endl;
	system("pause");
	return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
int* fun_c()
{
	int* p = new int(10);
	return p;
}
void test2()
{
	//创建10整形的数组
	int *arr=new int[10];//共十个元素
	for (int i = 0; i <= 9; i++)
	{
		arr[i] = 100 + i;
	}
	for (int j = 0; j < 10; j++) {
		cout << arr[j] << endl;
	}
	//释放堆区数组
	//释放的时候加[]才可以
	delete[]arr;
}
int main()
{
	int* p = fun_c();
	
	cout << *p << endl;
	cout << *p << endl;
	cout << *p << endl;//前三个可以打印是因为我创建了堆区
	delete p;
	cout << *p << endl;//最后一个无法打印是因为我把堆区的这片空间释放了,在访问属于非法访问操作
	void test2();
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值