4_1 C++笔记(1)

本文详细介绍了C++中的内存四区,包括全局区、代码区、栈区和堆区的使用及特点,强调了栈区数据的自动管理与释放,以及堆区通过new运算符进行动态内存分配。同时,文章探讨了new与malloc的区别,并提供了new删除数组的示例。此外,文章讲解了引用的概念,作为变量别名的用途,以及在函数参数和返回值中的应用,指出引用本质上是常量指针。最后,提到了常量引用的作用,防止对引用值的意外修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、内存四区

1.全局区:存储全局变量、静态变量、字符串常量、全局常量(const修饰的全局变量)

2.代码区:存放CPU执行的机器指令,具有两个特点:共享、只读

3.栈区:存放局部变量和形参

注意事项:不要返回某一个函数中局部变量的地址,因为栈区的数据在函数执行完之后自动释放。(有可能编译器会允许第一次这样的操作,是因为有的编译器会保留释放前的数据)

栈区开辟的数据由编译器自动管理、释放

4.堆区:由程序员分配释放,若程序员不释放,程序结束时由操作系统回收

在C++中利用new来开辟一块内存

利用new关键字可以将数据开辟到堆区

4.1 new--delete用法:

堆区开辟数组

注意:开辟单个数据是 new+类型+ ( )

开辟数组是new+类型+【】

4.2 new和malloc区别(面试题)

C++ new和malloc的区别_Linux猿的博客-优快云博客_c++ new和malloc的区别



二、引用

作用:给变量起别名

语法:数据类型 &别名 = 原名     (原名和别名指向同一块内存)

引用注意事项:引用必须初始化;引用在初始化后不可以发生改变

e.g. int a = 10;  int &b = a;(必须初始化)

这个时候b已经是a的一个别名了,从此以后b只能是a的别名了!

引用做函数参数

void mySwap ( int &a, int &b ) {   // 引用方式传入

        int temp = a;

        a = b;

        b  = temp;

        return;

}

省去了传指针的繁琐~

引用做函数返回值

作用:引用是可以作为函数的返回值存在的

注意:不要返回局部变量的引用(道理和函数不要返回局部变量是一样的,因为会释放)

上面这个就是返回了局部变量的引用了,第一次没问题,因为编译器会帮你保存释放前的数据,但是第二次打印就会有问题了(就不给你保存了)

结果:

 那么如果我们把上面的那个局部变量换成静态变量,也就是把“原名”从栈中弄到了全局区,那么就没有问题了:

 

 

此外,函数调用可以作为左值

如上面的函数如果这样写: func1(0.5) = 38.2

其实就相当于一个赋值操作,此时静态变量ret就会变成38.2

 

引用的本质:

引用的本质在c++内部实现是一个指向变量的常量指针(指针的指向是不可以修改的,但是指针指向的值是可以改动的)

int& ref = a; 相当于 int* const ref = &a;

(复习: 指向变量的常量指针    *在const的前面 )

常量引用:

作用:主要用来修饰形参,防止误操作 

 解释:

普通引用是不可以把一个常数作为“原名”的,因为普通常数是在专门的常数区,并没有一个合法的内存空间,因此不可直接引用

但是用 const int& ref = 10 就是合法的了,这个时候编译器会优化代码(如上所示)

在showValue这个函数的形参中我们发现加了const,这个就能够防止在函数中对所引用的值造成修改。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值