字符数组
char world[] = {'H','e','l','l','o','!'} 末尾没有0的叫做字符数组
字符串
① 字符串是以整数0结尾的一串字符
char world[] = {'H','e','l','l','o','\0'} 等价于 char woed[] = {'H','e','l','l','o',0}
末尾有'\0'或0是一样的,但是与'0'不同'0'表示ASCLL码表中的字符0
② '\0'或0标志字符串的结束,但是它不是字符串的一部分,计算字符串的长度的时候不包含这个0
③ 头文件是<string.h>
④ C语言的字符串以数组的形式存在,以数组或指针的形式访问,不能用运算符对字符串做运算,字符串的字面量可以用来初始化字符数组
⑤ 定义字符串变量
"Hello"叫做字符串常量或者字符串字面量,编译器会自动将它转化为字符数组进行存放,长度是字符串本身长度加末尾0一字节的长度,两个相邻的字符串常量会被自动合成一个大的字符串常量
char *str = "Hello"; 定义指针str,指针str指向一个字符数组"Hello","Hello"会被编译器看作一个字符数组存放到只能读不能改动的代码段,若代码中有多个指针指向它,那么指向的是同一个地址,所以实际上char *str是const char *str,若尝试对此指针指向的字符串做改动会报错,如果需要修改应从最开始将其定义为数组char str[] = "Hello";
若定义为指针一般用作只读不写
处理参数
动态分配空间(malloc)
#include <stdio.h>
int main ()
{
char *s="Hello World";
char *s2="Hello World";
//s[0]='B';定义为指针时不可改动,改动会报错
printf("s =%p\n",s);
printf("s2=%p\n",s2);
char s3[]="Hello World";
printf("s3=%p\n",s3);
s3[0]='B';
//定义为数组时可以改动
printf("s3[0]=%c\n",s3[0]);
return 0;
}
char word[] = "Hello"; 定义数组word[],并初始化数组word的内容是"Hello",表示我所定义的字符串就在本地,作为本地变量空间会被自动回收
char line[10] = "Hello"; 定义字符数组line,长度是10字节,但是只在里面占去六个字节,字符串"Hello"占去五个字节,结尾'\0'占据一个字节
⑥ 易错char*
char*可以表示字符串但是char*不一定就是字符串,他的本意是指向字符串的指针,可能指向的时字符数组,只有当它所致的字符数组有结尾的0,才可以说他指向的是字符串