strlen()函数 与 sizeof运算符

以下内容源于网络资源的学习与整理,如有侵权请告知删除。欢迎交流。

一、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);//4
	printf("sizeof int = %d\n", y);//4

	printf("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))//4
    printf("sizeof(str2) = %d\n",sizeof(str2))//6
    printf("sizeof(str3) = %d\n",sizeof(str3))//8
    printf("sizeof(ss) =   %d\n",sizeof(ss))//1
/*
首先说明一点,char类型占一个字节,所以sizeof(char)是1

str1是一个指针,只是指向了字符串"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)=6

str3已经定义成了长度是8的数组,所以sizeof(str3)为8

str4和str2类似,'0' '1' ... '9'加上'\0'共11个字符,所以ss占的空间是8
*/

	
	getchar();
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天糊土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值