有关C++的数据类型问题。

Iamfreak 2018-08-07 11:22:57
其实我一直不是很能理解为什么C++的字符串要写出 const char* p="ball";而不能是char *p="ball";
还有便是既然const char* 对应于字符串,那const int *或者const double* 有对应的字面常量吗?
...全文
244 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxgmlcj 2018-08-10
  • 打赏
  • 举报
回复
引用 10 楼 Iamfreak 的回复:
[quote=引用 5 楼 zxgmlcj 的回复:]
编译器允许char *p = "ball"这种写法,编译运行都没问题。但"ball"是字符串常量,存储在字符串常量区(只读区),而字符串常量区的数据都是无法改变的,也就是如果你p[0]='d'进行类似的修改操作,则无法运行,出错。而const char *p="ball"这种写法就是为了防止程序员在无意识的情况下修改值。

但是我写成char a[]="ball";a[0]="c";这样的语句就是合法的,我不明白为什么对于指针非要弄成const,对于赋给数组的字符串常量却是可以修改的。[/quote]
因为char a[]="ball" 的原始数据"ball"是存储在常量区,但数组会将常量区的数据复制一份存储在栈区,而栈区数据可以修改,修改后不会影响常量区。指针写法,直接指向了常量区,操作的是常量区的数据,无法修改
Iamfreak 2018-08-10
  • 打赏
  • 举报
回复
引用 5 楼 zxgmlcj 的回复:
编译器允许char *p = "ball"这种写法,编译运行都没问题。但"ball"是字符串常量,存储在字符串常量区(只读区),而字符串常量区的数据都是无法改变的,也就是如果你p[0]='d'进行类似的修改操作,则无法运行,出错。而const char *p="ball"这种写法就是为了防止程序员在无意识的情况下修改值。

但是我写成char a[]="ball";a[0]="c";这样的语句就是合法的,我不明白为什么对于指针非要弄成const,对于赋给数组的字符串常量却是可以修改的。
Iamfreak 2018-08-10
  • 打赏
  • 举报
回复



引用 7 楼 zhouchongzxc 的回复:
你可以用 char bar[] = xxxx

我很好奇,同样是字面字符串,凭什么指针非要加上const,而数组却不必,可以修改字面字符串的值
棉猴 2018-08-09
  • 打赏
  • 举报
回复
char* p = "123";
p[0] = 'a';

编译能通过,但是运行时错误。编译工具是VS2015
	const char* p = "123";
p[0] = 'a';

编译时就不能通过。所以,为了能够尽早发现错误,所以最好将p定义为const char*。出错的原因5楼的朋友已经说了。
对于定义const int*类型,如果只是通过常量,比如1、2、3等对其赋值。无法知道常量1、2、3的地址,所以一般不会使用。
zxgmlcj 2018-08-09
  • 打赏
  • 举报
回复
编译器允许char *p = "ball"这种写法,编译运行都没问题。但"ball"是字符串常量,存储在字符串常量区(只读区),而字符串常量区的数据都是无法改变的,也就是如果你p[0]='d'进行类似的修改操作,则无法运行,出错。而const char *p="ball"这种写法就是为了防止程序员在无意识的情况下修改值。
jiqiang01234 2018-08-09
  • 打赏
  • 举报
回复
const int*当然可以赋值字面量,但前提是你得确定地址合法。一般来说在有操作系统的地方不这样用,因为很难确定一个常量地址究竟指向了什么地方,这是加载器做的工作。但在嵌入式领域,很多地址是确定的,可以直接指向其常量。比如,指向片内EEPROM的某一块地址,然后可对其进行读写。
ChongQingJin28 2018-08-09
  • 打赏
  • 举报
回复
你可以用 char bar[] = xxxx
赵4老师 2018-08-07
  • 打赏
  • 举报
回复
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
Iamfreak 2018-08-07
  • 打赏
  • 举报
回复
而且我就不明白了,不是说const不能传给非const变量吗,我在类里面定义了一个char *p;的成员指针,结果用构造函数对其初始化的时候还能传入const char * a这种东西,当然了,初始化用的是strcpy_s()这个函数,可是我万万没想到C++里面还有char *这种东西,不是只有const char *吗?为什么strcpy函数能将一个const字面常量字符串复制给一个非const char *指针
kuangbao9 2018-08-07
  • 打赏
  • 举报
回复
我只知道加const表示不能修改其所修饰的变量。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧