从熟练Python到入门学习C++(record 7)

1.内存分区模型

内存分为两种:1.在程序运行之前,已经分配好的内存;2.在程序运行之后,才分配内存;

这样分配的意义:不同区域存放的数据,赋予不同的生命周期,给程序员更加灵活的编程;

1.1程序运行之前

内存分为代码区和全局区

1.1.1代码区

代码区放的为二进制代码,有两个特点:共享和只读。

思路:c++程序编译成exe后,exe中存在代码,一般来说点击exe后,是一段代码进程,重复点击exe,不会生成新的进程(代码是共享的,不是独立的);并且代码一般不能修改

1.1.2全局区

全局区存放的是:1.全局变量;2.全局常量;3.静态变量;4.局部常量中的字符串常量;

思路:前两个很正常(毕竟名字带一个全局),后两个是为了让程序员更加灵活的编程(程序员希望哪些变量或者常量在程序运行之前就已经存在地址中);

1.2程序运行之后

1.2.1栈区

c++的栈与python中的栈,有先进后出的特点。通常在c++函数中,命名一个局部变量后,这个局部变量自动加入栈区;当此函数运行结束后,局部变量会逐步出栈。

特点:由编译器自动分配和释放,存放函数的参数值、局部变量等;

注意:不要返回局部变量的地址,因为一旦运行完当前函数,此地址存放的内容已经被释放。

1.2.2堆区

堆区的内存由程序员分配和释放,如果没释放也会在程序结束后由系统释放;

使用关键字new在堆区开辟内存;使用delete删除该内存;

#include <iostream>
using namespace std;

char* func()
{
	char* p = new char('a');
	return p;
}

int main()
{
	char* p = func();
	cout << (int)p << endl;
	cout << *p << endl;
	delete p;
	return 0;
}

对于数组来说,稍微有些许不一样,new int[10]和delete[] p;

#include <iostream>
using namespace std;

int* func()
{
	int* arr = new int[10];
	for (int i = 0;i < 10;i++)
	{
		arr[i] = i+100;
	}
	return arr;
}

int main()
{
	int* p = func();
	cout << (int)p << endl;
	cout << *p << endl;
	delete[] p;
	return 0;
}

2.引用

2.1引用的基本使用

作用:给变量起别名

语法:数据类型& 别名 = 原名

注意:引用需要初始化;初始化后不能再成为其他的变量的别名;

#include <iostream>
using namespace std;

int main()
{
	int a = 10;
	int b = 21;
	//int& adr;
	int& adr = a;
	cout << a << " | " << b << " | " << adr << endl;
	adr = 34;
	cout << a << " | " << b << " | " << adr << endl;
	//&adr = b;
}

2.2在函数中的引用

2.2.1引用作为形参

#include <iostream>
using namespace std;

void swap(int& a, int& b)
{
	int tmp = a;
	a = b;
	b = tmp;
}

int main()
{
	int a = 10;
	int b = 21;
	cout << a << " | " << b << endl;
	swap(a, b);
	cout << a << " | " << b << endl;

}

2.2.2引用作为函数返回值

函数中不要把局部变量的地址作为返回值;

#include <iostream>
using namespace std;

int& func1()
{
	int a = 10;
	return a;
}

int& func2()
{
	static int a = 10;
	return a;
}


int main()
{
	int& a = func1();
	int& b = func2();
	cout << a << " | " << b << endl;
	return 0;
}

另外静态变量的特点:

1.局部静态变量存储在全局数据区,只允许初始化一次,但它的生命周期和全局变量一样,自它们被定义时就一直存在,直到程序结束时才会被销毁。不会随着函数的结束而被销毁,会一直存在。

2.静态变量又和常量有些区别;它可以进行修改;

#include <iostream>
using namespace std;

int& func1()
{
	int a = 10;
	return a;
}

int& func2()
{
	static int a = 10;
	return a;
}


int main()
{
	int& a = func1(); // 野指针
	int& b = func2(); // 10
	cout << a << " | " << b << endl;
	func2() = 213;
	cout << b << endl; // 213
	int& c = func2();  // 213
	cout << c << endl;
	return 0;
}

2.2.3常量引用

意思就是adr作为引用,不能修改它的值(这一点是新功能),也不能修改它的指向(这一点原本就有);

#include <iostream>
using namespace std;

void func1(const int& adr)
{
	//adr += 10;
	//adr = 10;
	int b = 20;
	//&adr = b;
}

int main()
{
	int a = 10;
	func1(a);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值