c和c++中有三种定义:

1.const char *str,

2.char *const str,

3.char const *str.

现总结三者之间的区别:

一 char *const str

这是定义了一个指向字符的指针常量,即str的指向不能被修改,但是可以修改指针所指向的内容。

我们可以通过代码来验证修改str指向的内容:

#include<iostream>
using namespace std;
int main()
{char arr[] = "abcdefg";//定义一个字符串数组,数组名相当于首元素地址char* const str = arr;str[0] = '3';//通过指针p间接修改arr数组的内容printf("%s\n", arr);
}

结果如下:

但如果我们改变str的指向此时

#include<iostream>
using namespace std;
int main()
{char arr[] = "abcdefg";//定义一个字符串数组,数组名相当于首元素地址char* const str = arr;str++;//修改str的指向printf("%s\n", arr);
}

此时编译器报错了

char *const str 就差不多是这样告诉编译器我str是指向a的即数组arr的首元素地址,我str指向你a之后就不能在变了。以后就是你的人了

二 const char  *str

定义一个指向字符常量的指针,在这里str是一个指向char*类型的常量,也就是不能通过str来修改所指向的内容。用通俗的话来说就是*str的值为const,不能修改。但这并不意味着str所指向的值是一个常量,这个常量是站在str的角度而言,站在str的角度这个值是一个常量。如图所示str指向了arr,可以通过arr来修改arr的值,但不能通过str修改。

#include<iostream>
using namespace std;
int main()
{char arr[] = "abcdefg";//定义一个字符串数组,数组名相当于首元素地址const char* str = arr;arr[0] = 'w';arr[1] = 'e';printf("%s", arr);
}

结果:

通过运行结果我们发现我们可以通过arr直接修改里面的内容,这说明arr里面的内容不是常量。

但如果我们通过str去修改了

我们发现编译器直接报错了:

如果我们修改str的指向了

#include<iostream>
using namespace std;
int main()
{char arr[] = "abcdefg";//定义一个字符串数组,数组名相当于首元素地址const char* str = arr;str++;printf("%s", arr);
}

我们发现这是没有问题的

三 char const *str

这个其实和上面这种const char *str是等价的也就是 const char *str==char const *str,大家可以自行验证

四 个人总结

const char *str和char const *str等价,可以直接修改指针的指向但不能修改指针指向的值。

char *const str可以直接修改指针指向的值但不能修改指针的指向。

其实也可以总结为:const 与*的位置关系如果const在*号的左边那么可以直接修改指针的指向但不能修改指针指向的值。

如果const在*的右边可以直接修改指针指向的值但不能修改指针的指向。

五 const 用途

可以为以下三点:

1.定义只读变量,或者常量

2.修饰函数的参数和函数的返回值

3.修饰函数的定义体,这里的函数为类的成员函数被const修饰的成员函数代表不能修改成员变量的值,也就是const成员函数只能调用const成员函数

4.只读对象。只读对象只能调用const成员函数

c语言里面的const能定义真正意义上的常量吗?

答案是不能。这是因为c语言中仅仅是在编译层来限定不能对const修饰的变量进行赋值操作。在运行期间是无效的,但在c++中在编译期会把const常量放到符号表中,以后遇到这个常量会去符号表中找。所以在c++中的const修饰的变量是不可能被修改的可以

这里可以参考一下我的这篇初识c++https://blog.csdn.net/qq_56999918/article/details/119747949

拓展:

1.在C语言中的局部const常量是放在栈区全局的const常量是放在只读存储区,所以全局的const无法被修改,只是一个只读变量

2。常量并不只是不可被修改并且他的值在编译期间就已经决定了而不是在运行的时候决定。

3.const和宏是有区别的。宏是在预编译期间完成文本替换,而const发生在编译期间,比宏多了作用域检查和类型检查。

4.在c语言中只有enum才算的上是实现了真正的常量

博主知识水平有限,如果觉得不错的话点个赞。

const char *str,char const *str,char *const str的区别,及const详解相关推荐

  1. python中str和input_对python中raw_input()和input()的用法详解

    最近用到raw_input()和input()来实现即时输入,就顺便找了些资料来看,加上自己所用到的一些内容,整理如下: 1.raw_input() raw_input([prompt]) -> ...

  2. python基础-变量,变量类型,字符串str,元组tuple,列表list,字典dict操作详解(超详细)

    python基础--变量 (文章较长,若需要单独看某一个点,可点击目录直接跳转) 文章目录 python基础--变量 1. 变量 2. 变量类型 2.1数字类型 2.2 字符串 2.3 列表 2.4 ...

  3. javaScript中const,var,let区别与用法详解

    业务场景:今天想从正则表达式数组对象取出几个参数的值,发现好多人都用的const声明的变量,这里一起总结一下吧. 上一篇-->前端使用正则表达式获取地址栏URL参数的值并将需要的参数值展示在页面 ...

  4. int CWnd::GetWindowTextW(LPTSTR,int) const”: 不能将参数 1 从“char [10]”转换为“LPTSTR”

    问题描述: [cpp] view plaincopy //定义了三个编辑框控件 接受num1 num2 num3 void CTestDlg::OnBnClickedButton1()   //响应按 ...

  5. “const char *“ 类型的实参与 “char *“ 类型的形参不兼容错误的解决方法

    "const char *" 类型的实参与 "char *" 类型的形参不兼容错误的解决方法 参考文章: (1)"const char *" ...

  6. 关于VS2022 C++报错 const char* 类型的实参与char *类型的形参不兼容解决办法

    关于VS2022 C++报错 const char* 类型的实参与char *类型的形参不兼容解决办法 问题来源 错误原因 解决方案 问题来源 在学习写C++代码时候,去练习课本上课后习题时候的问题, ...

  7. c语言中常量有何作用,C语言const的用法详解,C语言常量定义详解

    有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定.例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小.为了满足这一要求,可以使用const关键字对变量加以限定: co ...

  8. C语言const的用法详解

    我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定.例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小.为了满足这一要求,可以使用const关键字对变量加以限定: const ...

  9. 【转载】cocos2d-x类型转换(CCstring int string char UTF-8互转)以及字符串详解

    cocos2d-x中的字符串: <1>:使用 const char* 和 std::string const char* 是C风格的字符串  ,std::string 是C++风格的字符串 ...

最新文章

  1. GAN背后的理论依据,以及为什么只使用GAN网络容易产生
  2. 使用MiniProfiler跟踪MVC + EF + Bootstrap 2 权限管理系统的性能消耗
  3. HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求。(上传文件长度问题)
  4. Python URL编码
  5. 跨域总结(jquery,php)
  6. 开源许可协议了解这些就够了
  7. 女程序员上班第一件事:调整IDE颜色以适配今天的衣着妆容
  8. 深度学习超参数简单理解:learning rate,weight decay和momentum
  9. IDEA打包Springboot项目,运行
  10. 淘宝客是鸡肋还是熊掌
  11. 台式计算机主要有哪些硬件组成,构成台式电脑主机的基本硬件有什么
  12. Mysql笔记之 数据类型
  13. 转SISD、MIMD、SIMD、MISD计算机的体系结构的Flynn分类法
  14. 2021年第一天的祝福送给大家
  15. 安装SQL server显示重新启动计算机失败解决方法
  16. 网页版酷我音乐 ---- 谷歌插件之歌词定位
  17. Nodejs中的Buffer
  18. 2017-2018-2 20155314《网络对抗技术》Exp5 MSF基础应用
  19. 分解和合并:Java 也擅长轻松的并行编程! 作者:Julien Ponge
  20. 我的Github注册使用之旅

热门文章

  1. 2019蓝桥杯B组省赛 J.灵能传输
  2. 服务器外链图片不显示,一次解决WordPress引用外部图片无法显示问题
  3. “乒乓外交”和人脉扩展
  4. 科学的特性与中医理论的基础 作者:奥卡姆剃刀
  5. 你真的会给领导发微信吗?三发三不发,不懂这6招,必被敲打
  6. 太极熊猫服务器怎么都在维护,太极熊猫3月8日战区调整及维护公告
  7. 生成目录结构树 tree
  8. Vue 之 Vuex(3)mapState 的使用
  9. 架构相关:服务降级思路与方法
  10. 色彩心理学对网页设计有多大影响力?