C语言字符指针与字符数组


字符指针

概念及先导化:
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′,表示字符截止的标志。在读取字符串时也已只读到’\C语言,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