sizeof和strlen区别及其用法

很多初学者在学习C语言时总会把sizeof和strlen弄混,本人作为一名刚学代码不久的小白,将以自己的视角来为大家解读它俩的关系及用法。

(作为一名初学者,难免会有不足与缺陷,希望大家能够在评论中给出自己的意见和建议)

1.简单描述

它们俩虽然长得都像函数,实际上并非如此,strlen是库函数的一员,但sizeof是一个单目操作符,并非函数。在编程中可以直接使用sizeof,而使用strlen函数时注意加上头文件 #include <string.h>

当然,大家最关心的计算功能,毫无疑问二者都可办到。

strlen

计算字符串长度(字符串内的字符数),只能针对字符串

在计算长度时,遇到'\0'即会停止(每个字符串的末尾都会隐藏一个'\0')

所计算的时'\0'之前的字符个数;

sizeof 属于运算符

sizeof是用来计算变量或者类型所占空间的大小的,任何类型都可以使用,单位是字节

并且只关心字符串大小,不在乎内存中是否存在'\0'

并且计算时会把'\0'算在内;

2.深入探索

光说概念只会让人懵懵懂懂,所以,我想用代码来继续讲解

#include <stdio.h>

int main()
{
    int a = 10;
    int arr[10] = { 1,2,3,4,5 };
    printf("%d\n", sizeof(a));   //打印结果为4         第一行
    printf("%d\n", sizeof a);    //4                  第二行
    printf("%d\n", sizeof(int)); //4                  第三行
    printf("%d\n", sizeof(char));//1                  第四行
    printf("%d\n", sizeof(arr)); //40                 第五行

    return 0;
}

对于我们初学者来说,代码的格式也需要注意的一点

大家看到第一、二、三行的打印结果均为4,是因为sizeof所计算的是a的类型int,

int是整形,在内存中所占4个字节(byte),而sizeof后面跟(a)或(int),所以打印结果为4。

同样我在第四行也用char向大家展示了sizeof的用法,能够计算出char在内存中所占一个字节。

而对于sizeof(arr)来说,arr数组中并不只有5个元素,而是有10个元素,                                 {1,2,3,4,5,0,0,0,0,0};又因为是int型的arr数组,打印结果是40。

 还记得我在开头所说的两者和'\0'的关系么

#include <string.h>
int main()
{
    char arr[] = "abcdef";
    printf("%d\n", sizeof(arr));//打印结果为7
    printf("%d\n", strlen(arr));//打印结果为6
    return 0;
}

毫无疑问,在arr数组中有6个元素,那么sizeof和strlen打印的结果都应该是6啊,

不同结果的原因,都是在'\0'这个略显神秘的字符上;  '\0'是字符串结束的标志

其实,在每个字符串的,末尾都会隐藏一个字符'\0',

 大家可以看到,在arr[6]这个位置,放置了'\0',这也就是为什么二者打印结果不同的原因,

在计算时sizeof包含'\0',strlen则不包含。

3.sizeof的"特性"

我个人认为sizeof真的是个很有意思的“玩意”,长的一副函数的面孔却不是函数,而且本身还有许多特点,接下来,我就来和各位一起看看。

我们都知道,在函数传参时如果你传递的是(arr),并不会把整个数组都传递过去,它传递的是数组的首元素的地址,就像这样

#include <stdio.h>

void fac(char *p)
{
    ;
}

int main()
{
    char arr[5] = {1,2,3,4,5};
    fac(arr);
    return 0;
}

在fac函数中我用*p这个指针来接收所传过来的arr首元素的地址,

那么,有没有什么“玩意”能包括整个arr数组呢?

哈哈,那自然是sizeof了(&arr也可以),正因为这个特性,我们便可以利用它计算字符串的长度

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int ret = sizeof(arr) / sizeof(arr[0]);
				//40			//4		   相除得到字符串长度10

	printf("%d\n", ret);
	return 0;
}

因为是int型,所以sizeof(arr)(整个字符串长度)/ sizeof(arr[0])(arr首元素的地址)就可以得到字符串的长度了。

4.总结

关于sizeof和strlen的区别和用法,其实并不太多,或者取决于本人水平有限,还请各位读者在评论中表达自己的意见和建议。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值