字符指针
定义及初始化:
char *strs="Hello,world!"
char *strs;
str = "Hello,world!";
字符串中的所有字符在内存中是连续排列的,strs指向的是字符串的第0个字符(从零开始);我们通常将第0个字符的地址称为字符串的首地址。字符串中每个字符的类型都是char,所以 str 的类型也必须是char *。
访问方法:
printf("%s\n",strs); //访问整个字符串
printf("%c\n",strs[1]); //访问单个字符串
printf("%c\n",*(strs+1));
hello,world!
e
e
注意:由于字符指针指向的常量区存放在常量区,因而程序中只有读取权限,而没有修改权限。如xia下面的操作,编译器可能会通过,但在运行时会出现段错误(Segment Fault)或者写入位置错误。
strs[1]='0'; //错误,没有修改权限
*(strs+1)='0'; //错误,没有修改权限
字符数组
定义及初始化:
char str1[]={'H','e','l','l','o',',','w','o','r','l','d','!'};
char str2[]="Hello,world!"
将12个字符分别赋给str[0]到str[11]12个元素。如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即’\0’)。
在C语言中,并没有特定的字符串类型,通常是将字符串放在一个字符数组中。然而我们比较关心的是字符串的长度,而不是字符数组的长度,因此通常在字符串的末尾加上’\0’,表示字符结束的标志。在读取字符串时也已只读到’\0’为止。
因此也可以使用下面的方法定义初始化字符串:
char str2[]="Hello,world!"
但是字符数组定义之后再赋值时只能逐个进行赋值而不能一次统一赋值,如下面的操作是错误的:
char str[];
str = "Hello,world!"; //错误
字符数组统一赋值和逐个赋值导致数组大小并不一致,因为单个赋值相当于将字符逐个放入数组元素中,数组并不要求’\0’结尾。而字符串必须以’\0’结尾,如果不加’\0’系统会自动加上。因此
sizeof(str1)=13;
sizeof(str2)=12;
访问方法:
printf("%s",str1);
printf("%c",str2[1]);
printf(""*&str2[1]);
printf("%c",*(str2)); //不合法
字符数组存储在全局数据区或栈区,在定义和赋值后可以进行修改操作。这是其与字符指针显著的区别。
char str2[]="Hello,world!"
str2[2]='0'; //合法
总结
字符指针与字符数组的作用基本相同,但在涉及到对字符串内容需要修改时,只能选择字符数组,而不能选择字符指针。
参考文献
[1] http://c.biancheng.net/cpp/html/80.html
[2] http://www.cnblogs.com/kungfupanda/archive/2012/06/15/2456931.html
[3] http://blog.csdn.net/u013266600/article/details/50529462