Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++ 指针常量与常量指针

C++ 指针常量与常量指针

作者头像
chaibubble
发布于 2018-01-02 03:52:09
发布于 2018-01-02 03:52:09
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

吐槽一下: 指针常量与常量指针的翻译就好比机器学习Regularization翻译成正则化一样,讲真,正则化这个说法确实要比规则化显得高端些,但是到了理解的时候,还是要按照规则化理解。

指针常量与常量指针这个概念是一样的,英文里没有pointer const这个词,只有pointer to const和const pointer这两个词。

而不管是指针常量还是常量指针他们的区别其实就是const关键字的位置,下面直接根据声明方式不同解释二者的区别: 在只有一个关键字const的情况下,声明有三种方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//1
const int* p;
//2 
int const* p;
//3 
int * const p;

其中1和2是一种,这种情况下不能使用指针修改指向数据的值,但是也仅仅是不能使用指针p修改而已,p指向的值本身如果不是常量的话那么还可以直接对值修改,举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int a = 5;
const int* p = &a;
a = 4;//合法
*p = 3;//不合法

由于这个特点,通常把const int* p的形式作为函数的参量,以表示函数不会用这个指针修改数据,比如我们有一个子函数是想打印一个数组,那么我们可以将函数声明写成这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void printfarr(const int *arr,int n);

如此,当主函数中调用该子函数,并打印主函数中的变量array的时候,永远不会出现array变化的情况,但是主函数自身想要修改array显然是可以的。所以被指向的数据的值到底能不能改变根本不由指针的声明方式决定,而是该数据本身是常量还是变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int a = 5;
const int b = 5;
const int* p = &a;
a = 4;//合法
*p = 3;//不合法
p = &b;//合法
b = 4;//不合法
*p = 3;//不合法

而对于3,它的作用是保证指针不会指向别处,也就是一旦用这种方式声明并初始化,指针指向的地址永远不会发生变化,但是其中的值却可以通过指针改变:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int a = 5;
int b = 6;
int * const p = &a;
*p = 4;//合法
p = &b;//不合法

以上就是所谓的指针常量与常量指针所包含的概念,在这里标个号: 1,2暂时称为第一类,3暂时称为第二类,那么第一类和第二类到底哪个叫做指针常量,那个叫做常量指针呢?说实话我都不知道指针常量与常量指针的叫法是不是够官方,我只能说概念非常混淆,而且其实它的两个名字并不重要,关键的是声明方式与作用的区别。

百度百科认为第一类应该叫做常量指针,第二类叫做指针常量

但是在《C Primer Plus》中将第一类叫做指向常量的指针,也就是在文章开头提到的pointer to const,那么第二类也就是const pointer了,但是这样一来,他就已经和百度百科的说法反了。

到目前为止我还没有找到更权威的说法,维基百科找不到这两个词,所以我们干脆不要去理会第一类与第二类到底该叫做什么名字,因为他们的声明方式与作用是决定清晰的就足够了。

上面说的情况,对于指针的修饰都只用了一个const关键字,还有两个const一起用的时候,此时的结果就是指针不能修改指向的数据,指针不能指向别的地方:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int a = 5;
int b = 6; 
const int * const p = &a;//合法
*p = 4;//不合法
p = &b;//不合法
a = 7;//合法

最后还有一个最严格的情况,就是数据本身就是常量,而且常量的地址不允许赋值给普通指针,这样一来数据自身不能改变,指针不能该数据,指针不能指向别处。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const int a = 5;
int b = 6; 
int * const q = &a;//不合法
const int * const p = &a;//合法
*p = 4;//不合法
p = &b;//不合法
a = 7;//不合法    
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-09-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
关于常量指针和指针常量的辨别
#include<stdio.h> int main() {     int a = 10;     int b = 20;
再睡一下就好
2025/06/10
490
面试题:常量指针和指针常量?
在 C++ 中,常量指针(const pointer)和指针常量(pointer to const)是指针变量的两种变形。它们各自具有不同的特点和应用场景。
GeekLiHua
2025/01/21
1400
C++随记(五)---const 与 指针
本文介绍了C++中const与指针的用法,包括指针指向常量数据、指针本身声明为常量以及指针作为函数参数传递时的const限制等。
TeeyoHuang
2017/12/28
6160
指针常量和常量指针
顾名思义 这是一个指针类型的常量!常量的特点就是不可改变,所以被指针指向的常量地址也是不可以变的。
用户7272142
2023/10/11
2680
指针常量和常量指针
【C++】const关键字
实际上和const修饰结构体一样,当需要打印数据时,并且当数据量太大,不想复制一份数据到内存空间时,就传一个地址或者引用,此时形参改变,实参也会跟着改变,所以此时需要防止实参被修改!
后端码匠
2023/02/27
5180
【C++】const关键字
指针(一)
什么是野指针?野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
DeROy
2020/05/11
5010
【专业技术第二讲】c语言中const的使用
这里对const的使用做一个大致的总结。 C语言的const关键字与指针搭配使用,const是C语言中保留的一个关键字,它用来限定一个变量是只读的,即不可变的。程序中使用const可以在一定程度上提高
程序员互动联盟
2018/03/14
8040
【专业技术第二讲】c语言中const的使用
【C 语言】const 关键字用法 ( 常量指针 - const 在 * 左边 - 修饰数据类型 - 内存不变 | 指针常量 - const 在 * 右边 - 修饰变量 - 指针不变 )
const 关键字 在 C 和 C++ 中的表现不同 , 本篇博客主要介绍 C 语言中的 const 用法 ;
韩曙亮
2023/03/29
3.6K0
C/C++工程师面试题(指针篇)
下面代码中使用了 (int*)、(double*) 和 (char*) 分别进行了类型转换。
SarPro
2024/02/20
3830
C/C++工程师面试题(指针篇)
c/c++补完计划(一): 指针常量和常量指针
前言 想写点c/c++的东西. 正文 最近笔试遇到一个题, 要写出以下4种情况的输出: int main() { const char *str1 = "ddddddd"; char *const str2 = "ddddddd"; char *str3 = "ddddddd"; char str4[] = "ddddddd"; *(str1 + 2) = 'a'; *(str2 + 2) = 'a'; *(str3 + 2) = 'a'
sean_yang
2020/07/21
3330
C++基础语法重点总结
函数重载指的是在同一个作用域中,声明了具有相同函数名的函数,它们的参数列表不同,也就是说参数类型不同,参数个数不同,参数顺序不同,返回值同不同都可以。
二肥是只大懒蓝猫
2023/10/13
2580
指针(二) - (const)指针与常量
const使用 声明一个常量 关键字const用来告诉编译器一个一旦被初始化过的变量就不能被修改 int a; const int n; 一 常量指针 指针指向一个常量 修饰指针指向 #include int main() { //常量指针 const int num = 10; // num = 100; int* p1 = &num; *p1 = 100; printf("%d\n", num); // 可以通过p1修改num (c语言可以c++不可以) // 不可以通过p2,p3修
木杉乀
2021/04/02
4340
C++:18---const关键字(附常量指针、指针常量、常量指针常量)
一、const变量的一些基本特点 ①const修饰的变量不能被修改 const int a=10;a=20;//错误 ②因为const修饰的变量不能被修改,所以必须被初始化 int a=10;const int b=a; //正确const int c=10; //正确 ③const修饰的变量可以赋值给其他值 const int a=10;int b=a;//正确 ④可以有常量引用 int a=10;const int &b=a; 二、在其他文件中使用const常量(extern) const常量默
用户3479834
2021/02/03
1.5K0
C++基础 杂记(一)
函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈上分配空间,在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义为全局的变量,但会破坏此变量的访问范围(使得在此函数中定义的变量,不仅仅只受此函数控制)。static 关键字则可以很好的解决这个问题。
xxpcb
2020/08/04
4070
C / C++ const 全面总结
在 C / C++ 中,const 关键字用于定义不可修改的变量,这些变量在声明后不能被改变。通过使用const 关键字,可以提高代码的可读性和安全性,防止意外修改变量的值。
用户11286421
2024/09/23
1870
c++中的const和volatile知识自我总结
1、const限制一个变量不能修改其内容,如果强行修改的话,如下面代码这样子,编译就会报错,“表达式必须是可修改的左值”。
chenjx85
2019/05/06
6370
define与const关键字的多种用法
这将创建一个名为 SQUARE 的宏,它接受一个参数 x,并返回 x * x 的结果。比如可以在代码中使用 SQUARE(5) 来得到 5 的平方。
SarPro
2024/02/20
1650
详解 常量指针和指针常量
说一下 常量指针和指针常量 的区别。 常量指针   指向常量的指针,也就是说指针指向的对象是常量,指向的常量不能修改。指针不是一个常量, 可以把指针指向别一个常量。 常量指针是我们最常用的,一般声明形式如下: const int *p; int const *p; 例: int a(1), b(3); const int *p; // 或者是 int const *p; p = &a; std::cout << "address : " << p
lpxxn
2018/01/31
1.3K0
指针指向常量_常量指针的四种
指针常量和常量指针都离不开const关键字,我们先来了解一下什么是const关键字,const被用来定义常量,如果将一个变量加上const关键字,则被修饰的变量的值将无法改变。这个变量的值只能被访问,无法被修改。const关键字可以修饰变量或者指针。
全栈程序员站长
2022/11/01
7890
指针的艺术——指针是什么?
指针是C/C++中非常非常重要的概念,指针可以用于存储内存地址,动态分配内存等。在项目开发中应用比较频繁,可以简化一些程序任务的执行。学会使用指针是作为C++程序猿必备的技能。
鳄鱼儿
2024/11/03
1160
相关推荐
关于常量指针和指针常量的辨别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验