sizeof和strlen的使用及差异

news2024/12/29 17:49:20

sizeof

1.sizeof是操作符

2.sizeof计算操作数所占内存的大小,单位是字节(byte)

3.sizeof不关注内存中存放什么数据

4.sizeof比较通用不挑类型

strlen

1.strlen是库函数,使用需包含头文件string.h

2.strlen是求字符串长度的,统计的是 \0 之前的字符的个数

3.strlen关注内存中是否有 \0 ,如果没有 \0 ,就会持续向后找,可能会越界

4.strlen只能用于求字符串长度

sizeof

sizeof 是操作符,不是函数

当sizeof后接变量或数组时,()可省,证明了sizeof不是函数,

因为函数在调用时函数调用操作符()不可省

#include <stdio.h>
int main()
{
	int a = 10;
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof a);
	printf("%d\n", sizeof(int));
	return 0;
}

 当sizeof后接类型名时,()不可省

在这里,介绍一个类型size_t , size_t是专门设计给sizeof的,用于表示sizeof的返回值类型,即无符号整数类型,在打印时也可使用%zd代替%d 

下面为一段sizeof应用实例

#include<stdio.h>
int main()
{
	short s = 10;
	int i = 2;
	int n = sizeof(s = i + 4);
	printf("%d\n", n);
	printf("%d\n", s);
	return 0;
}

请问:输出结果为多少

输出结果:

n的值为什么为2呢?

因为sizeof在计算大小的时候是根据类型推算的

short类型大小为两个字节,int类型大小为四个字节

我们无法将四米长的棍子放进两米长的房间,同样的,我们也无法将int类型的数据完整存放在short类型中,此时就要发生截断,所以n的值为2

s的值为什么是10呢?

当sizeof的操作数为表达式时,表达式是不参与计算的

为什么表达式放到sizeof中就不参与计算了呢?

我们知道,表达式有两个属性:

1.类型属性

2.值属性

sizeof根据类型属性推断

源文件(源代码)----------编译--------链接--------可执行程序-----------计算/运算

test.c                                sizeof                           test.exe                    s=i+4

sizeof(s=i+4)在编译时就已确定大小,即在编译时发生了

int n=sizeof(s=i+4);------------>int n=2;

因为在编译时表达式就已被替换,所以后续计算失效,s=i+4 根本不执行,所以sizeof里面的表达式不参与计算

你是否明晰了sizeof的使用呢?做几道题检测一下吧

🌰:一:

#include<stdio.h>
int main()
{
	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(a + 0));
	printf("%d\n", sizeof(*a));
	printf("%d\n", sizeof(a + 1));
	printf("%d\n", sizeof(a[1]));
	printf("%d\n", sizeof(&a));
	printf("%d\n", sizeof(*&a));
	printf("%d\n", sizeof(&a + 1));
	printf("%d\n", sizeof(&a[0]));
	printf("%d\n", sizeof(&a[0] + 1));
	return 0;
}

想作对这道题,除了了解sizeof的使用,还需知晓数组名的含义

数组名的含义 

数组名即为数组首元素地址,但有两个例外

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

🌰2:&数组名,数组名表示整个数组,取出的是整个数组的地址

知晓了以上内容我们再来分析这道题 

1.数组名单独放在sizeof内部,计算整个数组的大小(4*4=16)

2.数组名没有单独放在sizeof内部,此时数组名为首元素地址,a+0还是数组首元素地址,地址大小为4/8字节(取决于编译环境)

3.对数组首元素地址解引用,得到的是数组首元素,数组首元素类型为int,大小为4字节

4.a+1为数组第二个元素的地址即&a[1],地址大小为4/8字节(取决于编译环境)

5.a[1]计算第二个元素大小,由于该元素类型为int,所以结果为4字节

6.&a取出的为整个数组的地址,但数组的地址也是地址,地址大小不会改变(不会因为是数组地址就变大或是char类型的变量就变小),大小就是4/8字节

7.(1).*&相互抵消sizeof(*&a)==sizeof(a),计算的为整个数组的大小

   (2).&a先取出整个数组的地址

              而*(解引用操作符)到底访问多少由指针类型决定,此时指针的类型为int(*)[4],故访问整个数组

8.*&a访问的是整个数组,&a+1跳过的也为整个数组,此时计算的是a数组后面的那个地址,地址大小为4/8字节

9.数组首元素地址,大小4/8

10.数组第二个元素的地址,大小4/8

🌰二: 

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

1.sizeof数组名,计算整个数组的大小,即为1*6=6字节

2.数组首元素地址,大小为4/8字节

3.*arr得到的为数组首元素,数组首元素类型为char,大小为1字节

4.arr[i]==*(arr+i),arr[1]即为数组第二个元素

5.整个数组的地址也是地址,大小为4/8字节

6.&arr+1跳过整个数组,指针指向的为数组后面那个元素,地址大小为4/8字节

7.&arr[0]+1为数组第二个元素的地址,大小为4/8字节

🌰三:

#include<stdio.h>
int main()
{
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(a[0][0]));
	printf("%d\n", sizeof(a[0]));
	printf("%d\n", sizeof(a[0] + 1));
	printf("%d\n", sizeof(*(a[0] + 1)));
	printf("%d\n", sizeof(a+1));
	printf("%d\n", sizeof(*(a+1))); 
	printf("%d\n", sizeof(&a[0]+1));
	printf("%d\n", sizeof(*(&a[0]+1)));
	printf("%d\n", sizeof(*a));
	printf("%d\n", sizeof(a[3]));
	return 0;
}

 1.sizeof(数组名)计算的为整个数组的大小,即为48(3*4*4)字节

2.a[0][0]为数组第一个元素,大小为4字节

3.a[0]就是第一行的数组名,单独放在sizeof内部,计算的为第一行的大小,即为4*4=16

4.a[0]是第一行数组名,但数组名并未单独放在sizeof内部,所以数组名表示的是数组首元素地址,也就是a[0][0]的地址,a[0]+1是a[0][1]的地址,地址的大小为4/8字节

5.a[0]+1即&a[0][1],对该指针进行解引用操作,即元素a[0][1],由于是整形二维数组,元素为整形,大小为4字节

6.a没有单独放在sizeof内部,数组名a就是数组首元素的地址,也就是第一行的地址,a+1就是第二行的地址,地址大小为4/8字节

7.对第二行地址解引用访问第二行,大小为4*4=16字节

8.&a[0]取出的是第一行的地址,&a[0]+1得到的就为第二行的地址,地址大小4/8字节

9.对第二行地址解引用访问第二行,大小为4*4=16字节

10.数组名a就是数组首元素的地址,也就是第一行的地址,*a就是访问第一行,大小为4*4=16字节          -->                  *a ==*(a+0)==a [ 0 ];

11.a[3]和a[0]性质相同,sizeof不会访问内容,大小仍为16字节

strlen

strlen是C语言库函数,功能为求字符串长度,统计的为从strlen函数的参数地址向后,\0 之前字符串中字符的个数,strlen函数会一直向后查找  \0 字符,直到找到为止,所以可能存在越界查找与提前终止。

下面来几段应用实例

代码1:

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = "abcdef";
	printf("%d\n", strlen(arr));
	return 0;
}

这段代码打印结果为6,向后查找至 \0 停止,\0 不计入总数(sizeof中\0计入总数)

 代码2:

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = "abc\0def";
	printf("%d\n", strlen(arr));
	return 0;
}

这段代码运行结果为3,遇见 \0 提前终止

代码3:

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = { 'a','b','c' };
	printf("%s\n", arr);
	printf("%d\n", strlen(arr));
	return 0;
}

这段代码的输出结果为 abc+随机值  和 随机值,在初始化时未加入终止字符(\0)导致打印字符串其后为随机值,strlen函数向后越界查找遇见 \0 才停止

会了没会了没会了没

再做几道题试试吧!!!

🌰一:

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", strlen(arr));
	printf("%d\n", strlen(arr + 0));
	printf("%d\n", strlen (*arr));
	printf("%d\n", strlen(arr[1]));
	printf("%d\n", strlen(&arr));
	printf("%d\n", strlen(&arr + 1));
	printf("%d\n", strlen(&arr[0] + 1));
}

下面不想写上面不想看,就这样吧看得开心就行。。。

我要爬山去了(西上北下)

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

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

相关文章

L1-2 倒数第N个字符串

本题链接&#xff1a;PTA | 程序设计类实验辅助教学平台 题目&#xff1a; 样例&#xff1a; 输入 3 7417 输出 pat 思路&#xff1a; 根据题意&#xff0c;这道题是一道思维模拟题。 给出 n 位的小写字母字符串&#xff0c;其中进制位为 26 &#xff0c;求进位1 到 倒数第 …

天工AI搜索引擎

相信正在看autosar架构相关内容的人来说&#xff0c;对于autosar相关知识或者配置项的生涩知识点可谓是苦之久矣&#xff0c;这个时候一个好的搜索引擎能带来的帮助太大了&#xff0c;不管是平时百度还是看文档都需要大量的时间去检索自己真正想知道的信息&#xff0c;偶然间发…

酒店管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/89036287 更多系统资源库…

Windows 频繁失去焦点分析

原文&#xff1a;https://blog.iyatt.com/?p14383 1 前言 刚才在打字的时候发现会随机失去焦点&#xff0c;然后又要用鼠标点一下正在输入的位置才能继续输入&#xff0c;特别烦。开始我怀疑是手碰到触摸板导致失去焦点&#xff0c;但是我用了差不多十年带触摸板的笔记本电脑…

Python框架篇(7):FastApi-依赖项

有时选择太多也会让人陷入焦虑&#xff0c;比如突然有一段自由时间&#xff0c;却因为想做的事情太多&#xff0c;最后把时间都浪费在了摇摆不定上&#xff0c;静不下心做最重要的事&#xff0c;或者说根本不知道最重要的事情是什么。---------- 《认知觉醒:开启自我改变的原动…

【干货】无源滤波器设计讲解,工作原理+设计步骤

今天给大家分享的是&#xff1a;无源模拟滤波器针对很多入门小白不懂滤波器设计&#xff0c;一些老工程师上班很多年有的也不懂得总结知识点&#xff0c;以及想学习不知道怎么系统学习的这一类人群&#xff0c;前方知识点来袭&#xff0c;请君放心食用~ 在信号处理领域&#x…

AXI-Stream——草稿版

参考自哔站&#xff1a;FPGA IP之AXI4-Lite AXI4-Stream_哔哩哔哩_bilibili 信号 传输层级从小到大 TKEEP和TSTRB共同决定了是哪种数据流

红外循迹,避障模块介绍

本节将介绍标题中三种模块的应用以及工作原理 上图中&#xff0c;黑色的是红外接收管&#xff0c;绿色的是红外发射管&#xff0c;他俩与发光二级管都非常像&#xff0c;但功能上却有所不同。 发光二级管&#xff1a;亮度在一定的时间内随电流的增大而增大。 红外发射管&…

Python遥感开发之解决TIF数据之间行列不一致的问题

Python遥感开发之解决TIF数据之间行列不一致的问题 1.问题如图所示2.完整代码如下所示 前言&#xff1a;主要解决在同一分辨率的情况下&#xff0c;遥感数据之间行和列数据不一致的问题。 1.问题如图所示 我们发现这两个TIF的分辨率是一样的&#xff0c;都是0.01x0.01&#xff…

软考软件设计师2024年5月报名流程及注意事项

2024年5月软考软件设计师报名入口&#xff1a; 中国计算机技术职业资格网&#xff08;http://www.ruankao.org.cn/&#xff09; 2024年软考报名时间暂未公布&#xff0c;考试时间上半年为5月25日到28日&#xff0c;下半年考试时间为11月9日到12日。不想错过考试最新消息的考友…

Django(三)-搭建第一个应用(2)

一、编写更多视图 问题详情页——展示某个投票的问题和不带结果的选项列表。问题结果页——展示某个投票的结果。投票处理器——用于响应用户为某个问题的特定选项投票的操作。 # 1.问题详情页&#xff1a;展示某个投票的问题和不带结果的选项列表 def detail(request,questi…

第十二届蓝桥杯JavaB组省赛真题 - 时间显示

解题思路&#xff1a; 数量级较大&#xff0c;需要使用long类型 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);long num scan.nextLong();long allseconds num / 1000;long seconds allse…

CMake学习笔记(二)从PROJECT_BINARY_DIR看外部编译和内部编译

目录 外部编译 内部编译 总结 外部编译 看如下例子&#xff1a;我在EXE_OUT_PATH中建立了文件夹build、文件夹src2 和 文件CMakeLists.txt 其中EXE_OUT_PATH/CMakeLists.txt的内容如下&#xff1a; PROJECT(out_path) ADD_SUBDIRECTORY(src2 bin2) MESSAGE(STATUS "m…

Internet Explorer 降级

Internet Explorer 降级 1. version2. Internet Explorer 降级References 1. version 帮助 -> 关于Internet Explorer(A) 2. Internet Explorer 降级 开始 -> 控制面板 -> 卸载程序 -> 查看已安装的更新 搜索 Internet -> Internet Explorer 11 -> 卸载 -…

1978-2022年全国31省社会消费品零售总额数据

1978-2022年全国31省社会消费品零售总额数据 1、时间&#xff1a;1978-2022年 2、指标&#xff1a;社会消费品零售总额 3、范围&#xff1a;31省市 4、来源&#xff1a;整理自国家统计J和各省年鉴 5、缺失情况说明&#xff1a;1997-2022年31省市均无缺失&#xff0c; 199…

冒泡排序的习题全集(含答案)

习题1 1.给定一个包含红色&#xff0c;白色和蓝色&#xff0c;共n个元素的数组nums&#xff0c;原地对他们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照共色&#xff0c;白色&#xff0c;蓝色顺序排列。 我们使用整数0&#xff0c;1&#xff0c;2分别表示红…

2024生物科学、医学技术与化学国际会议(ICBSMTC2024)

2024生物科学、医学技术与化学国际会议(ICBSMTC2024) 会议简介 ICBSMTC2024是一个聚焦于生物科学、医学技术与化学领域的学术交流活动&#xff0c;会议将在中国桂林举行&#xff0c;会议旨在促进相关领域的学术交流与发展。会议将汇集来自世界各地的顶级学者和专家&#xff0c…

闪鱼随身WiFi好用吗?随身WiFi测评推荐!闪鱼的随身WiFi怎么样?

闪鱼随身WiFi因为爱和各大IP进行联动&#xff0c;被称为联名狂魔&#xff0c;广受年轻朋友们的喜爱。所以有非常多的朋友都在催小编出一期闪鱼随身WiFi的真实测评。现在&#xff0c;它来了&#xff01;今天我们测试的这款闪鱼随身WiFi是闪鱼旗下BK0002这个热卖的型号。 一、外观…

day01-项目概述、环境搭建

1. 软件开发整体介绍 1.1 软件开发流程 1.2 角色分工 项目经理&#xff1a;对整个项目负责&#xff0c;任务分配、把控进度产品经理&#xff1a;进行需求调研&#xff0c;输出需求调研文档、产品原型等UI设计师&#xff1a;根据产品原型输出界面效果图架构师&#xff1a;项目整…

C#调用C++ (使用C++/CLI)

简介 C/CLI&#xff08;C Common Language Infrastructure&#xff09;是一种允许在 .NET 平台上创建托管代码&#xff08;managed code&#xff09;和非托管代码&#xff08;unmanaged code&#xff09;之间互操作的语言。其原理可以概括如下&#xff1a; 编译器支持: C/CLI 编…