全网最详细的sizeof运算和strlen函数讲解(通过多种数据类型举例)

简介: 全网最详细的sizeof运算和strlen函数讲解(通过多种数据类型举例)

1.对于sizeof的理解

1.1 sizeof对常见数据类型的计算

我们首先要明确的是sizeof是一个运算符号,并不是函数,它是用来计算所占内存空间的大小,单位是字节,主要是针对我们所给的数据类型分析得出的。

比如:我们用一段不完整的代码表示出来

int a = 2;
char b = '3';
short c = 2;
long long d = 2;

101929eafd1b492bad0cc013338ac018.png


通过sizeof计算得到:

a的大小是4,因为a的数据类型是int,int是4个字节;

b的大小是1,因为b的数据类型是char,char是4个字节;

c的大小是2,因为c的数据类型是short,short是2个字节;

d的大小是8,因为d的数据类型是longlong,longlong是8个字节。

所以我们不难看出的是


sizeof计算所占内存的大小,就是看我们传入的数据,它的数据类型是几个字节,sizeof算出来的就是几个字节。

1.2常见数据类型所占字节大小:

1字节 = 8比特位

1比特位 = 1个二进制数


int             4字节

short         2字节

long          在32位机中是4字节,64位机是8字节

double      8字节

float          4字节

指针类型  在32位机中是4字节,64位机是8字节

如:int*p,char*ch,short*s,...

这些都是指针类型,所以无论是int*,char*,short*,只要是指针,就是4/8个字节

1.3 sizeof  对  数组的计算

1.3.1 数组名和&数组名

数组名一般表示的是数组首元素的地址,但是有两个例外:

1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节

2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址


1.3.2 sizeof  对  数值型数组

 

我们知道了sizeof是对数据的数据类型的大小的计算,那么对数组是如何计算的呢?

比如:

#include "stdio.h"
 int main()
 {
     int arr[5] = {1,2,3,4,5};
     printf("%d\n",sizeof (arr));
     printf("%d\n",sizeof (arr[0]));
     return 0;
 }

e2788b49ef6f4147b826e3f53e941dcd.png

我们首先定义了一个一维数值型数组,数组arr有五个元素,我们这里sizeof(arr),计算的是整个数组的大小,先看数组的数据类型是int[5],该数组元素有5个,都是int类型,整个数组大小就是5*4=20,也就是20个字节。

而sizeof(arr[0])计算的是我们arr数组的第一个元素,下标是0,arr[0]的数据类型是int,所以是4个字节。

那么对于其他种类的数值型数组,大家可以自己动手来观察一下。(记住sizeof是根据你给的数据的数据类型来计算的哦)

1.3.3 sizeof  对  字符数组和字符串

我们上面学会了对数值型的数组进行sizeof计算,那字符数组是否也一样呢?字符串类型呢?

比如:字符数组

#include "stdio.h"
 int main()
 {
     char arr[5] = {'a','b','c','d','e'};
     printf("%d\n",sizeof (arr));
     printf("%d\n",sizeof (arr[0]));
     return 0;
 }

8b1d576d6ec344308157f8b31f694e93.png


我们看到sizeof(arr)得到的是5,因为这里的arr数组名是代表的整个数组,数组一共有五个元素,每个元素是char类型,所以整个数组大小是5*1 = 5个字节,那么sizeof(arr[0])里面的arr[0]数据类型是char,char是一个字节,所以sizeof得到就是1个字节。这跟上面数值型数据是一样的道理,都是看sizeof里面的数据类型是什么。

那下面看一看字符串

 

#include "stdio.h"
 int main()
 {
     char arr[] = "abcde";
     printf("%d\n",sizeof (arr));
     printf("%d\n",sizeof (arr[0]));
     return 0;
 }

665fdcc795da4df993f283b3284f1ecc.png

在这里我们看到了不一样的结果了,跟以往不同,我们明明是给了字符串5个元素,那为什么sizeof(arr)却得到了6呢?

这是因为我们在给字符串赋值的时候,字符串末尾自动补上了一个‘\0’,所以sizeof在计算大小的时候也会将‘\0’计算在里面,也就是说,在sizeof(arr)里认为,有6个元素,分别是abcde\0,每个元素都是char类型,就是6个字节。


大家学到了这里其实已经可以自己去推理更多数据类型的计算了,如指针类型,结构体类型...

1.4 sizeof的深入

我们在1.1中讲到,sizeof计算得到的大小是括号内数据的数据类型所占的字节数

那么sizeof是否可以对算法来计算大小呢?

我们在下面举例说明:

#include "stdio.h"
 int main()
 {
     int a = 2;
     int b = 3;
     short c = 1;
     printf("%d\n",sizeof (c = a + b));
     printf("c=%d\n",c);
 }

c9b1319ebe314f35bd6952bc36bb32ce.png

在上面代码中我们可以看到,sizeof算出来的是2,c的值是1;


那也就是说,sizeof收到的数据类型是short,c的值并没有改变,也就是sizeof里面并没有进行计算,但是进行了数据类型的统一。


所以sizeof只是对括号里面数据的数据类型进行的分析,并没有进行数值上的计算。

我们在使用sizeof时,只需要关注括号里的数据类型最后是什么,括号里的任何计算都没有进行。

2.strlen函数的定义与用法:

1.1 strlen函数的定义

首先,strlen是一个库函数,他是用来计算字符串长度的,遇到字符串中的‘\0’终止,

得到的长度是'\0'之前的字符个数,不包括'\0'本身。

在引用strlen函数需要写#include <string.h>这个头文件。


1.2 strlen函数定义类型

size_t  strlen   (const char * str)


我们可以看到strlen的参数是一个指针(地址),返回类型是size_t


size_t类型也是unsigned int,是由 typedef unsigned int size_t 得到的


也就是说,我们可以用无符号整形来接收strlen函数,实参部分要传入一个地址,也就是指针。

如图:

#include "string.h"
#include "stdio.h"
 int main()
 {
     char ch[] = "abcde";
     unsigned int n = strlen(ch);
     size_t m = strlen(ch);
     printf("长度是%d\n",n);
     printf("长度是%d\n",m);
     return 0;
 }

a25788b9d10c47f4ba4dc6b341c5b358.png

如图可以看出,我们给strlen函数传的形参是ch,也就是数组名,代表首元素地址,所以strlen函数在接收这个首元素地址之后,会往后走下去,直到找到'\0'才停止,返回'\0'之前的字符个数。

也可以看出size_t和unsigned int是一个类型,只不过是通过typedef重命名来的。


注意⚠️!!!!!!!


我们strlen函数只能接收char类型做为参数!!!!!

size_t   strlen   (const char * str)


原因是形参部分是字符指针!

3.sizeof和strlen的区别

1.strlen是一个库函数使用时需要引用#include<string.h>这个头文件,而sizeof是一个运算符号;


2.strlen计算的是’\0'之前的字符个数,sizeof计算的是所占空间内存的大小,单位是字节;


3.strlen计算时不包含'\0',而sizeof包含'\0';


4.strlen遇到'\0'才结束;


5.strlen只能用char做参数,sizeof可以用类型做参数;

下期博客会带着大家去练习多个sizeof和strlen的面试题

相关文章
|
7月前
|
编译器 C语言
【C语言】strlen()函数(字符串长度计算函数)
【C语言】strlen()函数(字符串长度计算函数)
82 0
|
2月前
也许我们也可以一起学习sizeof与strlen呀,还有二维数组的计算哦
也许我们也可以一起学习sizeof与strlen呀,还有二维数组的计算哦
37 1
|
3月前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
|
7月前
|
C语言
C语言(8)----长度计算方法:sizeof与strlen的对比
C语言(8)----长度计算方法:sizeof与strlen的对比
40 0
|
7月前
|
程序员 C语言
【C语言】函数----函数的分类、库函数详解(strcpy、memset)、自定义函数的实现(找较大值、交换两个数)
【C语言】函数----函数的分类、库函数详解(strcpy、memset)、自定义函数的实现(找较大值、交换两个数)
41 0
|
7月前
|
存储 C语言
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
|
7月前
|
C语言 C++
C语言变量、地址、字符及printf()/sizeof()/scanf()函数介绍
C语言变量、地址、字符及printf()/sizeof()/scanf()函数介绍
34 0
sizeof运算和strlen函数的笔试题(三)
sizeof运算和strlen函数的笔试题(三)