免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2417 | 回复: 7

[基础]char *str 跟char str[] [复制链接]

论坛徽章:
0
发表于 2006-08-10 16:36 |显示全部楼层
小弟c语言不精,基础不好
感问char *str跟 char str[]的区别

  1. int main()
  2. {
  3.     char *str="hello";
  4.     char str2[6]="hello";
  5.     *str="other";
  6.     str2[6]="other";
  7.     if(!strcmp(str,"hello"))printf("\n*str");
  8.     if(!strcmp(str2,"hello"))printf("\nstr[]");
  9.     return 0;
  10. }
复制代码


上面的两种情况会有不同的结果

[ 本帖最后由 ydlhero 于 2006-8-10 16:37 编辑 ]

论坛徽章:
0
发表于 2006-08-10 16:43 |显示全部楼层
原帖由 ydlhero 于 2006-8-10 16:36 发表
小弟c语言不精,基础不好
感问char *str跟 char str[]的区别
[code]
int main()
{
    char *str="hello";
    char str2[6]="hello";
    *str="other";
    str2[6]=&quo ...



第一个是常量字符串
第二个是字符串数组

论坛徽章:
0
发表于 2006-08-10 16:46 |显示全部楼层
*str="other";  ---〉〉error C2440: '=' : cannot convert from 'const char [6]' to 'char'
意思是说*str指针是指向一个data段的只读内存的
以前的C编译器可以编译通过

论坛徽章:
0
发表于 2006-08-10 16:48 |显示全部楼层
str2[6]="other";
这一句会有问题吧

[ 本帖最后由 wmytch 于 2006-8-10 17:00 编辑 ]

论坛徽章:
0
发表于 2006-08-10 17:32 |显示全部楼层
*str="other"; 错误
char  *str="other"  正确

只能在定义的时候付值

论坛徽章:
0
发表于 2006-08-10 17:44 |显示全部楼层
原帖由 新手上路2世 于 2006-8-10 17:32 发表
*str="other"; 错误
char  *str="other"  正确

只能在定义的时候付值


不能叫做“赋值”,应该是“初始化”。

论坛徽章:
0
发表于 2006-08-10 19:09 |显示全部楼层
printf("%s",str);
跟printf("%s",str2);
结果都是other  (说的是能编译的情况下)

论坛徽章:
0
发表于 2006-08-10 20:12 |显示全部楼层
1.str是一个字符串指针变量。
2.str2是一个字符串数组。
3.str只能被赋值为地址,因为str本身是一个指针。
  如str="Hello"  str="other"都可以。因为"Hello","other"是位于.rodata段的某一地址。同理,在定义str2后,也可以str=str2,因为str2也是一个地址。
4.对*str的赋值要看情况,如果str指向的是.rodata段里的内容(如str="Hello'后),则*str不能被赋值,因为*str是只读的。
如果str指向的是堆或者栈中某一地址(如str=str2),则可对*str赋值,但应赋char型,而非char*,此时写*str='o'是正确的。
5.字符数组在定义时写成char str2[6]="hello"是没问题的,但是在非定义时写成str2[6]="other"就错误了。(我不是很清楚以前的编译器是否可以通过,如果能通过就算我这条说错了),要对str2再赋值,一般用strcpy来操作,如strcpy(str2, "other");
6.在定义时写成char *str="hello"是将"hello"赋值给str,而非赋值给*str。
7.按照我理解你的程序的意思,如果str,str2不是"hello"的话则打印,但是注意strcmp的返回值,当两字符串相同时返回0,你实际代码的意思是,如果str,str2都为"hello"时,则打印,跟原来的意思相返。(如果你就是此意的话,那就恕我理解错误)
8.打印字符串应该用printf( "%s",...);

如果我有哪些地方说错了,还望大侠指教。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP