一、前言
指针是个非常强大的东西,同时很大程度上也是C/C++语言的核心与精髓,如果能彻底搞懂指针,你基本就算入了C/C++语言的大门。
指针的出现,包括引用的出现,本质上就是为了解决程序运行效率的问题,比如1M
字节大小的数据,如果不使用指针或者引用,那么你每次将它传递给函数,都需要将1M
大小的字节全部复制一遍。
而如果使用指针或者引用,那么我们只需要复制4字节、或者8字节即可,也就是这块内存的地址(指针大小取决于你当前是32位程序还是64位程序)。
这样一对比你就会发现,效率提高了不知多少倍!
直接复制:1M=1024kb=1024*1024B
64位程序复制指针:8字节=8B
,相差1024*1024/8=131072
倍
至于引用,本质上也是指针的一种变体,后面我们就会看到它的实现原理了。
二、基本使用
指针本质上就是一块固定大小内存的变量而已,无论你是什么类型的,它的大小都是固定不变的:
#include<iostream>
int main() {
int a;
double b;
char c;
printf("%d,%d,%d",sizeof(&a), sizeof(&b), sizeof(&c));
}
就像上面这样,定义了三个不同类型的变量,然后打印它们的指针大小(通过取址符号&
获取地址,sizeof
运算符获取大小):
因为此时我这里使用的x64
,所以它们的指针大小就会固定为8位,如果你使用的x86
,也就是32位程序,那么指针大小就会固定为4位大小。
而这也就是指针能提升效率的原因:无论什么类型,其指针大小都是不变的。
如果一个结构体或者类占1M
大小,那么通过指针传递,实际上也只需要拷贝指针大小的内存即可,也就是只需要将地址传递过去。
效率大大提升。
而存储地址的变量一般就称为指针:
int *pa=&a;
double *pb=&b;