| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2878 人关注过本帖
标题:c++字符串字面值问题。
只看楼主 加入收藏
无语随风
Rank: 1
等 级:新手上路
帖 子:22
专家分:7
注 册:2009-7-13
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
c++字符串字面值问题。
c++中字符串字面值也就是c风格的字符串,作为右值使用是自动转换为指向首字符的指针,做为左值使用是不可更改,不转换为指针,下面两个代码:

     char a[ ] = "c++"   

     char *p = "c++"

第一个代码中字符串字面值显然作为左值,第二个显然作为右值,   我真看晕了,麻烦各位大虾帮帮忙,在此谢过了。
搜索更多相关主题的帖子: 字符 串字 面值 
2009-08-04 13:39
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 楼主 无语随风
第一个是一种初始化时用的语法(我也说不清是左值还是右值,应该说是一种特殊的语法)。只是为了方便给a赋初值,和计算a的长度。之后a数组中存的值都是可以改的。
第二个的"C++"是做为字符串常量,你说的是对的,由于做右值,所以转成了指针。这个指针的值赋给了p,但应该不能通过p修改它指向字符串的值。

不知道这样说你明白了吗?
2009-08-04 13:51
无语随风
Rank: 1
等 级:新手上路
帖 子:22
专家分:7
注 册:2009-7-13
收藏
得分:0 
c++字符串字面值问题。
确实不怎么明白,书上说c++中字符串字面值本身是const char类型的数组,而代码:
      char *p ="c++"不是就将一个const对象存放在一个不指向const对象的指针中了吗,就是存放在一个普通的指针中了吗?显然很矛盾,不理解。上面两个式子不是对在进行初始化操作吗?却一个是左值一个是右值。崩溃啊!
2009-08-04 16:47
无语随风
Rank: 1
等 级:新手上路
帖 子:22
专家分:7
注 册:2009-7-13
收藏
得分:0 
烦请高手指点,不要嫌我烦啊。哈哈,一起进步?
2009-08-04 16:48
forclwy
Rank: 4
等 级:业余侠客
帖 子:167
专家分:255
注 册:2008-10-21
收藏
得分:0 
为什么不能通过p修改呢?
2009-08-04 16:49
无语随风
Rank: 1
等 级:新手上路
帖 子:22
专家分:7
注 册:2009-7-13
收藏
得分:0 
不是不能,只是通过指针p修改字符串字面量,是未定义的行为,语言本身没有随其定义。编译时会出错。
2009-08-04 16:58
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:20 
回复 3楼 无语随风
哦,对确实都是初始化,但不太一样。
第一个利用了初始化的特殊语法,第二个只是比较一般的语法。

比如:
int a[2] = { 0, 1 };
肯定是正确的吧?但是这种语法只用于赋初值,写成下面这样就不行:
int a[2];
a = { 0, 1 };
或者你写成:
a[2] = { 0, 1 };
也不行,反正这种写法是在赋值时方便才用的。

int a = 2;

int a;
a = 2;
就都可以。

给字符型数组也是相关的初始化语法:
char a[3] = { 'a', 'b', '\0' };

char a[3] = "ab";
甚至
char a[] = "ab";
都是一样的作用,这些都是利用了初始化的语法。
如果你不在定义时赋值,那么之后就必须这么写:
a[0] = 'a';
a[1] = 'b';
a[2] = '\0';
所以我认为第一个并不是左值。如果并要说一个,那个字面值也只是读访问,算右值吧。那个数组才是左值。之后你改那个数组和最初的那个"c++"什么的早就没关系了。

而所说的字符串字面值,我觉得理解成一个字符串常量比较好。它成就是一个整体,而且如果是常量肯定也不能更改。
作右值时,(是不是应该理解成)会被自动转换成指针,我觉得也不一定就是const char *,因为很显然不能把 const char * 赋值给 char *。
逻辑上它肯定不能改的,分配给它的内存应该也是只读的。我觉得去更改它倒是也没有语法错误,后来编译试了试,果然编译通过了,执行时才有问题。
2009-08-04 20:37
shiweifu
Rank: 1
等 级:新手上路
帖 子:193
专家分:3
注 册:2006-12-2
收藏
得分:0 
char *pMsg = (char*)malloc(6);
strcpy(pMsg,"hello");
这种情况在pMsg的内存前四个字节和后四个字节都是FD,通过查看内存中的FD是否存在可以判断是否溢出
    char *p = (char*)malloc(1); 
    strcpy(p,"hi");
通过这种形式分配,可以赋值成功,但后面两个FD被破坏了,显然溢出了,这时就需要改代码了
2009-08-05 22:31
huanghongfu
Rank: 2
等 级:论坛游民
帖 子:12
专家分:10
注 册:2010-6-29
收藏
得分:0 
这个你在哪找来的?书上?
c++中字符串字面值也就是c风格的字符串,作为右值使用是自动转换为指向首字符的指针,做为左值使用是不可更改,不转换为指针,下面两个代码:

     char a[ ] = "c++"   

     char *p = "c++"

第一个代码中字符串字面值显然作为左值,第二个显然作为右值
左值是一个引用到对象的表达式(引用知道吧,和指针差不多,指向的意思),最普通的变量就是左值,而字面值是右值不可改变。第一个 代码char a[ ] = "c++"中的"c++"做为字符串字面值赋予数组a,第二个代码char *p = "c++"中"c++"代表了一个指针赋予指针p。
可以做个类比:int a,b;  int *d,*e;  a=b; a=1; d=e;  a左值,b左值(b指向的存储对象是可以改变的,赋予另一个常量就能改变),d左值,e左值,1右值。


2010-10-09 22:39
快速回复:c++字符串字面值问题。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.058233 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved