在遵从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定义