C++学习<2>--引用、函数、内存分区

发布于:2025-07-22 ⋅ 阅读:(11) ⋅ 点赞:(0)

一、程序内存分区

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)函数重载的满足条件:

  1. 个作用域下(如全局作用域下)
  2. 函数名相同
  3. 函数参数类型不同,或者个数不同,或者顺序不同
Eg:

void func() {}

void func (int a) {}

void func (double  a) {}

void func (double  a,int b) {}

void func (int a,double b) {}

这些都为函数重载

注:函数的返回值不能作为函数重载的条件 

加上const也可以进行函数重载,不过传入的为常数

当函数重载中有默认参数也不行

总的来说:只要判断为两个函数,在调用的时候不能同时进入,就可以为函数重载

结语

还在学习中,如有错误还请大佬们指出,有问题可相互交流


网站公告

今日签到

点亮在社区的每一天
去签到