以下内容源于网络资源的学习与整理,如有侵权请告知删除。欢迎交流。
一、strlen()函数
函数模型
size_t strlen(const char *s);
函数作用
strlen()函数是C库函数,其功能是计算字符串长度。
即从代表该字符串的第一个地址开始遍历,直到遇到‘\0’(结束符NULL)。
参数说明
参数 s 是字符指针,指向字符串的首字符地址。
补充说明
(1)数据类型size_t,是C/C++标准在stddef.h中定义的,它的真实类型与操作系统有关。
在32位架构中被普遍定义为:typedef unsigned int size_t;(4个字节)
在64位架构中被定义为:typedef unsigned long size_t;(8个字节)
(2)strlen函数在计算字符串长度时,没有将字符串结尾标志‘\0’计算在内。
二、sizeof运算符
sizeof本质
sizeof是“单目运算符”。
- 运算符,包括算术运算符、关系运算符、求字节数运算符、逻辑运算符等等。
- 单目,指的是这个运算符只有一个操作数。
- sizeof运算符也叫“求字节数运算符”。
sizeof功能
通俗点说,计算运算对象(变量或数据类型)所占的字节数。
正式地说,获得保证能容纳实现所建立的最大对象的字节大小。
补充说明
(1)参数可以是函数、对象、类型、对象等等。
(2)根据sizeof的功能描述,结构体对齐与否的时候,使用sizeof计算的结果有区别吗?
三、两者对比
对比项目 | sizeof | strlen |
本质 | 运算符 | C库函数 |
参数 | 各种变量或数据类型 | 只能是字符指针,且字符串必须是以''\0''结尾的 |
何时计算 | 一般是编译时计算 | 程序运行期间计算 |
特别说明 | 注意运算符的优先级 | 计算结果不把‘\0’计算在内 |
举例说明 char str[100]="CHINA"; char *p=str; | sizeof(str) // 100 sizeof(p) // 4 | strlen(str) // 5 strlen(p) // 5 |
解释说明 | sizeof( str )得到的是数组str的大小,结果为100。 sizeof( p )得到的是指针变量p所占用的内存大小,结果为4。 | 当数组名作为参数传入时,实际上数组就退化成指针了(或者说,strlen不区分数组还是指针)。因此strlen( str )返回的是数组str中保存的字符串的长度,结果为5。 strlen( p )返回的是指针p所指向的字符串的长度,结果为5。 |
总结 | 对于指针,sizeof操作符返回这个指针占的空间,一般是4个字节。 对于数组,sizeof返回编译器为这个数组所分配的空间大小,即这个数组所有元素所占的总空间。(我只需要知道编译器一开始为你分配了多大的空间就可以了,你里面写不写东西或者写多少东西,都不关我的事) | strlen只关心存储的内容(我只关心什么时候遇到‘\0’),不关心分配的空间大小和类型(你分配多大的空间都不关我的事,只要你给一个地址我,我就从那个地址一直数下去,直到遇见‘\0’)。 |
补充说明 | sizeof有时也需要在运行时计算,比如求动态数组占用的字节数。使用sizeof求动态数组的大小与编译器相关,某些编译器不支持这一功能。 |
四、代码示例
#include<stdio.h>
#include<string.h> int main(void)
{int a, x, y;char str[100] = "CHINA";char *p = str;char *str1="absde";char str2[]="absde";char str3[8]={'a',};char ss[] = "0123456789";x = sizeof a; //用sizeof求变量所占字节数,可以不用括号y = sizeof(int); //用sizeof求类型所占字节数,必须用括号printf("sizeof x = %d\n", x);//4printf("sizeof int = %d\n", y);//4printf("sizeof str = %d\n", sizeof str);//100 // 求字符数组大小printf("strlen str = %d\n", strlen(str));//5 // 求字符串长度printf("sizeof p = %d\n", sizeof p);//4 // 求指针变量p的大小printf("strlen p = %d\n", strlen(p));//5 // 求指针p所指字符串长度printf("sizeof(str1) = %d\n",sizeof(str1))//4printf("sizeof(str2) = %d\n",sizeof(str2))//6printf("sizeof(str3) = %d\n",sizeof(str3))//8printf("sizeof(ss) = %d\n",sizeof(ss))//1
/*
首先说明一点,char类型占一个字节,所以sizeof(char)是1str1是一个指针,只是指向了字符串"absde"而已。所以sizeof(str1)不是字符串所占
的空间也不是字符数组占的空间,而是一个字符型指针占的空间。
所以sizeof(str1)=sizeof(char*)=4,在C/C++中一个指针占4个字节str2是一个字符型数组。C/C++规定,对于一个数组,返回这个数组占的总空间,
所以sizeof(str2)取得的是字符串"absde"占的总空间。"absde"中,
共有a b s d e \0六个字符,所以str2数组的长度是6,
所以sizeof(str2)=6*sizeof(char)=6str3已经定义成了长度是8的数组,所以sizeof(str3)为8str4和str2类似,'0' '1' ... '9'加上'\0'共11个字符,所以ss占的空间是8
*/getchar();return 0;
}