char s[]="string";与char s[7];strcpy(s,"string");有什么区别?
如题。谢谢 问题点数:0、回复次数:28Top
1 楼wh_5(郁闷中~~~~~)回复于 2005-06-02 18:49:57 得分 0
高手看哈这个问题。。http://community.csdn.net/Expert/topic/4054/4054933.xml?temp=.1963007Top
2 楼qybao(阿宝)回复于 2005-06-02 18:52:15 得分 0
前者相当于把数组指针指向一个常量字符串,后者是把字符串的内容复制给数组,数组内存指向不变Top
3 楼Michael_555(Nothing)回复于 2005-06-02 18:57:11 得分 0
没区别!都是声明一个字符串数组,只是初始化的方式不一样而以。
qybao(阿宝)的解释是错的。
Top
4 楼foochow(无聊,灌水......)回复于 2005-06-02 18:57:51 得分 0
char s[]="string";是让编译器来计算元素个数;
Top
5 楼WoodJohn(天在下雨,云在哭泣)回复于 2005-06-02 19:00:02 得分 0
同意Michael,一样!
但是前者更安全,比如说你可能
char s[7];
strcpy(s,"hello,world!");Top
6 楼daviddb7(红魔)回复于 2005-06-02 19:01:52 得分 0
我觉得没什么区别。
Top
7 楼lbing7(向青润老大学习!!!)回复于 2005-06-02 19:23:07 得分 0
代价问题!
后者得损失调用函数的代价
前者在编译后就完成了!Top
8 楼steedhorse(晨星)回复于 2005-06-02 19:25:43 得分 0
嗯,能说的差不多基本都被说了。前者更安全,更高效。后者更灵活(前者只能用于处理编译时确定的字符串)Top
9 楼mostideal(三甲)回复于 2005-06-02 22:41:58 得分 0
同意楼上的。。
我喜欢用后者。。Top
10 楼ToHardToGetAnValidId()回复于 2005-06-02 23:06:40 得分 0
同意 WoodJohn的说法,后者并不会比前者灵活,因为它也要事先(编译期)知道数组的长度。Top
11 楼proad(proad)回复于 2005-06-02 23:18:34 得分 0
问题再进一步:
char *s="string";
char s[]="string";
char s[7];strcpy(s,"string");
第二个作法是相当于第一个呢?还是相当于第三个?Top
12 楼proad(proad)回复于 2005-06-02 23:50:48 得分 0
再问一下:
char *s="string";
那么s的生命期是什么?生命期结束后会自动释放空间吗?Top
13 楼Lutx(铅笔头)回复于 2005-06-03 00:10:15 得分 0
char *s="string";
这个有问题啊。Top
14 楼Dozo(J.Deniz)回复于 2005-06-03 07:09:22 得分 0
再问一下:
char *s="string";
那么s的生命期是什么?生命期结束后会自动释放空间吗?
如果只考虑最后内存中的结果,都是一样的。
会自动释放空间。
另外,1,2不是在编译后完成的,而是在
程序执行起来之后,只不过不需要花费调用函数的代价。
Top
15 楼yds(康熙大帝)回复于 2005-06-03 08:56:56 得分 0
没有什么本质上的区别!数组和指针很多时候是可以等价的。Top
16 楼liubingqian(海风)回复于 2005-06-03 09:29:34 得分 0
在现代大多数编译器中
char *s="string";
是会报错的。应该是
const char *s="string";Top
17 楼boox(boox)回复于 2005-06-03 10:03:36 得分 0
char *s="string";编译时候没问题,但一切想要修改其中字符的操作都会引起运行时错误。因为这里的string是常量。
char s[]="string";就没有问题,想改就改。Top
18 楼xiefeifeihu(飞飞狐)回复于 2005-06-03 10:35:13 得分 0
char *s="string";相当于把数组指针指向一个常量字符串;
char s[]="string";是把字符串的内容复制给数组,数组内存指向不变
VC++6.0中可以通用,但之后的版本就不允许这样用了.
(这是方正的一位老工程师告诉我的)Top
19 楼xiefeifeihu(飞飞狐)回复于 2005-06-03 10:41:22 得分 0
char *s = new char(7);
可以这样用Top
20 楼whatsouta(某疯子)回复于 2005-06-03 13:37:49 得分 0
char *s="string";
char s[]="string";
char s[7];strcpy(s,"string");
第二个作法是相当于第一个呢?还是相当于第三个?
都不同
第一个相当于 const char *s = "string";,是一个常量。
如果试图去写*S的话,是比较危险的。Top
21 楼holymoon858()回复于 2005-06-03 15:05:16 得分 0
其实这样看一下,就很清楚了:
char *s1="string";
char s2[]="string";
char s3[7];strcpy(s,"string");
sizeof(s1) = 4
sizeof(s2) = 7
sizeof(s3) = 7
s1只是一个指针,而s2和s3是字符数组空间长度都是7,s2和s3的区别是s2的空间由编译器通过"string"的长度自动指定,s3是手工指定为7。
接下来需要说的是s1,s1是指针那它指向哪儿呢?"string"是一个常量字符串,它的首地址被赋给了s1,这样s1就指向了内存中的一个常量字符串,应该避免修改s1字符串的内容。Top
22 楼wzlno1(大漠有情)回复于 2005-06-03 16:00:22 得分 0
楼上的兄弟强啊 确实有好多地方没有注意的
结合楼上兄弟们的观点 偶总结了一下
char *s1="string";
char s2[]="string";
char s3[7];strcpy(s,"string");
首先 第一个相当于const char *s1="string";不能改变*s1的值 但是可以把s1重新给个地址给它
第二个和第三个基本上没什么区别,都是把常量字符串复制给一个字符数组,这个数组的地址不变
呵呵 不知道总结的对不对 看看各位大侠的评价Top
23 楼yc0188(守护瓶(萍))回复于 2005-06-03 16:03:03 得分 0
顶一下了!Top
24 楼hanxingwuqing(无效参数)回复于 2005-06-03 20:43:20 得分 0
char *s1="string";
char s2[]="string";
char s3[7];strcpy(s,"string");
这3个基本上没什么区别啊,赋值以后对单个元素进行操作的话是可以的啊,我试过了。
我觉得看个人喜好,随便怎么搞,正确高效,大家都看得懂就好!!!!
-------------
蹭分就是硬道理!!!!!!
Top
25 楼sunman1982(冥王星)回复于 2005-06-03 20:48:19 得分 0
cf
Top
26 楼zx_name({电冷心})回复于 2005-06-04 17:35:10 得分 0
12的效率要高些.3效率和安全都要低Top
27 楼flying_no_9(flying_no.9)回复于 2005-06-04 20:22:25 得分 0
具体问题具体对待!Top
28 楼proad(proad)回复于 2005-06-05 19:46:27 得分 0
作为楼主,我比较赞同holymoon858的想法
不知道还有没有其他高手再指点一下。Top




