【ChernoC++笔记】指针和引用

指针#

【16】C++指针

▶️指针的类型不影响指针的本质:#

  • 任何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;

引用#

【17】C++引用

▶️引用本身不是新的变量,不占真正的内存空间#

可以创建空指针,但只能引用已经存在的现有变量。

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
posted @   rthete  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
主题色彩
点击右上角即可分享
微信分享提示