面对字符串是我们最关系的就是字符串的长度(用strlen())与它所占的字节数(用sizeof())也就是大小,下来我们就讨论一下
/* 一般我们初始化字符串的几种方式 char a1[]="1234"; char *a2="1234"; char a3[10]="1234"; char a4[]={'1','2','3','4'}; char a5[]={'1','2','3','4','\0'}; char a6[10]={'1','2','3','4'}; char a7[10]={'1','2','3','4','\0'}; char *a6={'1'};//错误 可能有的编译器.c可以通过 char *a5={'1','2'};//必须给指针一个字符串首地址这个没有给 char *a7={'1','\0'};//错误 char A[2]="1234";//当然它是错的 不是因为名字是大写奥(哈哈) char A[1]='1';//当然它也是错的 char *A='1';//当然它也是错的 char A[10]="'1','2'";//当然它也是错的 char A[]='1','2'";//当然它也是错的 char *A="'1','2'";//当然它也是错的 char A[10]={"1","2"};//当然它也是错的 " "之间是字符串 ' '之间是字符 char *A={1,2,3,4};//当然它也是错的 */
//情况一: #include<stdio.h> int main() { char a1[]="1234"; printf("%d\n",a1[0]); printf("%d\n",strlen(a1)); printf("%d\n",sizeof(a1)); return 0; } //对于上边的代码输出结果是什么 // 答案是:49 4 5 // 49 是因为这里是字符1 //4 是因为strlen()函数在计算长度时找'\0',对于这种字符串会末尾默认有'\0',当strlen()遇到'\0'就会停止计算,所以个数不包括'\0' //5 是因为sizeof()这个运算符(这里也提一句sizeof 是运算符不是函数而且是一个关键字)会计算字节数这里都是字符类型所以只占5个字节(也包括后边的'\0')
//情况二: #include<stdio.h> int main() { char a1[]="\1\2\3\4"; //char a1[]="\1234";答案是:83 (转义字符会转义后边三个字符把他们当作8进制也就是83的8进制是123即'\123'=83) // 2 '\123' 和 '4'两个字符 // 3 包含'\0'三个字符型 占3字节 printf("%d\n",a1[0]); printf("%d\n",strlen(a1)); printf("%d\n",sizeof(a1)); return 0; } //对于上边的代码输出结果是什么 // 答案是:1 4 5 // 1 是因为这里是转义字符为数字1 //4 是因为strlen()函数在计算长度时找'\0',对于这种字符串会末尾默认有'\0',当strlen()遇到'\0'就会停止计算,所以个数不包括'\0' //5 是因为sizeof()这个运算符(这里也提一句sizeof 是运算符不是函数而且是一个关键字)会计算字节数这里都是字符类型所以只占5个字节(也包括后边的'\0')
//情况三: #include<stdio.h> int main() { char *a2="1234"; printf("%d\n",a2[0]); printf("%d\n",strlen(a2)); printf("%d\n",sizeof(a2)); return 0; } //对于上边的代码输出结果是什么 // 答案是:49 4 4 // 49 是因为这里是字符1 //4 是因为strlen()函数在计算长度时找'\0',对于这种字符串会末尾默认有'\0',当strlen()遇到'\0'就会停止计算,所以个数不包括'\0' //4 是因为这里的a2 是一个指针 指针就是四个字节 无论什么数据类型指针在32位系统下都是4个字节,有人会说那上一种情况中数组名也是指针,我想说的是数组名代表的是那片空间的地址数组名本身就是地址,所以sizeof()可以顺着这个地址计算这个空间占得字节数,而这里的指针本身占有四个字节只是它的里边存着那个字符串空间的首地址,指针自身也是个变量也有自己的地址(可以用二级指针存储),它自己本身不是地址
//情况四: #include<stdio.h> #include<string.h> int main() { char a3[10]="1234"; printf("%d\n",a3[0]); printf("%d\n",strlen(a3)); printf("%d\n",sizeof(a3)); return 0; } //答案是:49 4 10 // 我只解释一下 10 因为数组是一片的连续空间在定义数组是就为它开辟了10个字符型空间
//情况五 #include<stdio.h> #include<string.h> int main() { char a4[]={1,2,3,4};//char a[]={1111,2,3,4} //整型1111 存入char型会发生低位截断 后边的长度与大小与本例相同 printf("%d\n",a4[0]); printf("%d\n",strlen(a4)); printf("%d\n",sizeof(a4)); return 0; } //答案是:1,随机,4 // 1 是因为int 数据1 可以存入char //strlen()因为没有找到'\0'或数字0 所以继续找直至找到 所以是一个随机值,但是会大于等于4,因为这里边有四个元素呀
//情况六: #include<stdio.h> #include<string.h> int main() { char a4[]={'1','2','3','4'}; printf("%d\n",a4[0]); printf("%d\n",strlen(a4)); printf("%d\n",sizeof(a4)); return 0; } //答案是:49,随机,4 //我只解释 strlen()因为用户在定义时没有初始化'\0'或数字0 所以会继续向后边的空间之中找'\0'或数字0,直至找到为止,但是大于等于4
/情况七: #include<stdio.h> #include<string.h> int main() { char a5[]={'1','2','3','4','\0'};// char a5[]={'1','2','3','4',0} printf("%d\n",a5[0]); printf("%d\n",strlen(a5)); printf("%d\n",sizeof(a5)); return 0; } //答案是:49,4,5 //我只想说 '\0'与数字0等价在strlen()计算长度时
//情况八: #include<stdio.h> #include<string.h> int main() { char a6[10]={'1','2','3','4'}; printf("%d\n",a6[0]); printf("%d\n",strlen(a6)); printf("%d\n",sizeof(a6)); return 0; } //答案是:49,4,10 //我只想说 a6[10]在初始化的时候前四个用字符初始化后边六个用数字0默认初始化所以strlen()找到第一个0就停了
//情况八: #include<stdio.h> #include<string.h> int main() { char a6[10]={'1','2','3','4','\0'}; printf("%d\n",a6[0]); printf("%d\n",strlen(a6)); printf("%d\n",sizeof(a6)); return 0; } //答案是:49,4,10 读者应该十分清楚
原文:http://blog.csdn.net/kai8wei/article/details/44645201