C语言 之 理解指针(7)sizeof和strlen的对比

1. sizeof和strlen的对比

1.1 sizeof

我们在学习操作符的时候就学习到了sizeof,所以首先可以确定的是sizeof是操作符,而不是函数。
sizeof计算的是变量所占内存内存空间的大小,单位是字节,如果操作数是类型,计算的是使用该类型创建的一个变量所占内存空间的大小。
sizeof只关注占用内存空间的大小,不在乎内存中存放什么数据。
如:

#include <stdio.h>
int main()
{
 int a = 10;
 printf("%d\n", sizeof(a));
 printf("%d\n", sizeof a);
 printf("%d\n", sizeof(int)); //操作数为类型 计算使用该类型创建的一个变量所占空间的大小
 
 return 0;
}

结果为:
在这里插入图片描述

1.2 strlen

strlen是C语言中的库函数
作用是求取字符串长度

函数原型为:
在这里插入图片描述
strlen所统计的就是参数str的这个地址开始向后,\0之前字符串中的字符个数。
这个str是字符串的首个字符的地址。
如果没有给\0,就会一直往下找,直到找到为止

来看看下面的例子:

#include <stdio.h>
int main()
{
	char arr1[3] = { 'a', 'b', 'c' };
	char arr2[] = "abc";
	printf("%d\n", strlen(arr1));
	printf("%d\n", strlen(arr2));

	printf("%d\n", sizeof(arr1));
	printf("%d\n", sizeof(arr2));
	return 0;
}

结果为:
在这里插入图片描述

可以看到printf("%d\n", strlen(arr1));的结果居然是35,这是因为这个字符数组没有给\0,所以就会在内存空间中一直往下找,找到\0为止,换成你的编译器运行结果可能就不一样了。
而arr2的这个形式在末尾是默认有一个\0的,所以我们能看到printf("%d\n", sizeof(arr2));的打印结果为4,就是因为会多开一个空间来存放’\0’,这样就能很好地找到\0,精准的算出字符串的长度。

如果我修改一下arr1数组的大小,在数组中手动添加一个\0呢?

#include <stdio.h>
int main()
{
	char arr1[4] = { 'a', 'b', 'c','\0'};
	char arr2[] = "abc";
	printf("%d\n", strlen(arr1));
	printf("%d\n", strlen(arr2));

	printf("%d\n", sizeof(arr1));
	printf("%d\n", sizeof(arr2));
	return 0;
}

运行结果为:
在这里插入图片描述

这就说明了strlen计算的字符串长度是在\0之前的

1.3 两者对比

sizeofstrlen
sizeof是操作符strlen是头文件为string.h的库函数
sizeof计算操作数所占内存空间的大小,单位是字节srtlen求字符串长度,统计的是 \0 之前的字符个数
不关注内存中存放什么数据关注内存中是否有 \0 ,如果没有 \0 ,就会一直往后找,有越界的可能

本篇内容大概就是这样 明天会更新以strlen和sizeof为媒介来了解指针以及内存等的题目 不要错过啦!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值