原始指针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 0void* 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;