当要计算一个数组的大小的时候,有两种常见的方式,一种是直接使用运算符sizeof,另一种是使用< string.h >头文件下面的 strlen() 的函数。
字符数组的定义方法大致有三种:第一种是已知数组大小并用单引号初始化;第二种是未知数组大小并用单引号初始化;第三种是未知知数组大小并用双引号初始化。
char arr0[10] = { 'a','b','c','d','e','f','g','h','i','j' };
char arr2[] = { 'a','b','c','d','e','f','g','h','i','j' };
char arr4[] = "abcdefghij";
因为sizeof是直接计算从数组首地址到 ‘\0’ 之间的大小,而strlen是计算有效字符的长度,因此设置了一个对照字符数值。
char arr0[10] = { 'a','b','c','d','e','f','g','h','i','j' };
char arr1[10] = { 'a','b','c','d','e','\0'}; //对照
char arr2[] = { 'a','b','c','d','e','f','g','h','i','j' };
char arr3[] = { 'a','b','c','d','e','f','g','h','i','j','\0'}; //对照
char arr4[] = "abcdefghij";
因为sizeof是运算符,所以它的用法需要经过一定的转换。否则它会直接算出字节数的多少。
sizeof(arr0) / sizeof(arr0[0])
arr0:这个为数组的首地址。先计算整个字符串的大小。
arr0[0]:这个为单个数组地址。计算单个字符的大小。
经过这两数相除就能得到该字符串的大小。
int len0 = sizeof(arr0) / sizeof(arr0[0]);
int len1 = sizeof(arr1) / sizeof(arr1[0]); //对照
int len2 = sizeof(arr2) / sizeof(arr2[0]);
int len3 = sizeof(arr3) / sizeof(arr3[0]); //对照
int len4 = sizeof(arr4) / sizeof(arr4[0]);
strlen用法就相对简单,本质上是一种函数的调用,直接把要计算的数组首地址传入就能完成对字符串大小的计算。
int len00 = strlen(arr0);
int len01 = strlen(arr1); //对照
int len02 = strlen(arr2);
int len03 = strlen(arr3); //对照
int len04 = strlen(arr4);
最后,把上面代码的结果输出,就能得到如下图中的结果。完整代码如下 :
#define _CRT_SECURE_NO_WARNINGS #include
#include int main() { char arr0[10] = { 'a','b','c','d','e','f','g','h','i','j' }; char arr1[10] = { 'a','b','c','d','e','\0'}; //对照 char arr2[] = { 'a','b','c','d','e','f','g','h','i','j' }; char arr3[] = { 'a','b','c','d','e','f','g','h','i','j','\0'}; //对照 char arr4[] = "abcdefghij"; int len0 = sizeof(arr0) / sizeof(arr0[0]); int len1 = sizeof(arr1) / sizeof(arr1[0]); //对照 int len2 = sizeof(arr2) / sizeof(arr2[0]); int len3 = sizeof(arr3) / sizeof(arr3[0]); //对照 int len4 = sizeof(arr4) / sizeof(arr4[0]); int len00 = strlen(arr0); int len01 = strlen(arr1); //对照 int len02 = strlen(arr2); int len03 = strlen(arr3); //对照 int len04 = strlen(arr4); printf("arr0数组大小分别为:%d %d\n", len0,len00); printf("arr1数组大小分别为:%d %d\n", len1, len01); //对照 printf("arr2数组大小分别为:%d %d\n", len2,len02); printf("arr3数组大小分别为:%d %d\n", len3, len03); //对照 printf("arr4数组大小分别为:%d %d\n", len4,len04); return 0; }
从结果中会发现,当固定了数组大小使用sizeof计算时结果就是该数组已知的大小。
当用单引号时,在结尾未加 ‘\0’ 的情况下,使用strlen()得到的结果并非是该数组的正确长度。strlen()会一直寻到 ‘\0’ 为止,而sizeof则会把 ‘\0’ 也算进来。
在计算字符数组下标的时候,需要根据不同的情景和需求来求大小。