什么是指针
指针就是指向变量在内存中的地址
数据是存放在内存中的,每一个变量都有一个内存地址,假设是一个int类型变量a,占4个字节的内存区,那么在内存中如果是小端方式存储,我们创建指针p,把a的地址赋值给p,就是把a的首地址0x1100赋值给指针p,这个时候p的值就是变量a在内存中的首地址
int a =10;
int*p;
p=&a; //把a的首地址赋值给P
也就是说指针的值是这块内存区域的首地址
内存地址
内存是一个很大的,线性的字节数组,每一个字节都是固定8个二进制位组成,计算机对每个内存单元都进行了编号,这个编号就称为内存地址,地址决定了内存单元在内存中的位置
指针所占内存
在32位系统中,处理器一次能处理的最大位数是2的32次方 ,也就是一次处理4个字节的内存数据,哪么指针的长度也就是4个字节。
在64位系统中,处理器一次能处理的最大位数是2的64次方 ,也就是一次处理8个字节的内存数据,哪么指针的长度也就是8个字节。
32位系统指针4个字节 64位系统8个字节
const 变量
const 是 constant 的缩写,本意是不变的,不易改变的意思
也就是说使用const修饰的变量,其值是不允许改变的
const int a = 7;
int b = a; // 正确
a = 8; // 错误,不能改变
指针常量,常量指针和指向常量的指针
在了解了上面的基础知识之后,我们来看一下什么是指针常量,常量指针和指向常量的指针
首先说一下怎么快速的记住他们的区别,只需要按照命名的顺序来读,就可以很好地记忆
比方说:
int * const p =&a;
首先是一个指针int * , 然后一个const常量 那么p就是指针常量
const int *p=&a;
首先是一个const常量, 然后一个指针int * 那么p就是常量指针
是不是很好记忆
指针常量
int * const p =&a;
特点:指针的指向不可以修改,指针指向的内存的值可以修改
因为const的功能就是限定不可以修改,所以我们看到指针常量是先有了int *指针,再有的const修饰p 所以p的值(指向的内存地址) 是不可以修改的
也就是const限制的是指针p的值,但是没有限定p指向的内存地址里的数据,所以内存的数据可以修改
举例:
int a=10;
int * const p =&a; //定义指针常量,指向int a的地址
*p = 20; //正确,指向的内存地址中的数据可以修改
p=&b; //错误,指向的内存地址不可以修改
箭头是指针指向的内存值,是不可以修改的,但是指向的内存地址中的数据可以修改
常量指针
const int *p=&a;
特点: 指针的指向可以修改,但是指针指向的值不可以修改。
常量指针,首先要是常量。就是指向的值要是一个常量,但是指向的内存地址不做限制
int a=10;
int b=10;
const int *p=&a; //定义常量指针,指向int a的地址
*p = 20; //错误,指向的内存地址中的数据不可以修改
p=&b; //正确,指向的内存地址可以修改
箭头是指针指向的内存值,是可以修改的,但是指向的内存地址中的数据要和之前的一致
指向常量的常指针
const int const *p=&a;
特点: 指针的指向不可以修改,指针指向的值也不可以修改。
两个const限制,一旦指向之后就不可以做修改了
int a=10;
int b=10;
const int const *p=&a; //定义指针常量,指向int a的地址
*p = 20; //错误,指向的内存地址中的数据不可以修改
p=&b; //错误,指向的内存地址不可以修改
空指针、野指针
空指针就是指向地址为空的指针
注意:空指针指向的内存是不可以访问的
//-------空指针-------//
int *p4 = NULL;
//cout << *p4 << endl; //运行Error,使用指针时必须先判断是否空指针
野指针是指针指向了一个随意的内存地址,如果使用,会造成不可预知的内存错误
//-------野指针(悬浮、迷途指针)-------//
int *p5 =0x1100; //任意赋值的野指针
//cout << *p5 << endl; //运行Error
int *p6 = new int(5);
delete p6; //删除p6的指向
p6 = NULL; //一定要有这一步,否则p6会随机的指向一个地址
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!