C语言学习之sizeof与strlen

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’,其在内存中大致这样开辟的:

2f4fd492b5384779a794b3424fa8ed93.png

由于strlen()是在遇到’\0‘才会停止计数,所以当统计到数组最后一个元素时不会停止,而是继续向后进行统计,直到遇到’\0‘,因此37其实是一个随机值

        2.而sizeof()并没有这种限制,输出的结果就即为数组所占的空间大小,因此第2个和第4个输出结果即为arr3[5]和arr4[6]的大小。

        3.然后是strlen(arr4[6]),由于我们对数组进行了不完全初始化,而当我们对数组进行不完全初始化时,其余的空间会自动进行初始化(字符数组初始化为'\0',整形数组初始化为0),我们打开监视窗口查看arr4[6]的数据如下:

f7530b3fa003406987c22a679743daa7.png

可以看出即使我们没有对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]的数据如下:

12082e8500be4d5e9a3d2896dd8b34f9.png

由于字符串“hello”自带'\0',对数组进行初始化时使arr5[5]被赋值为'\0',因此strlen()遇到'\0'停止统计,输出5,而sizeof()则输出所占空间为6。


制作不易,能否点个赞再走呢qwq

sizeofstrlenC语言中的两个不同的操作符,它们用于获取数据类型或字符串的大小。它们具有以下区别和用途: 1. sizeof操作符用于获取数据类型或变量的大小。对于数组,sizeof返回整个数组的内存大小。例如,对于一个整型数组a,sizeof(a)将返回整个数组所占用的内存大小。对于单个数组元素,可以使用sizeof(arr)来获取该元素的内存大小。对于指针变量,sizeof将返回指针本身的大小。 2. strlen函数用于获取字符串的长度,即字符串中字符的个数。它需要一个指向字符串的指针作为参数,并返回一个size_t类型的值,表示字符串的长度。例如,strlen("Hello")将返回5,因为字符串"Hello"由5个字符组成。需要注意的是,strlen只计算字符串中的字符个数,不包括字符串末尾的空字符('\0')。 下面是对练习中代码的解释: - sizeof(a)将返回整个数组a所占用的内存大小,因为a是一个整型数组,所以sizeof(a)的结果将是数组中所有元素所占用的总内存大小。 - sizeof(a)将返回数组a中第一个元素的内存大小,因为a是数组中的一个整型元素。 - sizeof(*a)将返回指针a所指向的元素的内存大小,因为a是一个指针,所以sizeof(*a)的结果将是指针所指向的元素的内存大小。 - sizeof(a)将返回数组a中第二个元素的内存大小,因为a是数组中的一个整型元素。 - sizeof(a)和sizeof(&a[1])将返回相同的结果,即数组a中第二个元素的内存大小。 - sizeof(&a)将返回指针&a的大小,因为&a是一个指向整个数组a的指针。 - sizeof(*&a)将返回指针&a所指向的元素的内存大小,即整个数组a的第一个元素的内存大小。 - sizeof(&a)将返回指针&a的大小,因为&a是一个指向数组a中第二个元素的指针。 - sizeof(&a)将返回指针&a的大小,因为&a是一个指向数组a中第一个元素的指针。 - sizeof(&a)将返回指针&a的大小,因为&a是一个指向数组a中第二个元素的指针。 综上所述,sizeof操作符用于获取数据类型或变量的大小,而strlen函数用于获取字符串的长度。它们在用途上有着明显的区别,需要根据具体的需求选择使用。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忆梦初心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值