前言
初学C语言阶段,我们会接触到不少一般的运算符,如自增(++)、自减(- -)以及sizeof运算符…在谈到sizeof的时候,另一个类似的东西会被拿出来作比较——strlen();
在这篇博客中我将向大家介绍sizeof和strlen()的区别和用法;
一、sizeof概述
sizeof是C语言中的长度运算符,在它的后面常常跟着一对括号( ),而括号中的内容就是这个运算符所要计算的对象(注意是对象而非参数,参数是函数中的概念),运算的结果为十进制数字,单位为字节(byte)。
二、strlen()概述
strlen()是C语言*<string.h>*头文件中包含的库函数,strlen后面跟着的一对括号()是函数的一个标志,括号内是函数的参数;
C语言是这样定义库函数strlen()的:
size_t strlen( const char *string )
size_t 是C语言重新定义的类型(typedef),表示无符号整型(unsigned int)
const char* 是strlen()函数的参数类型,即字符指针;
三、sizeof和strlen()的对比
由用法入手,我们先来比较下面两串代码:
int arr1[5] = { 1,2,3,4,5 };
printf("%d", sizeof(arr1));
输出结果为20;
这里sizeof计算了数组arr的大小:由于数组中有5个元素,每个元素都是int类型,且int类型的数据所占字节数为4(byte),因此输出结果为4*5=20;
那么,如果用strlen()呢?
int arr1[] = { 1,2,3,4,5 };
printf("%d", strlen(arr1));
编译器报出警告:“函数”: 从“int [5]”到“const char ”的类型不兼容
strlen()函数的参数是char*类型,这与数组arr1的类型不符;
我们再使用字符数组arr2进行对比:
char arr2[] = "12345";
printf("%d\n", strlen(arr2));
printf("%d\n", sizeof(arr2))/sizeof(arr[0]);
//我们用arr2整个数组的大小除以arr2[0]这个首元素的大小,得到的就是数组中元素个数;
输出结果为5和6
5和6之间1的偏差是哪里来的呢?下面我再来深入分析sizeof和strlen()的不同:
我们将字符串“12345”存放在arr2数组中,然而在内存中,arr2包含了字符1,2,3,4,5以及一个用作字符串终止标志的空字符’\0’,共6个字符;
sizeof运算符仅仅负责将数组arr2所占的内存空间大小计算出来,所以当我们把arr2交由它计算的时候,空字符’\0’也被当做一个字符计算在内,所以此时arr2数组的大小是6个字节;
然而对于strlen()这个函数而言,我们将arr数组名传给它(在这种情况下数组名是首元素地址),那么strlen()函数就会以这个首元素地址为起始点,向后一个个地计算数组中的字符个数,当它遇到空字符’\0’时,便停止向后计算,并且这个’\0’不会被它计算在内;所以第二个的输出结果为6-1=5;
补充点:arr作为数组名单独出现的时候,大多数情况下表示的是首元素的地址,除两种情况:
1、sizeof(arr):这里的arr表示的是整个数组,所以sizeof计算了整个数组所占字节的大小;
2、&arr:这里取地址arr取出的是整个数组的地址,当我们对其解引用时也相当于获得了整个数组;