C++指针

    科技2024-12-14  17

    raw pointer(原指针) smart pointer(智能指针)

    计算机中最重要的就是内存了,因为我们在计算机中做的每一件事就是写入内存或者读取内存。

    那指针是什么呢? 指针是一个整数,是一个数字,这个数储存一个内存地址,这就是它的全部。 把一条街上的带有地址的房子想象成一个字节(byte),我们需要给街上的每一个房子取址,因为我们需要正确的访问这个房子,编地址之后我们能够确认我们访问的这个房子是不是我们想要访问的,在计算机中也就保证了我们的读取和写入是正确的。 指针就是那个地址——告诉我们房子在哪/那个特定字节的内存在哪。这是非常重要的,当然也可以选择不用指针,但是内存是你电脑所能提供的最重要的资源,所有东西都依赖它,所以对内存的控制至关重要,所以指针是一个强大的工具。

    注意: 不同类型的变量在内存中所占据的空间大小是不同的,所以在定义指针时必须定义其类型,这对于指针的移位操作具有很重要的意义。 指针本身这个整数没有任何的类型!不管是void* pointer,int* pointer…都和这个整数没有关系,指针就是一个整数,这个数存着内存地址。

    我们来创建一个指针:

    #include <iostream> #define LOG(x) std::cont << x << std::endl int main() { void* ptr = 0; std::cin.get(); }

    void基本上是指完全没有类型的 ,但是这个类型(例如void,int等等)不是指的指针,指针就是一个地址,所以它不需要什么类型,这个类型是说在那个地址的数据是我们给他的类型。 我们给了这个指针一个内存为0的地址,但其实0不是一个有效的内存地址,也就是这个指针是无效的,但是无效是一个完全可以接受的状态。我们也可以把它写成void* ptr = NULL;实际上NULL是一个宏定义(#define NUll 0)或者写成void* ptr = nullptr;,都是一个意思。 现在为止,我们写了一个最简单的指针,虽然它是无效的…

    下面我们再创造一个指针:

    #include <iostream> #define LOG(x) std::cont << x << std::endl int main() { int var = 8; void* ptr = &var; std::cin.get(); }

    在这个变量前面加上运算符&实际上就是在访问这个变量的内存地址,这个变量地址赋值给了一个叫ptr的新变量中,但它同时也是一个指针。

    我们在图示位置设立一个断点,F5运行一下,然后把鼠标停在变量var上,显示它是一个为8的整数;把鼠标停在变量ptr上,则会显示一个十六进制的整数,所以这个变量就是变量var的地址

    我们现在知道了我们变量var的地址,也知道了它的数据是8,现在我想读取或者写入这块数据,我想改变它,我们应该怎么做呢? 也就是我们知道这个数据的地址在哪,但是我们应该怎么访问它呢? dereferencing出马! 我们从一个变量var,变成了一个指针指向var,但是我怎么才能回到那个var呢?可以通过在一个指针前加*来实现,*ptr就可以访问那块数据。 假如我现在把var的值设置为10,即可以通过语句*ptr =10;来实现。

    #include <iostream> #define LOG(x) std::cout << x << std::endl int main() { int var = 13; void* ptr = &var; *ptr = 10; LOG(var); std::cin.get(); }

    但是现在编译器会报错,因为是void指针,计算机就不知道这个指针指的内存是几个字节,10有可能是short类型(2字节的整数),也有可能是int(4字节的整数),还有可能是long long(8字节的整数),也就没有办法写入。 这时候就要用到类型了,我们要告诉编译器这是个int类型的10,也就是改为int* ptr = &var;运行程序之后,可以发现var的值已经成功的变为了10。

    Processed: 0.095, SQL: 8