| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8587 人关注过本帖
标题:[讨论]char* a = "abc" 和 char a[] = "abc" 之间的区别 ...
只看楼主 加入收藏
coachard
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:1251
专家分:0
注 册:2007-8-12
收藏
得分:0 
以下是引用学c在2007-9-20 9:42:24的发言:

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

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


偶学编程,也许本身就是一个错。。。
2007-09-20 11:59
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
注意不同系统不一样的内存管理模式

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2007-09-20 12:01
静思
Rank: 3Rank: 3
来 自:沈阳
等 级:新手上路
威 望:8
帖 子:630
专家分:0
注 册:2006-2-28
收藏
得分:0 
内存管理模式中关于平时我们说的堆和栈有什么区别?一般情况下用哪个比较好...

英者自知,雄者自胜
2007-09-20 12:26
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
这个小问题竟然讨论了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就知道帮她说话






2007-09-20 14:38
静思
Rank: 3Rank: 3
来 自:沈阳
等 级:新手上路
威 望:8
帖 子:630
专家分:0
注 册:2006-2-28
收藏
得分:0 

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


英者自知,雄者自胜
2007-09-20 16:38
孤独败天
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2007-9-20
收藏
得分:0 

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].

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

2007-09-20 18:14
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 

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-09-20 18:42
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
以下是引用雨中飞燕在2007-9-20 18:42:43的发言:

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

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

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

2007-09-20 20:01
aoaoaoao
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-5-14
收藏
得分:0 

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

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

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


2007-09-20 21:47
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
我觉得这是编译器的问题,当编译器接受到a[i]时,会自动转化为*(a+i),当然前提条件你要声明数组的存在;如果用指针就必须用*(a+i),因为这时候编译器不知道a[i]是什么。

学习需要安静。。海盗要重新来过。。
2007-09-20 22:02
快速回复:[讨论]char* a = "abc" 和 char a[] = "abc" 之间的区别 ...
数据加载中...
 
   



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

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