1.字符串常量不像 字符 一样可以是空 以为NUL 即 "\0" 在内存中 占位子
2.指针常常和字符串常量一起 程序中使用字符串常量会产生一个 "指向字符的指针" 表达式所使用的值就是这些字符所存储的地址,而不是字符本身
所以 可以 char *p="字符串常量" (*p 指向字符所存储的地址)
不可以 数组=字符串常量 以为字符串常量的 直接值 是一个指针 而不是 字符本身
但 array[]="124566" ; 以这种形式初始化数组 实际上是 一个初始化列表 即 array[]={'1','2','3','4','5'};
初始化字符数组时它相当于一个 初始化列表 其他时候 都是 字符串常量
详情 看代码
1. #include int main() { char *ss="012345"; printf ("%s\n",*ss); return 0; } 1.c:4:6: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=] printf ("%s\n",*ss); gcc编译器报错 说明 ss 所指的内容不 可以用 %s的格式打印 #include int main() { char *ss="012345"; printf ("%d\n",*ss); return 0; } root@ct-VirtualBox:~/code# gcc -o c 1.c root@ct-VirtualBox:~/code# ./c 48 48 是 '0' 的十进制ASCII码 *ss指的是字符串的第一个字符 使用cout的不存在这个问题: #include using namespace std; #include int main() { char *ss="cghb"; cout<<*ss< int main() { char *ss="012345"; printf ("%s\n",ss); return 0; } root@ct-VirtualBox:~/code# gcc -o c 1.c root@ct-VirtualBox:~/code# ./c 012345 说明ss 指针本身值字符串 #include int main() { char *ss="012345"; printf ("%d\n",*(++ss)); return 0; } root@ct-VirtualBox:~/code# gcc -o c 1.c root@ct-VirtualBox:~/code# ./c 49 #include int main() { char *ss="asdfg"; printf ("%d\n",++(*ss)); //`````````` printf("%c\n",*(++s));可以得出s *ss是一个字符串常量 是不可以修改一个常量的值 return 0; } root@ct-VirtualBox:~/code# ./c Segmentation fault (core dumped) 要区别:#include int main() { char s[]="asdfg"; //````````````注意这里是 数组 数组是一段连续的存储空间 它当前位置的值是可以改变的; printf("%c\n",++*s);//这是可以打印出 'b' 的 return 0; } ++ --俩个操作符 都需要一个 变量 作为 操作符 而不是常量 即需要 左值 *ss 是48 是int 常量
3.要修改字符串 最好把它 存储在数组中
/***********************************************关于代码中的问题好像找到答案了***********************************************************/
来自:http://blog.csdn.net/yahohi/article/details/7427724
这里的char ch[]="abc"; 表示ch 是一个足以存放字符串初值和空字符'/0'的一维数组,可以更改数组中的字符,但是char本身是不可改变的常量。 char *pch = "abc"; 那么pch 是一个指针,其初值指向一个字符串常量,之后它可以指向其他位置,但如果试图修改字符串的内容,结果将不确定。 ______ ______ ______ ch: |abc\0 | pch: | ◎-----> |abc\0 | ______ ______ ______