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);//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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Master-Detail(主表明细),确认可以出货的SQL指令 -- Not Exists

这是我文章的备份&#xff0c;原文请看&#xff1a; http://www.dotblogs.com.tw/mis2000lab/archive/2011/08/18/master_detail_finish_and_shipping.aspx [补充]下集&#xff0c;第十四章。Master-Detail&#xff08;主表明细&#xff09;&#xff0c;确认可以出货的SQL指令…

开发板——X210开发板的SD卡启动方式

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 前言与总结 这里说的SD卡启动方式&#xff0c;指的是uboot在SD卡中或者在inand里&#xff0c;且启动介质拨码开关选择SD卡启动方式&#xff08;对于X210&#xff0c;是拨到远离电源键的一侧&#xf…

使用iBATIS3.0完成增删改查

为什么80%的码农都做不了架构师&#xff1f;>>> 使用iBATIS3.0完成增删改查 iBATIS3.0和以前的版本有一些改变&#xff0c;不过学过以前版本的再学习3.0应该不是太难&#xff0c;3.0要求JDK1.5支持&#xff0c;因为其中增加了注解和泛型&#xff0c;这些都是JDK1.5…

oracle-11g-R2监听文件配置

客户端连接oracle数据库时出现如下错误&#xff1a; Listener refused the connection with the following error: ORA-12514, TNS:listener does not currently know of service requested in connect descriptor 首先看看Oracle服务是否开启&#xff1a; 然后找到listener.or…

【C】strcpy()需谨慎使用;

大家都知道C中的strcpy()函数是用来复制字符串的库函数。先附上代码看看strcpy()函数的功能&#xff1a; 1 #include<stdio.h>2 #include<string.h>3 #define MAX 204 5 int main(void)6 {7 char a[MAX]"abc";8 char b[MAX]"abcdefghi"…

多重指针操作

之前对多重指针操作心存忐忑&#xff0c;不能很熟练使用&#xff0c;本质原因是不了解其实质&#xff0c;因此对其进行了学习。 一、简单的代码如下 #include <stdio.h> #include <stdlib.h> #include <string.h>void myArray(char ***p2, int num) {int i0;…

C++ 初始化与赋值

1、初始化与赋值的区别&#xff1a; 二者的区别不是看&#xff0c;是否有这个赋值操作符&#xff0c;而是看操作的时候&#xff0c;对象是否已经有值。 初始化&#xff1a;创建对象&#xff0c;并给它设置初始值。 赋值&#xff1a;对象已经有值&#xff0c;擦除对象的当前值&a…

如何找出MySQL数据库中的低效SQL语句

面对业务的迅猛发展&#xff0c;DBA的一项重要工作就是及时发现数据库中的低效SQL语句&#xff0c;有的可以立刻着手解决&#xff08;比如缺少合适的索引&#xff09;&#xff0c;有的需要尽快反馈给开发人员进行修改。 MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语…

搜集的一些有意思的牛人博客地址

我要去桂林-田春峰的IT网志 http://blog.donews.com/accesine/ SEO优化的内容 转载于:https://www.cnblogs.com/zhangweilong/archive/2012/11/19/2777719.html

memory拷贝与string拷贝的区别

1、memory拷贝&#xff0c;根据拷贝的字节个数&#xff0c;从src一个一个字节拷贝到dst&#xff0c;拷贝过程不管src的取值&#xff0c;也不管dst是否能容纳。2、因此&#xff0c;对于memory拷贝&#xff0c;src中NULL字符&#xff08;取值为0的字符&#xff09;后面的字符也能…

【转载】#323 - A Generic Class is a Template for a Class

A generic classs is a class that takes one or more type parameters, which it then uses in the definition of the class. It can be thought of as a template for a class. 1 public class ThingContainer<TParam> 2 { 3   private TParam theThing; 4 5   p…

黑马程序员--ADO.Net中的知识点和难点

------- Windows Phone 7手机开发、.Net培训、期待与您交流&#xff01; ------- 1、 ADO.Net基础 程序要和数据库交互要通过ADO.Net进行&#xff0c;通过ADO.Net就能在程序中执行SQL了。 直接在项目中内嵌mdf文件的方式使用SQLServer数据库&#xff08;基于服务的数据库&#…

leetcode——15.3Sum

#include<stdio.h> #include<stdlib.h>int** threeSum(int* nums, int numsSize, int* returnSize) {if (numsSize<3)return NULL;int comNum numsSize*(numsSize - 1)*(numsSize - 2) / 6;int** ret (int**)malloc(sizeof(int*)*comNum);//先创建“用来存储一…

[New Portal]Windows Azure Virtual Machine (17) Virtual Machine成本分析

《Windows Azure Platform 系列文章目录》 在Windows Azure VM里&#xff0c;计费模式是和以下几个因素有关&#xff1a; 成本1: VM Type and VM Size 具体的计费模式请参考这里 http://www.windowsazure.com/en-us/pricing/details/virtual-machines/#service-windows 我们知道…

Servlet与JSP间的传值问题

Servlet与JSP 之间的传值有两种情况&#xff1a;JSP -> Servlet&#xff0c; Servlet -> JSP。通过对象 request和 session (不考虑 application)完成传值。一、JSP -> servletJSP页面有3种方法向 servlet传值&#xff1a; form表单、URL<!-- JSP page --> ...…

java 访问修饰符

java 访问修饰符 类、方法、成员变量和局部变量的可用修饰符 修饰符 类 成员访求 构造方法 成员变量 局部变量 abstract&#xff08;抽象的&#xff09; √ √ &#xff0d; &#xff0d; &#xff0d; static &#xff08;静态的&#xff09; &#xff0d; √ …

嵌入式Linux系统的构成和启动总结

以下内容源于网络资源的整理&#xff0c;如有侵权请告知删除。 一、嵌入式Linux系统典型结构 Flash划分成以下4个区&#xff1a; &#xff08;1&#xff09;Bootloader区。存放的是Bootloader&#xff0c;它负责嵌入式系统最初的硬件初始化、驱动和内核加载。 &#xff08;2&…

防止arp***方法

防止arp***&#xff1a;Win7下搞定ip与mac地址绑定对于玩系统的老手都知道&#xff0c;防止arp***实际上不需要这个防火墙那个防火墙&#xff0c;一句命令将ip与mac地址绑定即可。例如&#xff1a;arp -s 192.168.1.1 00-19-e0-c0-6f-0a不过这句话在Windows7显得这么无助&#…

根文件系统的简介

以下内容源于网络资源的整理&#xff0c;如有侵权请告知删除。 一、文件系统 文件系统是对一个存储设备上的数据进行组织的机制。这种机制有利于用户和操作系统的交互。 尽管内核是 Linux 的核心&#xff0c;但文件却是用户与操作系统交互所采用的主要工具。对Linux来说尤其如…

使用jQuery异步传递含复杂属性及集合属性的Model到控制器方法

Student类有集合属性Courses&#xff0c;如何把Student连同集合属性Courses传递给控制器方法&#xff1f; public class Student { public string StudentName { get; set; } public IList<Course> Courses { get; set; } } public class Course…