接下来简单地说一说字符串.
内容在书11.1, 11.2章.
1. 什么是字符串
字符串是一个char类型的数组,还需要一个标志,即最后一个元素应该是"\0"这个空字符.
C语言用"\0"表示字符串的结束,"空字符不是0,是非打印字符,ASCII码值(或者说等价于)0"(72页),比如说这个字符串有64个字符,那么容纳它的数组容量必须是64+1=65.
int main(void) {
char str1[] = "12345";
char str2[5] = "12345";
printf("str1: %s\n", str1);
printf("str2: %s\n", str2);
printf("sizeof 未指定容量char数组str1: %d\n", sizeof str1);
printf("sizeof 已指定容量char数组str2: %d\n", sizeof str2);
return 0;
}
运行结果
str1: 12345
str2: 12345
sizeof 未指定容量char数组str1: 6
sizeof 已指定容量char数组str2: 5
可以看到在不指定元素数量的情况下,5个字符的字符串实际上占用了6个字节的空间,多出来的那1字节就是"\0"了.
2. 指针和字符串
因为字符串本质是一个数组,所以指针自然也是可以使用的,而且字符串绝大多数操作都是通过指针完成的.
比如下面的程序,可以想想输出内容都是什么.
int main(void) {
const char * str1 = "12345678";
const char * str2 = str1;
printf("str1: %s\n", str1);
printf("str2: %s\n", str2);
printf("指针地址:&str1 = %p, &str2 = %p\n", &str1, &str2);
printf("指针的值: str1 = %p, str2 = %p\n", str1, str2);
return 0;
}
运行结果
str1: 12345678
str2: 12345678
指针地址:&str1 = 000000000022FE48, &str2 = 000000000022FE40
指针的值: str1 = 0000000000404000, str2 = 0000000000404000
内容都是一样的,这个结果应该没有悬念.
指针地址也是不一样的,因为这本来就是两个指针,肯定存在于不同的空间.
但是指针的值却是一样的."指针的值就是它存储的地址"(329页).这说明两个指针指向同一个位置.所以实质上
const char * str2 = str1;
就是把str2这个指针指向str1指向的字符串.
指针这两个概念要区分开.指针地址表示"这个指针存在于这个地址",指针的值表示"指针指向这个地址".