傻傻的没弄清,字符数组和 字符串 .
第一点: 编译器遇到 双引号“ ”的时候,主要有一下集中情况:
char str[] = " abc" : 不指定长度。
char str[2] = "abc" : 长度过短。
char str[3] = "abc" : 长度恰好,
char str[4] = "abc" : 长度恰好 多出1
char str[6] = "abc" : 长度很长。
不指定长度时, 编译器遇到" " 会把它当成字符串来看,开辟3+1个char空间,分别存储 a、b、c、' '
长度短时,编译器会报错.
长度恰好时,编译器不会报错.但是编译器编译只分配三个char空间,存储abc.
本来编译器想要补充一个 ‘ '的,但是因为只有三个char空间,所以无法补。
长度为n+1,恰好能满足空间要求。
长度>n+1,尾部全部补' '。这样又有些浪费是吧.
原则: char [n] n决定了只开辟n个char空间, " "决定尾部是否填' ' 。如果位置不够了,就不填,冗余的都填' '
不适用单引号: 只使用大括号。
char str[3] = { ’a‘,’b‘,’c‘} 只开辟三个char空间.
char str[3] = { ’a‘,’b‘,’c‘,' '} 编译器报错
char str[] = { ’a‘,’b‘,’c‘,' '} 开辟四个空间.
下面我们仔细分析下面这个程序:
#include <stdio.h> #include <string.h> int main (void) { char str1[] = "abc"; // char str2[2] = "abc"; char str3[3] = "abc"; char str4[4] = "abc"; char str5[7] = "abcd"; char str6[] = {'a','b','c'}; char str7[4] = {'a','b','c',' '}; printf("%d ",str1); printf("%d ",sizeof(str1)); printf("%u ",strlen(str1)); // printf("%d ",sizeof(str2)); // printf("%u ",strlen(str2)); printf("%d ",str3); printf("%d ",sizeof(str3)); printf("%u ",strlen(str3)); printf("%d ",str4); printf("%d ",sizeof(str4)); printf("%u ",strlen(str4)); printf("%d ",str5); printf("%d ",sizeof(str5)); printf("%u ",strlen(str5)); printf("%d ",str6); printf("%d ",sizeof(str6)); printf("%u ",strlen(str6)); printf("%d ",str7); printf("%d ",sizeof(str7)); printf("%u ",strlen(str7)); printf("------ "); printf("%c ",*(char *)2358951); printf("%c ",*(char *)2358952); printf("%c ",*(char *)2358953); printf("%c ",*(char *)2358954); printf("%c ",*(char *)2358955); printf("%c ",*(char *)2358956); printf("%c ",*(char *)2358957); printf("%c ",*(char *)2358958); printf("%c ",*(char *)2358959); printf("%c ",*(char *)2358960); printf("%c ",*(char *)2358961); printf("%c ",*(char *)2358962); printf("%c ",*(char *)2358963); printf("%c ",*(char *)2358964); printf("%c ",*(char *)2358965); printf("%c ",*(char *)2358966); printf("%c ",*(char *)2358967); printf("%c ",*(char *)2358968); printf("%c ",*(char *)2358969); printf("%c ",*(char *)2358970); printf("%c ",*(char *)2358971); printf("%c ",*(char *)2358972); printf("%c ",*(char *)2358973); printf("%c ",*(char *)2358974); printf("%c ",*(char *)2358975); }
结果如下:
char str7[4] = {'a','b','c',' '}; 首地址在 51地址. 四个char型空间.51-52-53-54
char str6[] = {'a','b','c'}; 只分配三个char空间. 地址在55-56-57
char str5[7] = "abcd"; 分配了7个空间.地址在58-59-60-61-62-63-64
char str4[4] = "abc"; 分配4个空间,地址为 65-66-67-68
char str3[3] = "abc"; 只分三个地址,无法补' ' .地址为 69-70-71
char str2[2] = "abc"; 编译器会报错,注释掉
char str1[] = "abc"; 分配四个char空间,末尾补' ',地址为 72-73-74-75
故sizeof str1 =4 。 strlen =3
sizeof str3 =3 。strlen = 6
sizeof str4 =4 。strlen =3
sizeof str5 =7 。strlen =4
sizeof str6 =3 。strlen =7
sizeof st7 =4 。strlen =3
字符串常量 和字符串变量
什么? 字符串还分常量和变量.更晕了,那我们之前定义的,到底是常量还是变量啊?
这里你要先弄清两个问题:
char str[] = "abc" ; 这句话到底是什么意思。 创建一个数组,长度为3+1。 并且初始化为abc .
它最基本的意思是创建数组,附带着进行初始化。
这种情况下, 数组的内容当然是可以修改的啦. 所以它定义了一个 字符串变量。
char *p = "abc" ; 这句话什么意思? 它是要定义一个char指针,指向"abc";
编译器会把"abc" 当成常量. 那么 p就是指向常量的指针.显然通过p间接修改常量是不允许的.
char数组 和字符串数组的区别.
字符串: 是一串以' '结尾的字符集合,必要要以' '结尾。 如果定义的数组长足,不足以尾部填入' ', 只能算作是 char数组.
长度足够的话,编译器会在数组尾部补' ‘,使得它是一个字符串。
{ } 和 " "区别
{ } 是元素的列表,编译器不会为它自动的补' ' 。 若里面没有 ’ ‘ ,那它就仅仅是一个char数组。
" " : 如果和指针配合,自动补' ',是定义一个指向字符串常量的指针。
如果和数组配合, 看数组的长度是否能容下' ' 。 能容下就是字符串.容不下就是char数组.
因此一般定义 字符串变量,借用数组. 定义字符串常量 用指针类型.
注意数组长度, 注意" " 和{}区别。
这个小节有点乱....