C++引用和指针
1、引用
C++语言允许为已定义的变量起一个别名,称为变量的引用名。引用名看起来像是一个变量名,但它是一种特殊变量,称为引用变量或简称为引用。引用和变量于其引用的变量共用一个内存单元,定义引用变量时不在单独分配内存空间。
引用类型 &引用变量名 = 被引用变量名;
语法说明:
- 引用类型是引用变量的数据类型,必须与被引用变量的类型一致。
- & 是引用变量说明符。
- 被引用变量名指定一个已经定义的变量,即被引用的变量。
- 定义引用变量时必须初始化,即指定其是那个变量的引用。引用变量只能引用一个变量,定义后不能在引用其他变量
- 引用变量和被引用变量都可以改变互相的值
值得注意的是,我们不应该仅仅将引用变量的作用局限在一个现有变量的别名这一用途。
1、在进行函数调用时,可以通过引用变量来传递和返回函数内改变的值。
2、引用型参数应该在能被定义为const的情况下,尽量定义为const。

1 void Quote(int &x) { 2 std::cout << "x: " << &x << " " << x << std::endl; 3 x++; 4 std::cout << "x: " << &x << " " << x << std::endl; 5 } 6 7 void Pointer(int *x) { 8 std::cout << "x: " << &x << " " << x << " " << *x << std::endl; 9 x[0]++; 10 std::cout << "x: " << &x << " " << x << " " << *x << std::endl; 11 x++; 12 std::cout << "x: " << &x << " " << x << " " << *x << std::endl; 13 } 14 15 void Normal(int x) { 16 std::cout << "x: " << &x << " " << x << std::endl; 17 x++; 18 std::cout << "x: " << &x << " " << x << std::endl; 19 } 20 21 int main() { 22 int a = 10; 23 std::cout << "a: " << &a << " " << a << std::endl; 24 std::cout << "Quote-----------" << std::endl; 25 Quote(a); 26 std::cout << "a: " << &a << " " << a << std::endl; 27 std::cout << "Pointer-----------" << std::endl; 28 Pointer(&a); 29 std::cout << "a: " << &a << " " << a << std::endl; 30 std::cout << "Normal-----------" << std::endl; 31 Normal(a); 32 std::cout << "a: " << &a << " " << a << std::endl; 33 }
运行结果

a: 000000B7B8CFF8B0 10 Quote----------- x: 000000B7B8CFF8B0 10 x: 000000B7B8CFF8B0 11 a: 000000B7B8CFF8B0 11 Pointer----------- x: 000000B7B8CFF8B8 000000B7B8CFF8B0 11 x: 000000B7B8CFF8B8 000000B7B8CFF8B0 12 x: 000000B7B8CFF8B8 000000B7B8CFF8B4 0 a: 000000B7B8CFF8B0 12 Normal----------- x: 000000B7B8CFF8B8 12 x: 000000B7B8CFF8B8 13 a: 000000B7B8CFF8B0 12
可见引用和指针都一样是在函数参数间传递的利器,使用引用作为函数参数,代码更加易读且执行效率更高。
2、指针
C++语言提供一个取地址运算符 & 来获取变量的内存。
&变量名;
语法说明:
- 所取出的变量地址是程序执行时该变量所分配的内存单元的地址。
- 一个变量可以占多个字节。变量地址指的是所占内存单元第一个字节的地址。
- 取地址运算符是单目运算符,操作数必须是变量。
- C++中&是一符多义的符号——位运算中的位与运算符、引用变量说明符、取地址运算符。在不同场合具有不同含义,因此程序员需要仔细研学的上下文赋予它们的特殊含义。
通过地址访问内存单元时,需要知道该地址对应了什么样的数据类型,这个数据类型被称为地址的指向类型。例如通过一个指向类型为int型的地址去读某个内存单元时,计算机将按照int型的规则读取4字节,并按照补码格式来解释所读出的二进制数据。
C++语言提供了一个指针运算符 * 来实现通过内存地址间接访问变量。
*指针变量名
语法说明:
- 按照指针变量所保存的地址间接访问所指向的内存单元,可写入或读出数据。
- 单目运算符
- C++语言中, * 是一符多义的符号——算术运算中的乘法运算符、定义变量语句的指针变量说明符、指针运算符。在不同场合具有不同含义。
使用指针变量应注意的问题
- 可以将指针变量赋值为0,0表示指针不指向任何变量。
- 特殊的指向类型void,void所指向变量的数据类型是未知的。如果使用void型指针变量间接访问变量需要强制类型转换为所指向变量的类型。int x=10;void *p = &x;cout<< *((int *)p);
- 相同类型指针变量之间可以相互赋值。
- 可以定义指向常变量的指针,通过该指针变量不能修改所指向的变量的值。
- 可以定义指针类型的常变量(即指针常变量),需要定义时初始化,以后不能在初始化其指向。
关于指针和常变量的几点认识实践
const int x = 10;//常变量在定义初始化,以后不能改变其值。 x = 15; //错误,常变量不能被修改 int y = 15; const int* px = &x;//指针常变量需要定义时初始化,以后不能改变其指向。 const int* py = &y;//这时py既不可以修改y的值,也不可以修改py的指向。通过指针常变量不能间接修改普通变量的值。 *px = 20;//错误,不能通过指针变量间接改常变量x的值。
关于指针和引用的更多使用方面的问题请访问:https://blog.csdn.net/a15005784320/article/details/112759561
二重指针动态分配空间:int **p = new int *[3];
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器