标题:"I love you"在程序里是不是就是这个字符串常量首字节的地址??? ...
只看楼主
胡胡熊
Rank: 1
等 级:新手上路
帖 子:23
专家分:5
注 册:2014-3-13
结帖率:77.78%
 问题点数:0 回复次数:3 
"I love you"在程序里是不是就是这个字符串常量首字节的地址???
各位工程师好,
    我看到这样的语句:printf("%s","I love you!");
    是不是可以理解为"I love you"在C语言中被作为这个字符串常量的首字节地址?
Thank you in advance.
搜索更多相关主题的帖子: 工程师 字符串 C语言 Thank 
2015-04-07 17:14
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
得分:0 
是的。比如:

char str[30]="i love myself";
puts(str);

puts("i love myself");

都可以输出字符串,你就可以发现,str和"i love myself"的地位是一样的,都被当做一个地址。

字符串常量整体可以看成是一个地址

你醒了?快起来敲代码!!
2015-04-07 18:31
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
得分:0 
在遵从ansi c标准的c编译器里
char str[30]="i love myself"; 中的str 与 "i love myself" 是不一样的


"i love myself"确实是一个地址 它指向一个被匿名声明的字符串常量的首地址
字符串常量的内容不能被改变 这是二者最大的不同
不能做这种操作 *("i love myself" + 1) = 'a';
即使是char *p = "i love myself"; *(p + 1) = 'a';
这种显式声明一个字符常量时 也不能改变常量的值
当然有些编译器不按ansi c标准来 这里就不说是非曲直了


str确切说是个字符数组名 其值是str这个数组的首个元素地址
char str[30]="i love myself"; 就是把'f'之后数组内的字符元素都初始化为'\0'(尾0)
与"i love myself"这个常量指针不同
这个str数组中所有的元素值都可以被改变 比如 str[20] = 'a'; puts(str + 20);
对于str而言 c标准库提供的各种字符串函数 其返回的结果要看 str数组内元素的值 更确切的说 是对尾0处理有一个约定 函数发现尾0就认为字符串结束
在str[20] = 'a'时 puts(str)不会输出这个str[20]
因为puts函数发现了str的尾0 就终止了输出


这些细微区别不是什么大问题
只要坚持使用字符数组
少用字符串常量
就能避免不少纠结

怕字符数组被更改
可以使用const定义

Only the Code Tells the Truth             K.I.S.S
2015-04-07 19:12
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
得分:0 
对的。我的意思是一个字符串常量整体可以看成一个地址。

不能对常量,寄存器变量,表达式 取地址。

你醒了?快起来敲代码!!
2015-04-07 23:22



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-443658-1-1.html




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

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