一.sizeof
我们在学习操作符的时候,就了解到了sizeof操作符,它的作用是求参数所占内存空间的大小,单位是字节。如果参数是一个类型,那就返回参数所占的字节数。
#include <stdio.h>int main()
{int a = 10;size_t b = sizeof(a);//a的类型是int型,在内存中占四个字节,所以结果为4size_t c = sizeof(int);//int类型的数据在内存中占四个字节,所以结果也是4printf("%d %d\n", b, c);
}
我们可以像上面代码一样来计算变量或者一个类型的大小。当然,sizeof()的参数还可以是表达式,但是当表达式作为参数时,表达式是不进行计算的,sizeof只会推断表达式结果的类型,并不会真实计算。
#include <stdio.h>int main()
{int a = 10;int b = 1;size_t c = sizeof(a = a + b);//sizeof()不会计算参数内的表达式,只会推断表达式结果的类型//故打印结果为: a = 10 4printf("a = %d %zd\n", a, c);return 0;
}
当我们使用sizeof操作符的时候,接受返回值的参数最好定义成size_t类型的,打印时用%zd打印。因为sizeof求得是参数在内存中所占的大小,那肯定不可能是负数,所以我们最好用无符号数来接收。size_t表示无符号整型,%zd用来打印无符号整型。
二.sizeof的特殊情况
当sizeof()内的参数为数组名的时候,sizeof求的是整个数组的大小,就不再是类型的大小了。
#include <stdio.h>int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };size_t a = sizeof(arr);//当sizeof()的参数为数组名的时候,求的就是整个数组的大小,单位为字节。size_t b = sizeof(arr[0]);//当sizeof()的参数为数组中的一个元素的时候,求得就是该元素类型的大小。//arr有10个元素,每个元素四个字节,所以a 的值就是4*10 = 40printf("%zd %zd\n", a, b);return 0;
}
我们知道了这个之后,就可以利用这个特殊点来求数组元素的个数。我们只需要将数组的大小除以一个元素的大小就可以得到数组的元素个数啦!
#include <stdio.h>//利用sizeof遇到数组名的特殊,可以求数组的长度
int main()
{int nums[] = { 1,2,4,2,5,6,76,3,7543,55,3534,32 };size_t numsSize = sizeof(nums) / sizeof(nums[0]);printf("%zd\n", numsSize);return 0;
}
三.strlen
strlen是C语言中的一个库函数,头文件为<string.h>,strlen是用来求字符串长度的。它的运行逻辑为:传给它一个字符串地址,它就从这个位置开始往后数,直到遇到'\0'停止,所以,strlen就是统计从起始位置到’\0‘之间的字符个数。
#include <stdio.h>
#include <string.h>//strlen(),求从传过去的字符串地址开始,向后开始数,知道遇到第一个'\0'后停止,统计遇到的字符个数
//使用strlen函数要包含头文件<string.h>
int main()
{char string[] = "abcdef";size_t len = strlen(string);printf("%zd\n", len);return 0;
}
我们知道了strlen函数是统计起始位置到’\0‘之间的字符个数,所以所传字符串内部必须包含’\0‘。
#include <stdio.h>
#include <string.h>int main()
{char string1[] = { 'w','o','r','l','d' };//1char string2[] = "world";//2size_t len1 = strlen(string1);size_t len2 = strlen(string2);printf("%zd %zd\n", len1,len2);return 0;
}
当我们以方式1的形式定义字符串的时候,需要我们自己在结尾加上’\0‘,否则该字符串就无’\0‘,此时如果直接将地址传给strlen函数,strlen在统计’d'之后没有遇到’\0‘,所以不会停止,会继续往后统计,直到遇到’\0‘,所以此时打印len1,结果为随机值。
而当我们以方法二定义字符串的时候,编译器会自动给字符串末尾添加’\0‘,所以不需要自己添加,strlen对其求值时就能正常得出字符串的长度。
上述代码结果为:
如果我们在字符串中添加’\0‘,strlen就会提前停止。
四.sizeof与strlen的对比
sizeof | strlen |
1.sizeof是操作符 | 1.strlen是库函数,使用strlen函数要包含头文件<string.h> |
2.sizeof计算参数所占内存空间的大小,单位是字节 | 2.strlen求字符串长度,统计从起始位置到'\0'之间的字符个数 |
3.sizeof不会计算括号内的表达式,只会推断表达式结果的类型 | 3.strlen所计算的字符串必须包含'\0',否则会继续往后找,造成越界,其结果为随机值 |