修饰变量时 const char 与 char const 是等价的,例如

  1. const char a = 'a';
  2. char const a = 'a';
表示变量a不能再被赋予其他值.

到指针时情况有点复杂,有 const 限定指针本身和限定指针指向的内容的区别,同样首先要说明的是
  1. const char *p = "ABC";
  2. char const *p = "ABC";
这两种写法完全一样,都表示指针 p 指向的内容不能通过指针 p 修改,指针本身是可以指向其他内存地址的,这样说不是很明白,因为"ABC"本身就是常量,不能被修改,还是代码解释吧
  1. char buf1[] = "ABC";
  2. char buf2[] = "DEF";
  3. const char *p = buf1;
  4. *p = 'B'; // 错误,在p看来,buf1的内容是不可改变的,想通过p来修改buf1的内容编译器将报错,事实上buf1的内容是否可变由buf1本身属性决定
  5. p = buf2; // 没问题,指针p本身并不是const
与此对应还有另一种情况 
  1. char buf1[] = "ABC";
  2. char buf2[] = "DEF";
  3. char * const p = buf1;
  4. *p = 'D'; // 没问题, const 修饰 p 本身,表示p指向的内存地址不能改变,但是内存地址上的内容并没有被限定为const,内容是可以通过p改变的
  5. p = buf2; // 错误,p为常量,初始化后不能被赋予其他值
一种比较变态的写法
  1. char buf[] = "ABC";
  2. const char * const p = buf; // 这么做以后既不能将p指向其他内存地址,也不能通过p修改buf的内容
总结来就是 :
const 在 * 左边时表示指针指向的内容不能通过指针修改,但是指针本身是可变的,它可以指向其他的内存地址(const 限定指向的内容);
const 在 * 右边时表示指针本身是不可变的,它不能再指向其他的内存地址,但是可以通过指针修改它指向的内容(const 限定指针本身).

const 那点事儿的更多相关文章

  1. openssl 1.1.1 reference

    openssl 1.1.1 include/openssl aes.h: # define HEADER_AES_H aes.h: # define AES_ENCRYPT 1 aes.h: # de ...

  2. 面试6-----11 const和静态变量那些事儿

    6 看看const和指针的那些事儿 const在int*左边 const在int*右边 const在int*两边------>请看代码注释 (1)代码 #include <stdio.h& ...

  3. 关于ES6的let、const那些事儿

    Babel 转码器 Babel是广泛使用的一个ES6转换器,将ES6代码转换成ES5代码,从而实现在老版本的浏览器执行. let和const命令 let所声明的变量只在let命令所在的代码块内是有效的 ...

  4. Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名

    Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://b ...

  5. Linux系统中“动态库”和“静态库”那点事儿【转】

    转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻. ...

  6. Linux下的”锁“事儿

    原由 之所以写这篇文章当然还是在面试中涉及了对本文标题的相关问题-互斥锁和自旋锁的区别.听到这个问题的时候,我是比较忐忑的.互斥锁我还能简单说一些,但是对于自旋锁的了解几乎为零.为此,将总结Linux ...

  7. Android中JNI编程的那些事儿(1)

    转:Android中JNI编程的那些事儿(1)http://mobile.51cto.com/android-267538.htm Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须 ...

  8. Linux系统中“动态库”和“静态库”那点事儿

    摘自http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在 ...

  9. 找工作笔试面试那些事儿(8)---常问的CC++基础题

    这一部分是C/C++程序员在面试的时候会被问到的一些题目的汇总.来源于基本笔试面试书籍,可能有一部分题比较老,但是这也算是基础中的基础,就归纳归纳放上来了.大牛们看到一笑而过就好,普通人看看要是能补上 ...

随机推荐

  1. 在ASP.NET MVC3 中利用Jsonp跨域访问

    在ASP.NET MVC3 中利用Jsonp跨域访问 在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录.一般情况下我们需要在多系统之间使用多个用户名和密码.这样客户就需要在多个系统之间重复 ...

  2. [转]Debugging the Mac OS X kernel with VMware and GDB

    Source: http://ho.ax/posts/2012/02/debugging-the-mac-os-x-kernel-with-vmware-and-gdb/ Source: http:/ ...

  3. 关于GNU软件的版本号命名规则

    这里所说的版本号命名并非指“正式版”.“测试版”这种方式,而是在讨论版本编号的问题,例如Linux内核3.0以后的版本命名规则是3.A.B,A是内核的版本,B是安全补丁.那么对于一般的软件的版本号命名 ...

  4. [转]About the security content of iOS 8

    Source:http://support.apple.com/kb/HT6441 For the protection of our customers, Apple does not disclo ...

  5. [转]How WebKit’s Event Model Works

    原文:https://homes.cs.washington.edu/~burg/projects/timelapse/articles/webkit-event-implementation/ Fi ...

  6. Linux 环境进程间通信(六):

    linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...

  7. windows服务1053错误排查

    公司员工离职,接手他的任务,告诉我windows服务已经完成,没来得及测试.好吧,我接着做...... 服务生成后,运行bat文件.启动服务失败,提示错误编码1053.根据以往的经验,一般是三方面引起 ...

  8. JavaScript function函数种类介绍

    JavaScript function函数种类介绍 本篇主要介绍普通函数.匿名函数.闭包函数 1.普通函数介绍 1.1 示例 ? 1 2 3 function ShowName(name) {     ...

  9. 相对于C#,PHP中的个性化语法

    相对于C#,PHP中的个性化语法 背景 今天把PHP的基本语法结构熟悉了一下,包括:变量.类型.常量.运算符.字符串.作用域和函数等,本文列举一些我需要强化记忆的结构(和C#不同). 一些个性化的结构 ...

  10. Java笔记:Java集合概述和Set集合

    本文主要是Java集合的概述和Set集合 1.Java集合概述 1)数组可以保存多个对象,但数组长度不可变,一旦在初始化数组时指定了数组长度,这个数组长度就是不可变的,如果需要保存数量变化的数据,数组 ...