【ChernoC++笔记】指针和引用
指针#
▶️指针的类型不影响指针的本质:#
- 任何type的指针都是保存着内存地址的整数(integer)。
- 指针的type只用来使人更好理解。
// 一个最简单的void类型指针,储存内存地址0
void* ptr = 0;
void* ptr = NULL;
void* ptr = nullptr; // C++11
// 使ptr存储var的内存地址
int var = 8;
void* ptr = &var;
// void*可以换成int*/double*...
int* ptr = &var;
double* ptr = (double*)&var;
// 指针类型: 告诉编译器,存储的地址上的数据是什么类型
int var = 8;
int* ptr = &var;
*ptr = 10; // *: 解引用,访问内存中的数据
❓编译器不知道指针指向的数据究竟有多大,指针不包含数据,只是一个内存地址。#
▶️使用关键字new
在堆上创建固定大小的变量#
// 分配8字节的内存,并返回指向该内存开头的指针
char* buffer = new char[8];
// 将buffer指向的内存地址后的8个字节都设置为0
memset(buffer, 0, 8);
// 堆内存需要手动删除
delete[] buffer;
▶️指针也可以指向另一个指针#
// ptr存储buffer的地址
char** ptr = &buffer;
引用#
▶️引用本身不是新的变量,不占真正的内存空间#
可以创建空指针,但只能引用已经存在的现有变量。
int a = 5;
~~int& ref;~~ // 声明一个引用时,必须马上赋值
int& ref = a; // '&'是类型的一部分,不同于指针中取地址的'&'
❓引用的作用—>值传递和引用传递#
// 值传递:在Increment函数中创建一个全新的value变量
void Increment(int value) {
value++; // value = 6
}
int main() {
int a = 5;
Increment(a); // a = 5,无法达到增加a的目的
// 解决方法1:使用指针传递a的地址
void Increment(int* value) {
(*value)++; // *解引用后再++,否则加1的是地址integer
}
int main() {
int a = 5;
Increment(&a); // 传入a的地址
// 解决方法2:使用引用传递,实现与指针相同的功能,但更加简洁
void Increment(int& value) {
value++;
}
int main() {
int a = 5;
Increment(a); // a = 6
❓定义了引用之后,能不能改为引用另一个变量?#
int a = 5;
int b = 8;
int& ref = a;
ref = b; // a=8, b=8, ref=a=8
ref = b
将使a被赋值为b的值,也就是使a=8,而不是将ref改为引用b。
而指针可以指向另一个变量的地址:
int a = 5;
int b = 8;
int* ref = &a;
ref = &b; // a=5, b=8, *ref=b=8
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!