802 字
4 分钟
C++入门 (三) : 指针
2026-03-10

原始指针raw pointer 智能指针smart pointer

编程中最重要的也许就是memory(内存),因为我们在代码中所做的每一件事,都是从内存中读取或者写入内存

What are pointers ?#

指针是一个integer,一个整数,它是一个保存内存地址的变量.

想象#

电脑中的内存,就像一条很长的大街,街边有一排房子,每栋房子都有一个门牌号和地址

现在把街上每个带地址的房子想象成一个byte,是一个字节的数据。我们需要一个方法来给所有 bytes 取址 假设有人在网上订购了一些东西并想要送货上门,它需要被送到正确的房子里,或者有人把东西从它们的房子里送出去。不管怎样,你都需要能够从内存中,那些 bytes 中,也就是那些房子中read and write(读写)

而指针就是那个地址,告诉我们房子在哪儿——那个特定的字节的内存在哪儿

所以指针就是一个地址,一个存储着一个内存地址的整数

types(类型)完全没有意义,所有类型的指针都是一个整数,存放一个内存地址 最纯粹的指针void没有类型,我们给指针定义类型可能代表那个地址的数据是我们给它的类型,让我们的生活从语法上来说更轻松。但是类型并不会改变一个指针,它就只是个整数。

指针的类型不会影响指针的值的类型,只是标识了指向的对象的类型

void* ptr = 0; // 无效指针
void* ptr = NULL; // #define NULL 0
void* ptr = nullptr; //c++ 11

指针的访问与使用#

取变量的地址.

int var = 8;
void* ptr = &var;

我知道数据在哪儿,我怎么访问它呢?

Dereferencing(逆向引用):

通过在指针前面加上一个asterisk(*)来实现,*ptr实际上是在逆向引用这个指针,也就是我现在正在访问的那块数据,我可以读取或者写入那块数据.

int var = 8;
void* ptr = &var;
*ptr = 10; // 会得到错误,计算机怎么才能将一个值写入void指针里.

因为不知道 10 到底是什么,是一个short(两字节的整数)吗,还是一个int(四字节整数),还是一个long long(八字节整数).

这时就体现出type的重要性了.

int var = 8;
int* ptr = &var
*ptr = 10;

指针不会知道他所指的对象是多少个字节的,他只是一个整数,存放了地址.

指向堆的指针#

char* buffer = new char[8]; //在堆上申请8个字节的空间,并返回了该指针
memset(buffer, 0, 8); // 用指定的数据填充一个内存块(指针,数据,填充字节大小)
delete[] buffer;

由于我们使用了new这个关键字,所以该数据分配在heap(堆)上,因此处理完还需要删除这个数据

指针的指针#

char* buffer = new char[8];
memset(buffer, 0, 8);
char** ptr = &buffer;
delete[] buffer;
C++入门 (三) : 指针
https://dingfengbo.vercel.app/posts/c入门/03-c指针/
作者
Eureka
发布于
2026-03-10
许可协议
CC BY-NC-SA 4.0