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 |
______ ______ ______