strlen和sizeof的区别

大家好,我是苏貝,本篇博客带大家了解C语言中的sizeof和strlen(仅此一篇让你明白它们两的差别),如果大家觉得我写的不错的话,可以给我一个赞吗,感谢❤️
strlen和sizeof的区别_第1张图片

文章目录

  • strlen
  • sizeof

在开始文章之前,我希望读者能明白sizeof和strlen是两个不同的东西,它们之间没有联系

strlen

strlen(string length),翻译为字符串长度,所以strlen的功能就是求字符串长度。它只能作用于字符串,是C语言中的库函数,使用时要引用这个头文件。

那什么是字符串呢?简单来讲,由 “ ”(双引号)引起来的一串字符就是字符串,如“hello world!” “abcde”等。那我们接着介绍转义字符 ‘\0’ ,每个字符串结尾处都隐藏有 ‘\0’ ,它是字符串的结束标志,所以我们在用strlen函数求字符串长度时,遇见 ‘\0’ 时就停止读取字符串,字符串长度为 ‘\0’ 之前的字符个数,不包括 ‘\0’ 。

示例1:

int main()
{
	printf("%d\n", strlen("abcdefg"));
	printf("%d\n", strlen("ab\0cdefg"));
	return 0;
}
//7 2

第一个字符串为:abcdefg\0,所以计算结果为 ‘\0’ 之前的个数=7
第二个字符串在 ‘\0’ 后面虽然还有5个字符,但是strlen在遇见 ‘\0’ 时就停止读取字符串,所以strlen只计算 ‘\0’ 前面的ab字符个数=2

示例2:

除了上面所说的由“ ”引起来的一串字符为字符串外,字符串也可由字符数组来存储每一个字符,如下:

int main()
{
	char arr1[] = { 'a','b','c' };
	char arr2[] = { 'a','b','c','\0' };
	printf("%d\n", strlen(arr1));
	printf("%d\n", strlen(arr2));
	return 0;
}
//随机值  3

对于第二个答案3,是因为 ‘\0’ 前边只有abc 3个字符;至于第一个答案,因为strlen函数只有在遇见 ‘\0’ 时才停止读取字符串,但是在读完abc后,我们并不清楚在后面哪个内存单元存储的是 ‘\0’ ,所以编译器会返回一个随机值


sizeof

sizeof是操作符,不是函数,sizeof(x)的功能是求x所占空间内存的大小,单位是字节。它可作用于字符串、数组、内置类型(int,double等)、指针类型……它的返回类型是size_t(也可以认为是无符号整型),用%zd或者%u来接收

作用于字符串:
sizeof计算的是字符串所占空间的大小,包括最后的 ‘\0’

int main()
{
	printf("%zd\n", sizeof("ab\0cdefg"));
	return 0;
}
//9

该字符串为:ab\0cdefg\0, ‘\0’ 是转义字符,\和0合起来被存储在一个内存空间,字符是char类型的,所以sizeof计算的结果= 9 * 1 = 9

作用于数组:

int main()
{
	int arr[10] = { 0 };
	char ch[5] = { 0 };
	printf("%zd\n", sizeof(arr));
	printf("%zd\n", sizeof(ch));
	return 0;
}
//40 5

arr数组是int类型的,有10个元素,所以所占空间大小=10* 4= 40个字节
ch数组是char类型的,有5个元素,所以所占空间大小=5* 1= 5个字节

拓展:
数组名是数组首元素地址,除了以下2种情况:
(1)sizeof(数组名),此时的数组名代表整个数组,所以计算结果是整个数组的大小
(2)&数组名,此时的数组名也代表整个数组,取出的是整个数组的地址,返回的是数组首元素的地址

作用于内置类型:

int main()
{
	printf("%zd\n", sizeof(char));
	printf("%zd\n", sizeof(short));
	printf("%zd\n", sizeof(int));
	printf("%zd\n", sizeof(float));
	printf("%zd\n", sizeof(double));
	printf("%zd\n", sizeof(long));
	printf("%zd\n", sizeof(long long));
	return 0;
}
//1 2 4 4 8 4 8

作用于指针类型:

int main()
{
	printf("%zd\n", sizeof(char*));
	printf("%zd\n", sizeof(short*));
	printf("%zd\n", sizeof(int*));
	printf("%zd\n", sizeof(float*));
	printf("%zd\n", sizeof(double*));
	return 0;
}

在32位平台下,结果都为4
在64位平台下,结果都为8

在32位平台下,有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电平(低电压)就是(1或者0);
那么32根地址线产生的地址就会是:
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001

11111111 11111111 11111111 11111111
每个地址有32个比特位,即32/8=4个字节
同理:对于64位平台下,有8个字节


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞吗,感谢看到这里,我们下篇博客见❤️

你可能感兴趣的:(算法,开发语言,c语言)