什么是字符串
字符串是指一组字符的集合,与字符数组不同的是,字符数组强调的是存储结构而字符串强调的是存储内容。
C语言没有专门定义字符串数据类型(如其他语言中的string),它用以‘\0‘结尾的字符数组来表示一个逻辑意义上的字符串
字符串的初始化
- C语言中的字符串是以’\0’结束的字符数组
- C语言中的字符串常量区
char str[11] = "I am happy"; // 用数组的形式修改定义的字符串值
char str[] = "I am happy"; // 自动分配内存空间
char *p = "I am happy"; // 指针方式
字符串是由一对双引号括起的字符序列。
例如: “CHINA” , “C program” , “$12.5”等都是合法的字符串。
字符串和字符不同,它们之间主要有以下区别:
- 字符由单引号括起来,字符串由双引号括起来。
- 字符只能是单个字符,字符串则可以含一个或多个字符。
- 可以把一个字符型数据赋予一个字符变量,但不能把一个字符串赋予一个字符变量。在C语言中没有相应的字符串变量,也就是说不存在这样的关键字,将一个变量声明为字符串。但是可以用一个字符数组来存放一个字符串,这将在数组一章内予以介绍。
- 字符占一个字节的内存空间。字符串占的内存字节数等于字符串中字节数加1。增加的一个字节中存放字符”\0” (ASCII码为0)。这是字符串结束的标志。
例如,字符串 “C program” 在内存中所占的字节为:
C | p | r | o | g | r | a | m | \0 | |
---|---|---|---|---|---|---|---|---|---|
char c = 'a'
char s[] = "a"
字符’a’ 和 字符串”a”,虽然都只有一个字符,但在内存中的情况是不同的。
‘a’在内存中占一个字节,可表示为:
a |
---|
“a”在内存中占二个字节,可表示为:
a | \0 |
---|---|
int main() {
compare();
char num[] = "1234567";
printf("%p\n", num);
/* char num[] = "1234567" 内存存储
内存地址 ASCII值 字符
0x004DF810 +49 1
0x004DF811 +50 2
0x004DF812 +51 3
0x004DF813 +52 4
0x004DF814 +53 5
0x004DF815 +54 6
0x004DF816 +55 7
0x004DF817 +0 .
*/
system("pause");
return 0;
}
1 | 2 | 3 | 4 | 5 | 6 | 7 | \0 |
---|---|---|---|---|---|---|---|
004DF810 | 004DF811 | 004DF812 | 004DF813 | 004DF814 | 004DF815 | 004DF816 | 004DF817 |
49 | 50 | 51 | 52 | 53 | 54 | 55 | 0 |
“012345678” 对应的ASCII值是48-57
#include <stdio.h>
int main () {
char *p = "hello world";
printf("%s\n", p);
// p = 004053B0 hello world"=004053B0
printf("p = %p, \"hello world\"=%p\n", p, "hello world");
// char name[100] = "china"; //用数组的形式修改定义的字符串值
char name[] = "china"; // 这样会自动分配内存空间
name[0] = 'C';
printf("%c\n", name[0]); //C
printf("%c\n", "china"[0]); //c 常量区不会改变
printf("%s\n", name); //China
return 0;
}