关于C++中的指针
最近因为项目原因,在学C++相关的内容。由于有C#的基础,学起来还是比较快一些的。毕竟基础语法相同的地方还是挺多的。
但是C#和C++比较不同的一个概念就是指针。C#中弱化了指针的概念,而指针在C/C++中却是非常重要的概念。
指针,就是一个存储计算机内存地址的一个变量,通过这个变量,可以很方便的操作内存中的值。
要理解这个概念,就首先理解存储单元和内存地址。
计算机内存条的物理内存被虚拟化成虚拟内存,虚拟内存可以简单理解为一个个有序的小方格。每个小方格的大小就是一个存储单元(1byte,也就是8bit,可以存放8位二进制数)。
而每个小方格都有一个编号,这个编号就是内存地址。拿32位计算机来举例,它的内存地址是32bit,也就是4字节,可以用8位16禁止的数据表示,如0x00010001就表示一个内存地址。32位计算机的内存地址范围(也叫寻址范围)是从0x00000000~0xFFFFFFFF,这也就解释了为什么32位计算机最大内存是4G。需要说明的是0~255号内存地址是操作系统保留内存地址,无法对其进行操作。
我们在程序中定义的变量、常量、函数等都会加载到内存中。
例如我们定义了一个变量int a = 10;那么这个计算机中就会开辟一个内存空间,int类型一般是占四个字节内存空间,如下图,计算机在1221~1224地址上开辟了空间存储变量a,第一个存储空间的地址就代表a的地址,这个a就代表里面存储的数据10。至于为什么是开辟了四个内存空间,因为int类型的范围在0~2^32-1,需要8位2进制数据保存内容。
那么指针与内存地址的关系是什么呢?
我们定义一个指针,并让他指向a,int* p = &a;(&表示取a的地址。)那么p里存储的值就是变量a的地址1221,也就表示p指向a,如何通过指针获取a的值?那就是通过解引用*p。
可以看到P也有自己的内存空间,因为指针只需要存内存地址,而内存地址都是4字节(32位系统),因此指针所占用的内存空间都是4字节。
指针由三个部分组成,指针类型,指针变量,指针指向的内存地址。
指针类型,指的是指针所指向的数据类型。指针是可以进行加减操作的,就是依靠指针类型。如int* p1; p1++; 就表示指向int类型的指针p1,p1原来指向的地址是1220,那么p1++之后指向的地址就是1224(int类型占四个字节);double* p2,p2++,p2原来指向1220,p2++之后就指向1228(double类型占8个字节)。
指针变量是一个特殊的变量,直接打印它的值,能得到一个内存地址。通过*p的方式进行解引用就能得到p指向的内存地址中的值。
指针指向的地址,代表给指针赋值,也是让指针和普通变量关联起来。不能直接给指针赋一个具体的值,那样做的话会得到一个野指针。如int* p = 0x00008923;这样就是一个野指针,是不安全的,也是程序不允许的,因为可能会导致程序活系统崩溃。
关于空指针、野指针的概念后续有机会再表述。