const char *p;       const修饰*p,所以*p是一个常量,不可修改。

char* const p;   const修饰p,所以指针p是一个常量,不可修改。

#include<iostream>
using namespace std;
int main(void)
{
const char *p;
p="I Love ShangHai";
while(p)
{
if(*p=='L')
*p='l';//编译不能通过。error:表达式左值必须是可修改的值 *p不可修改
p++;
}
getchar();
}

上面程序想通过遍历字符串,把大写的L改为小写的l,但是由于p指针指向的值不可修改,*p='l'; 编译不能通过。

#include<iostream>
using namespace std;
int main(void)
{
char * const p="I Love Shang Hai";
while(p)
{
cout<<*p;
p++;//编译不能通过。error:表达式必须是可修改的左值 指针p不可修改
}
cout<<endl;
getchar();
}

上面程序想通过遍历输出字符串,但是由于指针p是常量,p++编译不能通过。

总结:是指针常量还是常量指针,主要看const修饰谁。const char *p; 中的const修饰*p,故p指向的值不可修改。char *const p; 中的const修饰p,故指针p不可修改。

看下面的一些情况:

1,const int *a = &b

int b = 500;
const int *a = &b;
*a=600;//错误 const 修饰*a,所以*a是一个常量不可以修改

如果一定要修改呢?可以尝试以下解决方案。就是抓住p是变量,让指针p指向别的变量,或者直接改变所指向的变量。

方案1:

int b = 500;
const int *a = &b;
b=600;
cout<<*a<<endl;//正确

方案2:

int b = 500;
int c=600;
const int *a = &b;
a=&c; //虽然*a是常量,但是a仍然是一个指针变量
cout<<*a<<endl;

2,int * const a = &b;

int b = 500;
int c=600;
int * const a=&b;
a=&c;//错误,const 修饰a,所以a不可修改。
cout<<*a<<endl

3,常量的定义必须先初始化。

int b = 500;
int c=600;
int * const a; //错误,没有初始化
const int *a ; //正确,*a是常量,但是a仍然是一个指针变量。

const char *p;和char * const p的区别的更多相关文章

  1. C语言执行时报错“表达式必须是可修改的左值,无法从“const char [3]”转换为“char [120]” ”,原因:字符串不能直接赋值

    解决该问题的方法:使用strcpy函数进行字符串拷贝   原型声明:char *strcpy(char* dest, const char *src); 头文件:#include <string ...

  2. const char *p、char const *p、char * const p的区别?

    const char *p和char const *p是一样的,都表示定义一个指向字符常量的指针,指针的内容(字符)不可变.char * const p表示一个指向字符的指针常量,字符可以改变,但是指 ...

  3. error: C2664: “zajiao::zajiao(const zajiao &)”: 无法将参数 1 从“const char [12]”转换为“char *”

    原本打算在QT用一个字符串"ABCDEF12345"作为类zajiao的构造函数的参数,用来创建类zajiao的对象zajiao1. zajiao zajiao1("AB ...

  4. char * p = "abc"与const char *p = "abc"

    char * p = "abc"与const char *p = "abc"的区别是什么呢? 第一个语句会产生问题: warning: deprecated c ...

  5. 高德地图引入库错误std::string::find_first_of(char const*, unsigned long, unsigned long) const"

    一:std:编译器错误解决 二:错误提示 "std::string::find_first_of(char const*, unsigned long, unsigned long) con ...

  6. const *char p和char const *p

    const *char p和char const *p,const char*p的区别 char*const p——p必须初始化,且不能指向别处,即p是指针常量: char const*p——p指向的 ...

  7. 关于 const char *ptr,char const *ptr,char *const ptr 的讨论

    对于每个做C/C++的伙伴来说,面试中少不了关于const 的考察,尤其是对于刚毕业的新人. 今天听见同事在讨论这个问题,就随手写一下自己的理解.希望对大家又所帮助. 首先来说一下char *ptr: ...

  8. error C2664: “ATL::CStringT<BaseType,StringTraits>::Remove”: 不能将参数 1 从“const char [2]”转换为“char”

    转自VC错误:http://www.vcerror.com/?p=1395 问题描述: 代码: CString str("asdfafda"); str.Remove(" ...

  9. const char *转化为char *的方法

    直接将const char *赋值给char *是错误的,编译器不允许这种操作. #include "stdio.h" #include "string.h" ...

随机推荐

  1. 安装基准测试工具sysbench

    下载地址: http://pan.baidu.com/s/16KhJ4 解包 tar -zxvf sysbench-0.4.12.tar.gz 进入源码文件夹 cd sysbench- 执行autog ...

  2. 关于dom4j解析xml

    一:相关jar包 dom4j-1.6.1.jar 二:用例xml文件 三:解析 注:可能有的小白不知道如果获取节点,so,you can: for (Iterator<Element> i ...

  3. BZOJ 4078: [Wf2014]Metal Processing Plant [放弃了]

    以后再也不做$World Final$的题了................ 还我下午 bzoj上TLE一次后就不敢交了然后去uva交 Claris太神了代码完全看不懂 还有一个代码uva上竟然WA了 ...

  4. 【转】PE详解

    参考网址: http://blog.tianya.cn/listcate-4259222-2269876-1.shtml PE文件

  5. 从细菌GFF文件提取CDS序列并转换为氨基酸序列

    最近在上生物信息学原理,打算记录一些课上的作业.第一次作业:如题. 基本思路: 1.从GFF中读取CDS的起始终止位置以及正负链信息.GFF格式见http://blog.sina.com.cn/s/b ...

  6. etcd集群部署

    etcd是用于共享配置和服务发现的分布式KV存储系统,随着CoreOS和Kubernetes等项目在开源社区日益火热,它们都用到了etcd组件作为一个高可用.强一致性的服务发现存储仓库.操作系统版本: ...

  7. window.location的路径

    1 相对路径 window.location.href='add_affiche.php'; 或 window.location.href='./add_affiche.php'; 2 绝对路径 wi ...

  8. Jenkins 不同角色不同视图及不同权限设置

    由于jenkins默认的权限管理体系不支持用户组或角色的配置,因此需要安装第三发插件来支持角色的配置,本文将使用Role Strategy Plugin,介绍页面:https://wiki.jenki ...

  9. 抛砖引玉之~sftp

    跨平台系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#linux XFtp用惯了,没有它就不行了?Linux就不能文件传输了? 答案肯定是~No ...

  10. 2.数码相框-编码(ASCII/GB2312/Unicode)介绍,并使LCD显示汉字字符(2)

    在上章-学习了数码相框的框架分析(1)了 本章主要内容如下: 1)熟悉ASCII/GB2312/Unicode编码 2)写应用程序,使LCD显示汉字和字符 大家都知道,数据传输的是二进制,而字符和汉字 ...