一、程序内存分区
1、代码区:
存放程序的机器指令,即编译后的二进制代码。通常为只读,防止程序意外修改自身指令,且可能被多个进程共享,以节省内存空间。
2、全局/静态存储区:
已初始化数据段:用于存放程序中明确被初始化的全局变量、静态变量以及常量数据等。这些数据在程序的整个运行期间都存在,并且可以被多个函数访问。
在定义变量时,加上static可做为静态变量,存放于全局
3、BSS 段(未初始化数据段):
主要存放全局未初始化变量和未初始化静态变量。该区域的数据在程序开始执行之前被内核初始化为0或者空(NULL)。
4、堆区:
用于动态内存分配,由程序员手动申请和释放。通过 malloc、calloc 等函数进行分配内存,使用完毕后需手动调用 free 函数释放,否则可能导致内存泄漏。堆区的大小不固定,可动态扩张或缩减。
堆内存仅在程序运行时分配
也就是说在堆区的数据,影响只影响该代码的运行速度与使用,不会对电脑造成影响。
可以用new来定义局部变量,让其存放在堆区,由程序员来决定生死,而非编辑器来管理。
new来定义返回的是该数据类型的指针
int *p =new int(10);定义一个数
int *arr =new int[10];定义一个数组
delete *p释放一个数
delete [] arr释放一个数组
delete 来释放堆区的数据
5、栈区:
由编译器自动管理,主要用于存放函数调用时的参数、局部变量以及函数返回地址等。遵循后进先出的原则,每次函数调用时会在栈上分配一块内存区域,函数执行完毕后自动释放该区域的内存。栈的大小有限,若递归调用过深或局部变量过多,可能会导致栈溢出。
如果运用完函数后就会释放所定义的局部变量,也就是说,对于在函数中的局部变量,在使用一次后就会释放,如果用指针来由其地址运用解引用来写其值,写不出,除非再次调用该函数来生成该变量。
6、常量区:
存放字符串字面常量和其他只读常量。一般位于只读数据段,防止程序修改。
二、引用(变量的引用就是变量的别名,因此引用又称别名)
1、引用的基本语法:
数据类型 &别名=原名
eg:int a= 10; int &b=a;
引用必须要初始化:就必须要写其等于什么
一旦初始化,则不能改变:不能再次将该引用的变量作为另一个数的别名
2、引用来做函数参数:
在函数接收时直接初始化引用,直接对初始化的别名进行操作。
void hanshu(int &a ,int &b)
{}
int main()
{
int a,b;
hanshu(a,b);
}
3、引用的函数返回值不能是局部变量,若加上static变为全局则可使用
4、函数的返回值是引用,则函数调用可作为左值
5、引用的本质:引用相当于指针
eg:int & ref =a; 相当于 int * const ref =a;
ref =20 相当于 * ref =20;
编译器识别到引用自动转化为指针
6、对于使用const来修饰引用,不允许改变该引用的值,但是它不阻止引用所代表的变量的值。使用后编译器自动改为:
const int & ref =10;
相当于
int temp =10; const int& ref =temp;
这种方法,可以来修饰形参(也就是函数中定义的引用值),这样用常量引用避免误操作修改实参,主函数中的值。
7、不允许建立void类型的引用
8、不能建立引用的数组
9、不能建立引用的引用。不能建立指向引用的指针。引用本身不是一种数据类型,所以没有引用的引用,也没有引用的指针。
10、可以将引用的地址赋值给一个指针,此时指针指向的是原来的变量。
三、函数的其他特点
1、函数默认参数
(1)如果我们传入数据,就用传入的数据,若无,则使用默认值
Eg :int func(int a,int b=20,int c=30)
{
return a+b+c;
}
(2)若某个位置已经有了默认参数,那么这个位置往后,从左到右都必须要有默认值
Eg:上面那个b已经默认值为20,那c一定要有默认值,否则报错。
(3)函数声明与函数实现只能有一个默认参数
2、占位参数
占位参数: 返回值类型 函数名 (数据类型){}
占位参数也可有默认参数
Eg:
void func(int a,int )
{
cout << “ok” << end1;
}
3、函数重载
(1)函数重载的满足条件:
- 同一个作用域下(如全局作用域下)
- 函数名相同
- 函数参数类型不同,或者个数不同,或者顺序不同
Eg:
void func() {}
void func (int a) {}
void func (double a) {}
void func (double a,int b) {}
void func (int a,double b) {}
这些都为函数重载
注:函数的返回值不能作为函数重载的条件
加上const也可以进行函数重载,不过传入的为常数
当函数重载中有默认参数也不行
总的来说:只要判断为两个函数,在调用的时候不能同时进入,就可以为函数重载
结语
还在学习中,如有错误还请大佬们指出,有问题可相互交流