C++~我想问下"abcd"这个字符串常量是一个什么类型的指针?

如题~只需要告诉我是常量指针?指针常量?还是常指针常量?还是普通的指针?
如果认为是常量指针的话,那应该char * s="abcd"是会报错的啊,但实际上是通过的~没问题的,说明了"abcd"不是常量指针和常指针常量,但为什么s[1]='z'的时候就会内存出错呢?(运行的时候),如果不是常量指针的话,应该是允许修改内容的吧?请高手赐教一下字符串常量到底是一个什么类型的指针?
我个人认为是这样的,char * s="abcd";实际上执行的时候是动态分配了5个const char类型的空间给p,即p=const new char[5]("abcd");因此"abcd"可以赋给s的同时,s[1]='z'修改内容的话就会内存出错、

是这样的,其实"abcd"这个字符串是你代码中给出的常量,存在于页面缓存之上,也就是程序一运行就已经存在了,与你进行了什么操作无关。
而char * s="abcd"这句话只是将那个已经存在的内存块的起始地址付给了s
所以s本身是指针变量,但它却指向一段页面缓存,页面缓存是不允许直接更改的

你可以做如下的实验

char *s="abcd";//缓存位于页面
char r[5]="ABCD";//缓存位于栈
char *t=new char[5];//缓存位于堆

通过调试观察,你会发现这三个指针所得到的地址确实位于不同的区域,追问

谢谢各位高手了,不过个人还是偏向了这位仁兄的书法,对于 porker2008和 asdf_12346的说法其实我觉得都是挺有道理的,但可能是不同的编译器所得到的结果不同吧,gaoxin618的推断的话就还是能接受的,但有点擦边,总的来说还是谢谢各位高手啦,呵呵,这个问题纠结很久了~

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-05-11
我想可能有这么几点:
第一。char * s="abcd"中的s是常量指针,这条语句不会报错,因为这是一个初始化语句,没有任何问题。但是s[1]='z'是会出错的,原因是"abcd"是一个常量,虽然没有用const来限制,所以s就是指向这个常量的常量指针。编译char * s="abcd"和s[1]='z'不报错而运行就出现内存错误,就是因为编译时并不知道s是常量指针,因为对s没加const限制。
第二。问题可能在对"abcd"这个量的理解上。实际上"abcd"的类型是char *,在编译第一条语句时是没有问题的。但是如果改成char * s='a',这时编译就会出错。因为'a'是char类型。而char * s="a"依然不会出错。
第三。如果改成const char* s = "abcd";那么编译的时候会提示第二句s[1]='z'有错,编译不会通过。
第四。如果改成char s[]="abcd"的话就没有问题了,编译运行都没有问题。
第2个回答  2011-05-11
这个问题其实没那么复杂,C++中形如"abcd"这样的字符串常量,其类型都是 const char* ,至于实际保存在什么地方,标准没有明确规定,但大部分编译器会将其放在内存的只读区中,所以运行时试图修改其中内容会出错。
为什么 const char* 类型的字符串常量赋值给 char* 类型的变量可以编译通过呢?其实仅仅是一个特例而已,最初是C++为了与C代码兼容而规定的一个特例,它允许"abcd"这样的字符串常量隐式转化成 char* ,以兼容许多老式的C代码以及一些C风格程序员的习惯。
第3个回答  2011-05-11
"abcd"怎么会是指针呢?其实是这样的:
编译时遇见“abcd”字符串时,编译器会将其存储在常量区,当然就会有一个地址;
char * s="abcd" 就是把这个地址赋值给了s,怎么不可以呢?
s[1]='z'是肯定会报错的。因为s指向的地址是常量区,其值是不可以改变的。
你可以对比下这两种声明方式:
char *s="abcd";
char s[]="abcd";
第一种方式s值是:0x0041563c,常量区地址
(常量区地址值和堆区及栈区值都有各自的范围)
第二种方式是:0x0012ff4c,栈区地址
第4个回答  2011-05-11
int* a = "asd";
你可以用这句来检验
应该返回错误: cannot convert `const char*' to `int*' in initialization
所以可以看出,是常量指针

实际上, C++在做char * s="abcd";的时候, 是做对指针s的初始化, 编译器默许了这个强制类型转换追问

error C2440: 'initializing' : cannot convert from 'char [4]' to 'int *'~~额~我用VC++6.0返回的是这个错误呢~

追答

VC6使用的不是标准C++. 是Microsoft自己定义的.

追问

哦哦~那您用的是什么编译器呢?

追答

我自己用的是DEV-C++, 不过其实也不是很标准. 不过大部分还是标准的.
用VS2005/2008/2010的话也是标准的

相关了解……

你可能感兴趣的内容

大家正在搜

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网