指针
▶️指针的类型不影响指针的本质:
- 任何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
标签:Cherno,int,void,C++,引用,ref,ptr,指针
From: https://www.cnblogs.com/rthete/p/17532125.html