sizeof——操作符,是计算变量所占内存空间的大小,单位是字节。
比如下面的一段简单代码
#include<stdio.h>
int main()
{
int a = 10;
printf("%d\n", sizeof (a));
printf("%d\n", sizeof (int));
return 0;
}
定义整型变量a初始化为10;int为整型,占四个字节,所以sizeof(a)为4,值得注意的是sizeof是操作符而不是函数,因此对变量a使用时可以不加括号(),但是对类型使用时必须加括号。
对于数组,sizeof也有着作用。
int main()
{
int arr[] = { 1,2,3,4,5,6,7 };
int ret = sizeof(arr);
int rat = sizeof(arr[0]);
int n = ret / rat;
return 0;
}
打开监视窗口,可以看到
整型数组arr有7个元素,而sizeof(arr)的值为28,类型为无符号整型。利用n可以计算出数组arr的元素个数。
strlen———库函数,是计算字符串的长度的,统计的是字符串中\0之前出现的字符个数。
下面来综合解析sizeof和strlen.
#include<stdio.h>
#include<string.h>
int main()
{
char ch1[] = { 'a','b','c','d','e','f' };
char ch2[] = "abcdef";
printf("%d\n", sizeof(ch1));
printf("%d\n", sizeof(ch2));
printf("%d\n", strlen(ch1));
printf("%d\n", strlen(ch2));
return 0;
}
因为strlen为库函数,因此需要包含头文件#include<string.h>,上述代码的输出结果如下图
为什么会这样的输出结果呢?下面来一一解析,观察ch1,ch2,前者为字符数组,后者为字符串。
char类型为一个字节,所以sizeof(ch1)为6个字节,但sizeof(ch2)为什么为7呢?其实ch2数组中还有一个\0,这个也算上。ch2中可以认为有"abcdef\0"这样的字符串。因此sizeof(ch1)和sizeof(ch2)的输出结果不一样。
可以看出两者的不同。
那么为什么strlen(ch1)和strlen(ch2)的结果不同呢?strlen(ch2)不难理解,strlen统计的是\0之前的有效字符个数,有6个,那么到这里你可能会发现,ch1中没有\0啊,为什么输出的结果是19?在内存中ch1是这样分配的
因为后面没有\0。
因此会继续读取,直到找到\0为止,因此19为随机值,可能输出不同的值。
当加上\0时的输出结果为这样。ch1,ch2初始化最终也会让\0放入数组中。
这次的分享就到这里了,如有错误或者建议,敬请提出。