CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

char s[]="string";与char s[7];strcpy(s,"string");有什么区别?

楼主proad(proad)2005-06-02 18:47:13 在 C/C++ / C语言 提问

如题。谢谢 问题点数: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

相关问题

  • string => char ...........
  • char[] to string
  • AnsiString、String、char* ???
  • char* string,和 char string[n] 有区别吗?
  • unsigned char* 转换 String
  • String转换成char
  • strcpy 的返回值为什么是char *???
  • byte[] String char[] 区别如何?
  • Char[]怎样转换成string
  • string转换为char急!!!

关键词

  • 指针
  • 编译器
  • 字符
  • 内存
  • 内容
  • 数组
  • 字符串
  • 常量
  • 相当于
  • 区别

得分解答快速导航

  • 帖主:proad

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo