const char *p;和char * const p的区别
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的区别的更多相关文章
- C语言执行时报错“表达式必须是可修改的左值,无法从“const char [3]”转换为“char [120]” ”,原因:字符串不能直接赋值
解决该问题的方法:使用strcpy函数进行字符串拷贝 原型声明:char *strcpy(char* dest, const char *src); 头文件:#include <string ...
- const char *p、char const *p、char * const p的区别?
const char *p和char const *p是一样的,都表示定义一个指向字符常量的指针,指针的内容(字符)不可变.char * const p表示一个指向字符的指针常量,字符可以改变,但是指 ...
- error: C2664: “zajiao::zajiao(const zajiao &)”: 无法将参数 1 从“const char [12]”转换为“char *”
原本打算在QT用一个字符串"ABCDEF12345"作为类zajiao的构造函数的参数,用来创建类zajiao的对象zajiao1. zajiao zajiao1("AB ...
- char * p = "abc"与const char *p = "abc"
char * p = "abc"与const char *p = "abc"的区别是什么呢? 第一个语句会产生问题: warning: deprecated c ...
- 高德地图引入库错误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 ...
- const *char p和char const *p
const *char p和char const *p,const char*p的区别 char*const p——p必须初始化,且不能指向别处,即p是指针常量: char const*p——p指向的 ...
- 关于 const char *ptr,char const *ptr,char *const ptr 的讨论
对于每个做C/C++的伙伴来说,面试中少不了关于const 的考察,尤其是对于刚毕业的新人. 今天听见同事在讨论这个问题,就随手写一下自己的理解.希望对大家又所帮助. 首先来说一下char *ptr: ...
- error C2664: “ATL::CStringT<BaseType,StringTraits>::Remove”: 不能将参数 1 从“const char [2]”转换为“char”
转自VC错误:http://www.vcerror.com/?p=1395 问题描述: 代码: CString str("asdfafda"); str.Remove(" ...
- const char *转化为char *的方法
直接将const char *赋值给char *是错误的,编译器不允许这种操作. #include "stdio.h" #include "string.h" ...
随机推荐
- 话说CentOS6的启动流程
1.按下开机按钮,电脑的主板通电,电脑开始加电自检(POST,Power On and Self Test),测试主机的硬件是否满足开机的要求. 2.加载主板上的BIOS(Base Input/Out ...
- MySQL递归的替代方案
类似查出某个机构下所有的子机构,可用递归的方式实现.但MySQL不支持递归,可以考虑用如下的方式来实现递归调用. 第一种,临时表方式,使用函数每次查出子机构,再可以和其他表联查. 第二种,新建一张表, ...
- C 洛谷 P3599 Koishi Loves Construction [构造 打表观察]
题目描述 Koishi决定走出幻想乡成为数学大师! Flandre听说她数学学的很好,就给Koishi出了这样一道构造题: Task1:试判断能否构造并构造一个长度为的的排列,满足其个前缀和在模的意义 ...
- JAVA 二进制基础
主要内容 1.十进制二进制互转 2.二进制的位运算 3.JDK内置的进制转换 4.JAVA中的进制 十进制二进制互转 57 111001 二进制的位运算:优点:特定情况下,计算方便,被支持面广泛. ① ...
- 【转】PE详解
参考网址: http://blog.tianya.cn/listcate-4259222-2269876-1.shtml PE文件
- Python中Template使用的一个小技巧
Python中Template是string中的一个类,可以将字符串的格式固定下来,重复利用. from string import Template s = Template("there ...
- CentOS安装JDK 8
准备工作 首先,更新包: yum update 检查服务器上是否已安装旧版本的Java: java -version 如果有旧版本的Java则移除: yum remove java-1.6.0-ope ...
- [原创]ubuntu14.04部署ELK+redis日志分析系统
ubuntu14.04部署ELK+redis日志分析系统 [环境] host1:172.17.0.4 搭建ELK+redis服务 host2:172.17.0.3 搭建logstash+nginx服务 ...
- js的call和apply拾遗
一.产生背景 1. JavaScript 的函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念 2.正因为上下文的不同所以call 和 apply 都是为了改变某个函数运行 ...
- java6 - 面向对象编程思想
一.学习大纲: 1. 类的理解:对现实事物的抽象表示 2. 行为与特征的理解:在类抽象过程中,通常把行为抽象成方法,把特征抽象成属性 3. 对象的理解:类的一个实例即是对象 4. Object 根类 ...