当前位置: 代码迷 >> C语言 >> [讨论]char* a = "abc" 和 char a[] = "abc" 之间的区别 ...
  详细解决方案

[讨论]char* a = "abc" 和 char a[] = "abc" 之间的区别 ...

热度:211   发布时间:2007-09-20 11:59:06.0
以下是引用学c在2007-9-20 9:42:24的发言:

抗议雨中飞燕!!说话吞吞吐吐!!不解释明白,装酷吗??????

很多基础的东西,是你要去看书的,不是等着人家来讲的...


----------------解决方案--------------------------------------------------------
注意不同系统不一样的内存管理模式
----------------解决方案--------------------------------------------------------
内存管理模式中关于平时我们说的堆和栈有什么区别?一般情况下用哪个比较好...
----------------解决方案--------------------------------------------------------
这个小问题竟然讨论了4页,连knocker都惊动了,我也来凑下热闹。


我是这样理解的,大家看对不对
1、char* a = "abc"; 声明了一个字符类型的指针a,并为它赋值初始值为"zhf"其中字符串"zhf"应属于全局静态存储区,这里对a[1] = 'k',在编程中会出错,高手解释一下为什么?这里 a = null,可以,容易理解,因为a是指针类型。
2、char a[] = "abc"; 声明了一个字符型数组,并赋初值。这里的字符串"zhf"应该是属于堆存储区,是在局部开辟的空间。所以,这里对a[1] = 'k';是正确的。由于数组类型a相当于一个const型的指针,所以a = null;会出错。
欢迎高手纠正、补充。


1.这里的a是一个变量,一个指针变量,初值为一个字符串的首地址。C++中建议这样声明:const char* const a = "abc";因为字符串常量理论上不允许修改(否则何必叫常量?),在TC中你修改也没事,DOS中程序员是上帝;vc中不能修改,windows会保护常量数据(内存分页保护),修改时会终止程序给出该内存不能为written的提示。所以第一个const可以让编译器帮助检查是否有修改常量的操作,在编译期报错比运行时崩溃强。第二个const保证a的值不会被修改,否则数据"abc"就丢失了,以后访问不到了。

2.这里a是数组名,数组中存储的是变量,可以随意修改。不过a的值是不能修改的,因为a不是变量而是一个地址标号,一个常量,上面的a是变量是lvalue,这里的a是只有读属性的rvalue。举个例子:int array[5]; array=3; 这里修改a就和修改array一样的错误。

讨论结束,可以鼓掌了。。。。

-----------------------------------------------------------------------------------------------------------
雨中飞燕:
char *a="sss";
严格来说这个语句是错的

为什么错了,你也不说说原因,难怪29楼有人这么说呢:
抗议雨中飞燕!!说话吞吞吐吐!!不解释明白,装酷吗??????


31楼的coachard就知道帮她说话







----------------解决方案--------------------------------------------------------

楼上的版主能不能给我讲一下堆和栈的区别?堆分配和栈分配的最大不同点是什么?


----------------解决方案--------------------------------------------------------

char *a = "abc" 是声明了A是一个字符类型的指针,并指针的指向是字符串abc在内存中的首地址,在程序的运行中,*a能做运算,比如while (i<3)
{a++};要说明的是此时的a是变量,是指针变量,而不是常量;运行程序 之后做a++,此时a的指向是b的地址了相当于*a=b了。

char a[] = "abc" 这个是给数组a赋值的,这儿的=是表示 赋值运算符;应该注意的是此时的a 是字符串常量,它的值不能运算,还有一点是 在c语言中,程序运行的时候他允许这样:*(a+i)它相当于a[0+i].

各位 前辈们 我是新手 有错的地方 还请指出来


----------------解决方案--------------------------------------------------------

char* a = "abc";
convert `const char*` into `char *` error



by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=162918]C++编写的Windows界面游戏[/url]
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge):[/url] http://yzfy.org/


----------------解决方案--------------------------------------------------------
以下是引用雨中飞燕在2007-9-20 18:42:43的发言:

char* a = "abc";
convert `const char*` into `char *` error

知道了。以前一直没注意这个问题。

你早点这么说也不会有人说你装酷了


----------------解决方案--------------------------------------------------------

自己简单的理解:
char* a = "abc";
编译器把字符串"abc"做为常量所分配的节区类似与 win32中的 .const数据段

.const数据段的属性是由程序运行的时候操作系统为其建立的,它的属性由在GDT中为该任务建立的LDT中存在的数据段描述符来表示,
具体于 "abc"所在的数据段 所属的段描述符的type 4位属性为 数据段 可读 不可写 ,

我们的程序的cs段的 rpl和cpl 是3级 也就是最外级,当对属性为可读不可写的数据段 进行写操作的时候,cpu自己判断我们的程序不具有该权限,
所以产生一个保护性中断,交由操作系统来处理.操作系统产生1个对话框.



----------------解决方案--------------------------------------------------------
我觉得这是编译器的问题,当编译器接受到a[i]时,会自动转化为*(a+i),当然前提条件你要声明数组的存在;如果用指针就必须用*(a+i),因为这时候编译器不知道a[i]是什么。
----------------解决方案--------------------------------------------------------
  相关解决方案