当前位置: 首页 > news >正文

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

一、程序内存分区

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也可以进行函数重载,不过传入的为常数

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

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

结语

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

http://www.dtcms.com/a/290473.html

相关文章:

  • 数据结构-哈希表(一)哈希函数、哈希表介绍、优缺点
  • 计算机发展史:个人计算机时代的多元融合与变革
  • 【ASP.NET Core】ASP.NET Core中Redis分布式缓存的应用
  • 进程资源分配的安全性判断与安全序列
  • 14.6 《3步实战LLaMA2-7B指令微调:Hugging Face生态+LoRA技术,MT-Bench得分从5.1直升7.3》
  • 【烧脑算法】拓扑排序:从“依赖”到“序列”,理解题目中的先后逻辑
  • 通俗易懂卷积神经网络(CNN)指南
  • [深度学习] 大模型学习3上-模型训练与微调
  • Pytorch02:深度学习基础示例——猫狗识别
  • 无人机避障雷达模式运行方式
  • 【服务器】服务器调试及仿真软件安装调试心得
  • 《RISC-V 导论:设计与实践》开源课件(附下载链接)
  • 第三章自定义检视面板_创建自定义编辑器类_如何自定义预览窗口(本章进度5/9)
  • MySQL分布式架构深度实践:从分库分表到云原生集成
  • 牛客周赛 Round 101--幂中幂plus
  • 【计算机组成原理】浮点数表示与运算
  • 开尔文封装的 SiC MOSFET 器件可靠性实例研究
  • Java学习----NIO模型
  • 朝歌智慧盘古信息:以IMS MOM V6重构国产化智能终端新生态
  • 20250720问答课题-基于BERT与混合检索问答系统代码解读
  • 论文笔记:EDITING MODELS WITH TASK ARITHMETIC
  • 【论文阅读】Nonparametric clustering of RNA-sequencing data
  • 【力扣】第42题:接雨水
  • Smart Tomcat
  • 人工智能教研室暑期培训flask全栈开发培训
  • 元图 CAD:PDF 与 CAD 格式互转的完美解决方案
  • 【Python 】dotenv 模块与用法介绍及Flask 集成用法示例
  • 力扣-45.跳跃游戏II
  • 解决mac chrome无法打开本地网络中的内网网址的问题
  • 【HTML】图片比例和外部div比例不一致,最大程度占满