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);
}
1267

被折叠的 条评论
为什么被折叠?



