常量指针和指针常量

在C/C++的学习中,有人经常搞不清楚“常量指针”和“指针常量”这两个概念。其实简单一点讲,“常量指针”所指向的地址上的数据是常量,而“指针常量”所指向的地址是常量,地址上面的数据是可以变化的。

  首先,告诉大家一个小规则,就是像这样连着的两个词,前面的一个通常是修饰部分,中心词是后面一个词,怎么说呢,就像这里的常量指针和指针常量。
 
  常量指针,表述为“是常量的指针”,它首先应该是一个指针。常量指针,就是指向常量的指针,关键字 const 出现在 * 左边,表示指针所指向的地址的内容是不可修改的,但指针自身可变。


  指针常量,表述为“是指针的常量”,它首先应该是一个常量。指针常量,指针自身是一个常量,关键字 const 出现在 * 右边,表示指针自身不可变,但其指向的地址的内容是可以被修改的。


  再分开细细说明,常量指针,它是一个指针,什么样的指针呢?它是一个指向常量的指针,就是说我们定义了一个常量,比如 const int a=7; 那么我们就可以定义一个常量指针来指向它 const int *p=&a; 也可以分成两步,即 const int *p; p=&a; 那么它有什么作用 呢?首先我们来说说常量的属性,因为我们的指针是指向常量的,常量和变量的变量的不同之处在于我们不能对其内容进行操作,具体说就是修改,而我们的指针是什么,它的内容本身是一个地址,设置常量指针指向一个常量,为的就是防止我们写程序过程中对指针误操作出现了修改常量这样的错误,应该如果我们修改常量指针的所指向的空间的时候,编译系统就会提示我们出错信息。总结一下,常量指针就是指向常量的指针,指针所指向的地址的内容是不可修改的。再来说说指针常量,它首先是一个常量,再才是一个指针。常量的性质是不能修改,指针的内容实际是一个地址,那么指针常量就是内容不能修改的常量,即内容不能修改的指针,指针的内容是什么呀?指针的内容是地址,所以,说到底,就是不能修改这个指针所指向的地址,一开始初始化,指向哪儿,它就只能指向哪儿了,不能指向其他的地方了,就像一个数组的数组名一样,是一个固定的指针,不能对它移动操作,比如你使用 p++; 系统就会提示出错。但是它只是不能修改它指向的地方,但这个指向的地方里的内容是可以替换的,这和上面说的常量指针是完全不同的概念。作一下总结,指针常量就是是指针的常量,它是不可改变地址的指针,但是可以对它所指向的内容进行修改。对了,忘了说说它怎么用,举个小例子 int a; int * const p=&a; 也可以分开写 int a; int * const p; p=&a; 当然,你也可以定义个一个指向常量的指针常量,就把上面的两个综合一下,表示如下const int a=7; const int * const p=&a;

 


    
下面看几个简单的例子,可以说明他们的区别:
 

第一个

 1 void main(){                    
 
  2char *str1={"Hello"};

 3char *str2={"Hello World"};
 4char * const ptr1 =str1 ;
 5//指针常量--指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化 6 7     ptr1 =str2; //错误因为这是一个常量指针,改变指向的地址了 8 9     printf("%s \n",*ptr1);
10     }
111213// 编译错误    error C3892: 'ptr1' : you cannot assign to a variable that is const    
14


第二个

 1 void main(){
                    
 2char *str1={"Hello"};

 3char *str2={"Hello World"};
 4char * const ptr1 =str1 ;
 5//指针常量--指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化 6 7     *ptr1 ='A';// 正确因为指向的地址的内容是可以变化的 8 9     printf("%c \n",*ptr1);
10     }
1112//输出  A
13

第三个

 1 void main(){
                     
 2char *str1={"Hello"};

 3char *str2={"Hello World"};
 4constchar *ptr1 = str1;
 5//常量指针--指向字符串常量,所指向的字符串内容不能变,但是指向的地址可以变化 6 7     ptr1=str2;// 正确因为指向的地址是可以变化的 8 9     printf("%s \n",ptr1);
10     }
1112//输出 Hello World

第四个

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     const char *ptr1 = str2;
 5     //常量指针--指向字符串常量,所指向的字符串内容不能变,但是指向的地址可以变化
 6     
 7     ptr1='A';// 错误 因为指向的地址是内容是不可以变化的
 8 
 9     printf("%c \n",ptr1);
10     }
11 
12 
13 //编译错误    error C2440: '=' : cannot convert from 'char' to 'const char *'
14 

相信从上面四个简单的例子可以看出他们不一样的地方把,在这里要请大家注意一下的地方是:

指针常量的申明:const 放在* 和指针名之间 Type * const pointer ;

 
 关于记忆技巧:对于区分const int *pa和int *const pa这两者,前者中,const直接修饰*(不考虑int,因为类型在这里是没影响的),说明*(解引用)这种行为具有常量性,即“不能靠解引用改变它指向的对象的值”,即指向常量的指针。后者中,const直接修饰pa,说明pa本身的值具有常量性,即常量指针。或者也可以这样来记忆: const int a;       // const常量 const int *a; //指向常量的指针 int *const a=&n; //常量指针你在纸上按顺序写下以上三行,记住它们的注释长度:短——长——短,分别对应着:const常量、指向常量的指针、常量指针这三种,应该就不会混淆了。

个人认为以上记忆法比《Effective ++》条款21中推荐的划线分左右法更好记。 


最后再举个例子,与迭代器经常在一起用。
若希望迭代器所指向的东西不可变,则需要的是 const_iterator。例:

std::vector<int>::const_iterator Iter = vec.begin();
*Iter = 10;//错误,Iter是常量指针
Iter++;//正确,Iter本身可变


若希望迭代器本身不可变,指向的内容可变,则可以这样写:

const std::vector<int>::iterator Iter = vec.begin();
*Iter = 10; //正确,指针常量
Iter++;     //错误,指针本身不可变

 

 

转载于:https://www.cnblogs.com/longyi1234/archive/2010/03/30/1700369.html

【WRF数据准备】土地利用类型分类标准:USGS+MODIS IGBP 21 阅读详情

相关推荐

从零到精通:ROS2 MoveIt2与MPC机械臂轨迹规划的完整配置流程

本文详细介绍了ROS2 MoveIt2与MPC机械臂轨迹规划的完整配置流程,从环境准备到高级功能扩展,帮助开发者实现精准控制。通过集成模型预测控制(MPC),机械臂能够优化复杂轨迹规划,处理动态避障,提升工业自动化效率。

juice的博客 705

new与指针

C++primer

katz-blog 1万+

图像配准(Image Registration)——深度学习方法

参考:https://www.cnblogs.com/carsonzhu/p/11188574.html

m0_46483236的博客 4万+

C++学习:第三章C++语言基础 - (二)类型转换、常量、指针、new、delete、函数

1. C++中对常量访问的优化 C++中访问常量并不是每次都去内存中读取,只是读取一次,然后调用该值。C++中考虑常量是不会修改的,因此不用每次都去内存中读取。 如果我们强制修改了常量的值,再次输出时是没有修改之前的值,修改之后的值需访问内存才能得到。 #include &lt;stdio.h&gt; int main(){ const int n = 100; int...

Thomas会写字 229

国产化办公新选择:在银河麒麟V10上部署ToDesk远程桌面

本文详细介绍了在国产操作系统银河麒麟V10上部署ToDesk远程桌面的完整指南。作为国产远程控制工具,ToDesk在连接速度、系统适配性和用户体验方面表现优异,特别适合国产化办公场景。文章包含X86和ARM架构的安装步骤、常见问题排查及性能优化技巧,帮助用户高效实现远程办公。

weixin_33742618的博客 231

IWR6843ISK+DCA1000EVM 本人遇到的所有报错和解决方案

本文详解了初次使用DCA1000EVM和mmave studio遇到的一系列的问题以及解决方法

2301_77883976的博客 3295

怎么new一个指针_C++ 指针:内存管理,收放成双

14.内存管理与分配14.1 内存划分安全和性能是C++程序员时刻要注意的事。C++可以动态分配计算机内存,内存的管理也是C++语言中最容易出错的领域,所以你只有了解内存的工作原理,才能写出高质量的代码。在C++中内存分为5个区,分别是堆、栈、全局/静态存储区、常量存储区和代码区。栈:保存局部变量。栈空间用来存放函数运行时的参数值和局部变量,当一个函数运行结束时,在这个函数中声明的局部变量也会自动...

weixin_39569051的博客 1457

Silvaco TCAD | GaN HEMT器件仿真与高频功率应用实战

本文详细介绍了使用Silvaco TCAD进行GaN HEMT器件仿真的全流程,涵盖器件结构设计、极化效应建模、高频特性分析及功率损耗优化。通过实战案例展示了GaN HEMT在电动汽车电驱和快充模块等高频功率应用中的性能优势与效率提升策略,为工程师提供可靠的仿真方法与设计验证手段。

desk3的博客 183

有关new出一个指针,将该指针指向另一个指针,释放不掉的问题

问题一: 在编写代码的时候,我遇到了这样一个问题:定义一个指针,将这个指针指向另外一个指针,在完成特定功能的操作之后,定义的指针指向的那个指针可能已经被释放,而这时,如果需要释放定义的这个指针,就会报错。 代码如下:int* position=new int [10]; position=pos; . . . delete pos; delete position;// 这里会报错 定义了一个

亦清的博客 1738

信息流广告ROI线性预测看板&投放分析监控看板展示&数据处理入库全流程

此看板数据量太大,在tableau public部署运行速度极慢,因此用图片作展示 数据清洗

Larry_Westside的博客 2316

C#上位机+YOLO工业视觉全实战:从ONNX部署到产线缺陷检测落地(2026年工业级实战指南)

在2026年,工业视觉落地的核心挑战不是“能不能做”,而是“能不能在产线实时跑起来C#为何成为最优解?

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 731

指针常量和常量指针

1、指针常量——指针类型的常量(int *const p) 本质上一个常量,指针用来说明常量的类型,表示该常量是一个指针类型的常量。在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。在定义的同时必须初始化。用法如下: int a = 10, b = 20; int * const p = &amp;a; *p = 30; // p指向的地址是一定的,但其内容可以修改 2、...

星空的博客 8万+

Vibe Draw:AI实现2D草图转3D建模,开源免费的设计师宝藏软件!

AI实现2D草图转3D建模,开源免费,设计师进来看一下?

Code_流苏:在代码中寻诗意,在实践中觅真知 2150

指针常量和常量指针详解

常量指针 定义:又叫常指针,可以理解为常量的指针,也即这个是指针,但指向的是个常量,这个常量是指针的值(地址),而不是地址指向的值。 关键点: 1.常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改; 2.常量指针可以被赋值为变量的地址,之所以叫常量指针,是限制了通过这个指针修改变量的值; 3.指针还可以指向别处,因为指针本身只是个变量,可以指向任意地址;   代码形式: int const* p; const int* p; 指针常量 定义:本质是一个常量,而.

qq_34729246的博客 7101

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

常量指针和指针常量的区别

const int* 与 int* const 的区别

weixin_46280821的博客 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

指针常量和常量指针区别

1、指针常量——指针类型的常量(int *const p) 本质上一个常量,指针用来说明常量的类型,表示该常量是一个指针类型的常量。在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。在定义的同时必须初始化。用法如下: int a = 10, b = 20; int * const p = &a; *p = 30; // p指向的地址是一定的,但其内容可以修改 2、常量指针——指向“常量”的指针(const int *p, int const *p) 常量指针本质上是一个指

居老师的博客 2万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

彻底理解——指针常量和常量指针、指向常量的常指针

前言   在汉语中,定语一般都放在中心词的前面,像C语言和C++语言这种技术性语言,更是如此。   所以定语重要还是中心词重要,肯定是中心词重要。   如:美丽的女孩 美丽的是定语 女孩是中心词   女孩肯定是重要,是本质。   同理,我们先不讲技术,先从字面意思来理解:指针常量、常量指针、函数指针、指针函数、数组指针、指针数组 指针常量 指针是定语,常量是中心词,所以指针常量本质是一个常量 常量指针 常量是定语,指针是中心词,所以常量指针本质是一个指针 函数指针 本质上是一个指针,那就

zhf的博客 8012

区别:指针常量、指针变量、常量指针和常量指针常量

1.指针变量:指针值(即指针的指向)可以改变的指针,只能指向变量; 2.指针常量:指针值(即指针的指向)不能改变的指针,只能指向变量,但可以修改指向的实体变量的值; 3.常量指针:指向常量的指针,所以不能修改指向的实体的值,但可以修改指针的指向(即可以指向别的常量,必须是常量); 4.常量指针常量:指向常量,指针不能改变指向的实体的值,指针值(即指针的指向)也不能改变(是2和3的结合)。举例子

CYJ2014go的博客 7193

C++之指针常量、常量指针和常指针常量

C++之指针常量、常量指针和常指针常量

Serven的博客 1万+

指针常量和常量指针的区别

C语言 指针常量和常量指针的区别

NanChen的博客 2578

指向常量的指针和常量指针;常量指针和指针常量;指向常量的常指针;

今天看书看到常量指针发现和我以前看到的常量指针怎么是反的,本来以为书上是错的,然后深究一下。其实都没错,是翻译的方式不同而已,其实指的一个意思。可以划分一下: 指向常量的指针和常量指针为一组说法,常量指针和指针常量为一组说法。 一、pointer to a constant 叫法:有两种不同的叫法也就是第一组中的指向常量的指针,第二组中的常量指针。 形式: long value = 9999L; const long *pvalue = &value; long const *...

qq_33598781的博客 1363

指针常量和常量指针的区别和联系

而指针常量和整形常量一样,不同的是指针常量。2)常量指针:本质上还是指针,不过前面的修饰语“常量”,限制了该指针,只能指向常量。1:指针常量:先定义指针 (int *)(把指针定义符号理解为指针),第二,定义常量中的常(const),第三定义常量中的量,也就是信号名称 p1。把上面记下来,然后,可以自己在草稿纸上,写上几遍,于是我们便记住了指针常量和常量指针的定义形式了。首先:需要指出的是指针常量和常量指针都是和const有关系。2:常量指针:先定义常量中的常 int const ,第二定义指针*p2。

WE_BIG的博客 2614

c++之指针常量和常量指针

指针常量和常量指针 1.常量指针 const int *PtrConst 或者是 int const *PtrConst (即const 在*的左边) 指向常量的指针,这里所说的“常量”其实在解引用时起到所谓常量的作用,并非是指向的变量就是常量,指向的变量既可以是非常量也可以是常量。总体意思是不能修改指向某变量的值。 让指针指向一个常量,可以防止使用指针来修改所指向的值。 1.常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改; 如:int a = 1; const in....

baidu_16370559的博客 4458
上一篇: 链栈 C语言实现
下一篇: typedef小结
JennyComputer2014
博客等级 码龄12年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值