目录
一、程序内存分区
代码区和全局区均为未生成exe可执行程序前就存在的
一、代码区
1.存放cpu执行的机器指令
2.代码区共享,无论生成多少个exe文件,都使用同一个代码
3.代码区只读,防止程序生成时被修改。
二、全局区
1.存放全局变量和静态变量
2.全局区包含常量区,各种常量存放在此,注意是全局的
3.该区域数据将在程序结束后由系统自动释放
三、栈区
编译器自动分配,系统自动释放、即为平时所设变量
四、堆区
由程序员分配释放,否则由操作系统回收。
c++使用new再堆区开辟内存,delete释放
下面这段代码展示了内存分布上的不同
#include<iostream>
using namespace std;
int a, b, c;
const int i = 1, j = 2;
static int k = 3, l = 4;
int main()
{
int d, e, f;
const int g = 1, h = 2;
cout << "全局变量地址:\n" << &a << endl
<< &b << endl
<< &c << endl;
cout << "全局const修饰常量地址:\n" << &i << endl
<< &j << endl;
cout << "static静态变量地址:\n" << &k <<
endl << &l << endl;
cout << "局部变量地址:\n" << &d << endl
<< &e << endl
<< &f << endl;
cout << "局部const修饰常量地址:\n" << &g <<
endl << &h << endl;
return 0;
}
二、引用
int&b=a,b为a的引用,相当于给a起个别名,二者指向同一块内存空间
引用必须初始化,且初始化完成后不可更改。
引用可做函数参数及返回值类型
引用必须对一块合法的内存空间
#include<iostream>
using namespace std;
void swap(int&a, int &b)//引用交换
{
int ret = a;
a = b;
b = ret;
}
int&test()
{
int a = 100;
return a;
}
int main()
{
int a = 10, b = 20, c = 30;
int &d = a;
cout << "d=" << d << endl;
a = 11;
cout << "d=" << d << endl;
d = 12;
cout << "a=" << a << endl;
cout << "b=" << b << endl << "c=" << c << endl;
swap(b, c);
cout << "b=" << b << endl << "c=" << c << endl;
int&f = test();//不同编译器结果不同,VS2017,两个都为随机值,同步a被销毁
cout << "f=" << f << endl;//DEV 第一个为100,第二个为0。
cout << "f=" << f << endl;
}
引用的本质是一个指针常量int*b=a会自动转化为int* const b=&a,使用时会自动解引用,其指针指向不可修改,但其所指内存空间的值可被修改。
那么 const int*b=&a,则为指针指向可改,但其所指内存的值不可更改。
常量引用 const int* const b=&a,则为二者均不可更改 ,可防止值被修改
三、函数
一、函数默认参数
#include<iostream>
using namespace std;
void fun1(int a = 1, int b = 2, int c = 3)
{
cout << a + b + c << endl;
}
void fun2(int a,int)
{
cout << "this is a function a=" << a << endl;
}
void fun3(int a, int b);
void fun4(int a=10, int b=10);
int main()
{
fun1();
fun1(10);
fun1(10, 20);
fun2(999,1);
fun3(1,2);
fun4();
return 0;
}
void fun3(int a = 10,int b = 10)
{
cout << a + b << endl;
}
void fun4(int a, int b)
{
cout << a + b << endl;
}
注意:函数默认参数设置从左到右依次设值 像fun(int a=1,int b,int c=30),就是错误的。
传参也是从左到右赋值。
无变量名的参数为占位参数,传值才能调用
在设置默认参数时,声明与定义只能有一处。且在定义处声明时,函数仍参照声明,要求输入参数。
二、函数重载
函数重载必须满足以下条件:
在同一作用域下
函数名相同
函数参数类型不同或个数不同或顺序不同
注:函数返回值类型不可作为函数重载的条件
#include<iostream>
using namespace std;
void fun(int a,double b=10)
{
cout << "fun(int a,double b=10)" << endl;
}void fun(double a, int b=10)
{
cout << "fun(double a, int b=10)" << endl;
}
void fun(char&a)
{
cout << "fun(char&a)" << endl;
}
void fun(const char&a)
{
cout << "fun(const char&a)" << endl;
}
int main()
{
fun(1);
fun(1.1);
fun(1, 2.0);
fun(3.14, 1);
char a = 'c';
fun('c');
fun(a);
return 0;
}
引用也可作为函数重载条件,同时要注意默认参数对函数重载的影响