1.二者的概念
1.sizeof
sizeof是C语言中的一个关键字,sizeof(a)表示的是a所占内存空间的大小,单位是字节。在字符数组中会统计‘\0’所占空间。其返回类型为size_t类型,C99和C11提供%zd转换说明匹配sizeof的返回类型(即,size_t类型)。一些不支持C99和C11的编译器可用%u和%lu代替%zd。
2.strlen
strlen是string库中的的一个库函数,其参数是一个指向字符串常量或者字符数组的的指针,用于计算指针指向的字符串的大小,当遇到‘\0’停止计数,不会统计‘\0’。
2.sizeof在数组中的使用
我们知道,对于一个数组,其数组名往往代表其首元素首地址,但也存在着特殊情况,当数组名与sizeof()一起使用时,数组名代表整个数组,即:
sizeof(arr1); ----------------arr1数组所占内存总大小
sizeof(arr1[0]); ----------------arr1数组其中一个元素所占内存大小
因此,利用这个特点,我们可以求出某个数组所包含的元素个数:
int count=sizeof(arr1)/sizeof(arr1[0]); //arr1的元素个数
2.在整形数组中的使用
根据上述概念,我们来看段代码(由于strlen()函数只适用于字符串,故不使用):
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[5] = { 1,2,3,4,5 };
int arr2[6] = { 1,2,3,4,5 };
printf("%d\n",sizeof(arr1));
printf("%d\n",sizeof(arr2));
return 0;
}
由于1个整形数据占4个字节,arr1开辟了大小为5个整形的空间,arr2开辟了大小为6个整形的空间,故输出如下:
20
24
3.在字符数组中的使用
代码如下:
int main()
{
char arr3[5] = { 'h','e','l','l','o' };
char arr4[6] = { 'h','e','l','l','o' };
printf("%d\n", strlen(arr3));
printf("%d\n", sizeof(arr3));
printf("%d\n",strlen(arr4));
printf("%d\n",sizeof(arr4));
return 0;
}
输出结果如下:
37
5
5
6
1.我们先来看第一个输出,由于在arr3[5]这个字符数组中,我们对它进行了完全初始化,在字符数组中不含‘\0’,其在内存中大致这样开辟的:
由于strlen()是在遇到’\0‘才会停止计数,所以当统计到数组最后一个元素时不会停止,而是继续向后进行统计,直到遇到’\0‘,因此37其实是一个随机值。
2.而sizeof()并没有这种限制,输出的结果就即为数组所占的空间大小,因此第2个和第4个输出结果即为arr3[5]和arr4[6]的大小。
3.然后是strlen(arr4[6]),由于我们对数组进行了不完全初始化,而当我们对数组进行不完全初始化时,其余的空间会自动进行初始化(字符数组初始化为'\0',整形数组初始化为0),我们打开监视窗口查看arr4[6]的数据如下:
可以看出即使我们没有对arr4[5]进行初始化,编译器也会自动将其进行初始化,即'\0'(ASCII码值为0),因此最终输出结果为5。
4.在常量字符串的使用
在这之前我们需要知道,当我们写出一个字符串常量时,其末尾自动会加上'\0'。
如写出“abcd”,其在内存中应该存放着'a','b','b','d','\0',其中'\0'被隐藏。
#include<stdio.h>
#include<string.h>
int main()
{
char arr5[] = "hello";
printf("%d\n",strlen(arr5));
printf("%d\n",sizeof(arr5));
return 0;
}
输出结果如下:
5
6
打开监视窗口可查看arr5[6]的数据如下:
由于字符串“hello”自带'\0',对数组进行初始化时使arr5[5]被赋值为'\0',因此strlen()遇到'\0'停止统计,输出5,而sizeof()则输出所占空间为6。
制作不易,能否点个赞再走呢qwq