目录
一、程序内存分区
一、代码区
二、全局区
三、栈区
四、堆区
二、引用
三、函数
一、函数默认参数
二、函数重载
一、程序内存分区
代码区和全局区均为未生成exe可执行程序前就存在的
一、代码区
1.存放cpu执行的机器指令
2.代码区共享,无论生成多少个exe文件,都使用同一个代码
3.代码区只读,防止程序生成时被修改。
二、全局区
1.存放全局变量和静态变量
2.全局区包含常量区,各种常量存放在此,注意是全局的
3.该区域数据将在程序结束后由系统自动释放
三、栈区
编译器自动分配,系统自动释放、即为平时所设变量
四、堆区
由程序员分配释放,否则由操作系统回收。
c++使用new再堆区开辟内存,delete释放
下面这段代码展示了内存分布上的不同
#includeusing 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起个别名,二者指向同一块内存空间
引用必须初始化,且初始化完成后不可更改。
引用可做函数参数及返回值类型
引用必须对一块合法的内存空间
#includeusing 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* connst b=&a,则为二者均不可更改 ,可防止值被修改
三、函数
一、函数默认参数
#include
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;
}
#includeusing 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),就是错误的。
传参也是从左到右赋值。
无变量名的参数为占位参数,传值才能调用
在设置默认参数时,声明与定义只能有一处。且在定义处声明时,函数仍参照声明,要求输入参数。
二、函数重载
函数重载必须满足以下条件:
在同一作用域下
函数名相同
函数参数类型不同或个数不同或顺序不同
注:函数返回值类型不可作为函数重载的条件
#includeusing 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; }
引用也可作为函数重载条件,同时要注意默认参数对函数重载的影响



