小众知识

首页 > 正文

const char * c="hahaha"; 和 char * c ="hahaha";有什么区别???

const char * c="hahaha"; 
和 
char * c ="hahaha";
有什么区别???  

 robinh00d 发表于:2003-03-26 22:28:19
得分:3 

第一个是指针指向的内容是常量(不可被修改) 

 Ngod 发表于:2003-03-26 22:32:38
得分:4 

char *c              = "hahaha";          // 非const指针,
                                         // 非const数据

const char *c        = "hahaha";          // 非const指针,
                                         // const数据

char * const c       = "hahaha";          // const指针,
                                         // 非const数据

const char * const c = "hahaha";          // const指针,
                                         // const数据

不是连const是什么都不知道吧? 

 micropentium6 发表于:2003-03-26 22:35:22
得分:3 

对于这个例子而言没什么不同,都是一样的,你不可能改变字符串的值,也不可能增加字符串 

 Cybergate 发表于:2003-03-26 22:39:28
得分:5 

没有区别, 但前者是安全的. 因为""括起来的常量本身就是const char*, 不能修改, 如果通过char *引用再进行修改则会发生不可预测的错误. 用const char*才是规范的. 但为了保证向下兼容, c++允许这样做. 但这样很不明智. 

 xbit 发表于:2003-03-26 23:01:25
得分:0 

Cybergate回答的不错。但是还是不能解决问题 

 shornmao 发表于:2003-03-27 09:50:05
得分:3 

对于
const char * c="hahaha";
类似c[0]="X"这样的代码会产生时编译错误。

对于
char * c="hahaha";
类似c[0]="Y"这样的代码可以编译,然而他的执行结果没有定义,可能导致不可预期的错误行为。 

 caoyfish 发表于:2003-03-27 10:10:53
得分:3 

楼上的正确 

 aitforever 发表于:2003-03-27 10:10:56
得分:3 

对于此例中效果是一样的,但若换了其它类型的话,效果就不一样了,
就如同 Ngod(天泽)同志所叙述的; 

 zhangx105504 发表于:2003-03-27 11:42:54
得分:3 

const char * p : const用来限定指针所指地址的内容,不能被修改

 bluebird97073 发表于:2003-03-27 11:45:21
得分:3 

同意楼上们
  

这个问题
 5角以上会员不要来抢分了 

 zz841229 发表于:2003-03-27 15:35:17
得分:3 

const char * c="hahaha";
是一个指向字符常量的指针,指向一个不能改的变量。如果改代码会产生编译错误。所以比较安全。
char * c ="hahaha";
是一个指向字符的指针,指向一个能改的变量。如果改代码不会产生编译错误。

 quickball 发表于:2003-03-27 16:32:17
得分:3 

没什么区别,严格的讲,还是写成

const char *c = "xyz"; 

 zergjimmy 发表于:2003-03-27 16:46:15
得分:3 

在《C专家编程》里面,说是如果把const关键字改为readOnly会让大家好理解一些。 

 termite 发表于:2003-03-27 17:56:00
得分:3 

没有区别, 但前者是安全的. 

 keyman55 发表于:2003-03-28 14:16:35
得分:3 

前者指向的是字符常量,不可改变,否则编译器会报错,后者不推荐! 

 andy_vc 发表于:2003-03-31 15:40:36
得分:3 

前者const char *c = "hahaha" 指的是声明了一个指向常量的指针。也就是说类似下面的语句是错误的:
 *c = "hello";  // error
但是你可以这样:
 char array[] = "aaaa";
 c = array; // ok!
后者char *c = "hahah"就无所谓了:
 *c = "hello"; // ok 

 salichen 发表于:2003-03-31 16:10:37
得分:3 

*c = "hello"; // ok????????????????????????????

 captivetianyi 发表于:2003-04-01 19:55:51
得分:3 

既然你们都很清楚我想问一个问题:
const char * string="any";
switch(*string)
{
   case "……": skip;//……代表要比较的
   case "……": skip;
}
这个为什么不行;
应该怎么写

 captivetianyi 发表于:2003-04-01 20:17:25
得分:3 

是switch不支持字符串;
只支持整数;
是这个原因吗!
那我要进行字符串的多路选择怎么办
不能用if……elseif 
那种结构太难看了 

 sinman 发表于:2003-04-01 22:33:03
得分:3 

const在*号左边表示指向常量的指针。
const在*号又边表示指针是常量 

 yuanhen 发表于:2003-04-01 22:53:22
得分:3 

对于第一个
char a[] = "nonono";
s = a; // 合法
s[0] = 'a';  // 非法

另外
对于char *const s = "adfasdf";
char a[] = "adsf";
s = a // 非法;
s[0] = 'a';  // 合法

还有const char * const s = "asdf";
char a[] = "asdf";
s  = a // 非法
s[0] = 'a'  // 非法

 yuanhen 发表于:2003-04-01 22:55:04
得分:3 



我解释的比较全面吧!  楼主这方面的问题都能解决了吧!
五角的老大,就不要和我们抢分了! 

 andy_vc 发表于:2003-04-02 21:07:23
得分:3 

不好意思!弄错了!哎!才疏学浅害死人啊!!!应该是:
const char* c = "aaaa";
 *c = 'a';  // error
但是你可以这样:
 char array[] = "aaaa";
 c = array; // ok!
后者char *c = "hahah"就无所谓了:
 *c = 'b'; // ok

 rena0504 发表于:2003-04-02 21:24:20
得分:3 

前一个是字符指针常量。
后一个是字符指针。 

 CliffWinston 发表于:2003-04-02 21:48:43
得分:4 

使用VC编译的答案:
const char * sa = "Hello";
char * sb = "Hello";
char sc[] = "Hello";

sa, sb都是常量字符串,不可以赋值的。
sc是字符串数组,可以用 sc[0] = 'A';

因为,sa, sb都是指针,指向一个常量字符串"Hello",放在code段;
sc是数组,放在data段里面的,因此可以更改。

以下是上面三行代码生成的汇编语言:
; Listing generated by Microsoft (R) Optimizing Compiler Version 13.00.9466 

TITLE Source1.c
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
$$SYMBOLS SEGMENT BYTE USE32 'DEBSYM'
$$SYMBOLS ENDS
$$TYPES SEGMENT BYTE USE32 'DEBTYP'
$$TYPES ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
; COMDAT ??_C@_05COLMCDPH@Hello?$AA@
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif

INCLUDELIB LIBCD
INCLUDELIB OLDNAMES

PUBLIC _sa
PUBLIC ??_C@_05COLMCDPH@Hello?$AA@ ; `string'
PUBLIC _sb
PUBLIC _sc
; COMDAT ??_C@_05COLMCDPH@Hello?$AA@
CONST SEGMENT
??_C@_05COLMCDPH@Hello?$AA@ DB 'Hello', 00H ; `string'
CONST ENDS
_DATA SEGMENT
_sa DD FLAT:??_C@_05COLMCDPH@Hello?$AA@
_sb DD FLAT:??_C@_05COLMCDPH@Hello?$AA@
_sc DB 'Hello', 00H
_DATA ENDS
END

 zhaozhencn 发表于:2003-04-04 12:11:50
得分:3 

根本就是C的后移症, 严格地来说, char *p="ababab" ; 是错误的, 因为p 是一个非const指针;而指向的又是一个const量。只不过想与之前的C 兼容罢了。

按C++ 的思想,严格来说,应该写成: const char *p="ababab";

我认为两种在某种意义上讲是一样的。 

 witcheese 发表于:2003-04-05 00:54:43
得分:3 

放進微波爐 丁 :)

 cenlmmx 发表于:2003-04-05 01:17:07
得分:3 

我都没什么说的了。 

 robertnet 发表于:2003-04-05 02:09:21
得分:3 

两者没有区别。
不过,const char*  更规范。 

 TonyWhite 发表于:2003-04-06 13:05:36
得分:3 

const char *和char *都是指向字符类型的指针,只不过前者指向字符常量,后者指向字符变量,换句话说,const char *所指向的内容不可改变,例如:const char *p="a";*p="b";
就会报错!!!而char *p="a";*p="b"就可以了。^_^ 

另外C++还提供了其他两种容易混淆的类型:
(1)char *const   指向字符类型的指针常量,即指针指向的内存单元的内容可改变,但指针不能只向其他内存单元。例:char *const p="a";p="b";错!    *p="b" 对!
(2)const char *const 指向字符常量的指针常量,指针指向的内容不可改变,指针也不能指向其他内存单元。

够了吗? 

 devzhao 发表于:2003-04-07 12:58:26
得分:3 

两者意义一样,
指针都指向常量,
但 char * p="hahaha";不值得提倡,
良好的编程风格用:const char * p="hahaha";
另请参考:
http://expert.csdn.net/Expert/topic/1615/1615494.xml?temp=.2672235

 macadam 发表于:2003-04-08 20:49:43
得分:3 

楼主你得到了你想要的一切!!!《about "const"》 

 geeksky 发表于:2003-04-08 21:50:53
得分:3 

第一个不能给c赋其他的值

第二个可以 

上一篇:高手指教:如何确定凹四边形的凹点!!!
下一篇:由于小弟要去北京不知道哪里有卖书的!请前辈们推荐一下在中关村卖VC书的好地方!多谢!多谢!

分享到: