C++常量指针,指针常量,指向常量的常指针详解

 更新时间:2021年10月18日 14:26:33   作者:Z小旋  
刚接触到指针时,关于C++常量指针,指针常量,指向常量的常指针容易混淆,所以整理下,希望能够帮助自己也帮助到大家

什么是指针

指针就是指向变量在内存中的地址

数据是存放在内存中的,每一个变量都有一个内存地址,假设是一个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会随机的指向一个地址

请添加图片描述

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • Qt数据库应用之数据打印到pdf

    Qt数据库应用之数据打印到pdf

    因为xls打开以后用户可以修改数据造假之类的,而pdf默认是不可编辑的,除非借助专业的工具,所以如果想要限定用户导出数据不能被更改,那导出pdf是最佳选择。所以本文将为代价介绍Qt实现数据打印到pdf的方法,需要的可以参考一下
    2022-01-01
  • C++版图书管理系统

    C++版图书管理系统

    这篇文章主要为大家详细介绍了C++版图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 浅析C语言中的setjmp与longjmp函数

    浅析C语言中的setjmp与longjmp函数

    以下是对C语言中的setjmp与longjmp函数进行了详细的介绍,需要的朋友可以过来参考下
    2013-09-09
  • 基于Protobuf C++ serialize到char*的实现方法分析

    基于Protobuf C++ serialize到char*的实现方法分析

    本篇文章是对Protobuf C++ serialize到char*的实现方法进行了详细的分析介绍。需要的朋友参考下
    2013-05-05
  • C++统计中英文大小写字母、数字、空格及其他字符个数的方法

    C++统计中英文大小写字母、数字、空格及其他字符个数的方法

    这篇文章主要介绍了C++统计中英文大小写字母、数字、空格及其他字符个数的方法,涉及C++字符串的遍历与简单判定技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-05-05
  • C++实现一行一行读取文本的方法

    C++实现一行一行读取文本的方法

    今天小编就为大家分享一篇C++实现一行一行读取文本的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 一文带你深入了解C++中的类型转换

    一文带你深入了解C++中的类型转换

    在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化。本文主要介绍了C++中常见的四个类型转换,需要的可以参考一下
    2022-12-12
  • C++11中delete和default的用法详解

    C++11中delete和default的用法详解

    这篇文章主要为大家详细介绍了C++11中delete和default的具体用法,文中的示例代码简洁易懂,具有一定的学习价值,感兴趣的小伙伴可以了解下
    2023-08-08
  • C语言中new与malloc的区别详解

    C语言中new与malloc的区别详解

    这篇文章主要介绍了C语言中new与malloc的区别详解,new是运算符,可以用于动态分配,如果想要撤销内存使用delete,new运算符使用的一般格式为new类型,用new分配数组空间时不能指定初值,需要的朋友可以参考下
    2023-10-10
  • 基于Matlab LBP实现植物叶片识别功能

    基于Matlab LBP实现植物叶片识别功能

    局部二值模式(LBP)是由Ojala等人于2002年提出,它被用于特征提取,而且提取的特征是图像的纹理特征。本文将利用Matlab和LBP实现植物叶片识别,需要的可以参考一下
    2022-02-02

最新评论