练习-sizeof()和strlen()

目录

  • 前言
  • 解题技巧
  • 一、sizeof()练习题
    • 1.1 整型数组
      • 1.1.1 一维整型数组
      • 1.1.2 二维整型数组
    • 1.2 字符数组
    • 1.3 字符指针
  • 二、strlen()练习题
    • 2.1 字符数组初始化时不包含\0
    • 2.2 字符数组初始化包含\0
    • 2.3 字符指针指向字符串常量
  • 总结


前言

最近有点疲倦,啊啊啊,麻了…
今天写点轻松的东西,本篇文章记录关于sizeof()和strlen()的练习题。


解题技巧

(1)关于sizeof()使用的思考方向:

  1. 计算数据类型大小,例如 sizeof(int)
  2. 计算地址的大小,例如 sizeof(&pa),pa为变量
  3. 计算整个数组的大小,例如 sizeof(arr) arr为数组名

(2)关于strlen()使用的思考方向

首先,strlen()计算的是字符串的长度,遇到\0才停止计算,计算结果不包含\0,参数类型为 const char*

  1. 字符数组在初始化时不包含\0,则计算结果为随机值
  2. 字符数组在初始化时包含\0,则计算结果为字符的个数,不包含\0
  3. 字符串常量自动包含\0

一、sizeof()练习题

1.1 整型数组

1.1.1 一维整型数组

int main()
{
	int arr[] = { 1,2,3,4 };
	printf("sizeof(arr)       = %zu\n", sizeof(arr));
	//sizeof(数组名),计算的是整个数组的大小  4*4 = 16

	printf("sizeof(arr+0)     = %zu\n", sizeof(arr + 0));
	//计算的是首元素地址的大小

	printf("sizeof(*arr)      = %zu\n", sizeof(*arr));
	//sizeof(*arr) == sizeof(arr[0]) 计算首元素的大小

	printf("sizeof(arr+1)     = %zu\n", sizeof(arr + 1));
	//sizeof(arr+1) == sizeof(&arr[1]) 计算第二个元素地址的大小

	printf("sizeof(arr[1])    = %zu\n", sizeof(arr[1]));
	//计算第二个元素的大小

	printf("sizeof(&arr)      = %zu\n", sizeof(&arr));
	//计算整个数组地址的大小

	printf("sizeof(*&arr)     = %zu\n", sizeof(*&arr));
	//sizeof(*&arr) == sizeof(arr) 计算整个数组的大小

	printf("sizeof(&arr+1)    = %zu\n", sizeof(&arr + 1));
	//sizeof(&arr+1) 计算跳过整个数组后的地址的大小(本质计算地址大小)
 
	printf("sizeof(&arr[0])   = %zu\n", sizeof(&arr[0]));
	//计算首元素地址的大小

	printf("sizeof(&arr[0]+1) = %zu\n", sizeof(&arr[0] + 1));
	//sizeof(&arr[0]+1) == sizeof(&arr[1]) 计算的是第二个元素地址的大小

	return 0;
}

32位机器输出结果
在这里插入图片描述
64位机器输出结果
在这里插入图片描述


1.1.2 二维整型数组

int main()
{
	int arr[3][4] = { 0 };

	printf("sizeof(arr)          = %zu\n", sizeof(arr));
	//计算二维数组的大小  3*4*sizeof(int) = 3*4*4 = 48

	printf("sizeof(arr[0][0])    = %zu\n", sizeof(arr[0][0]));
	//计算元素类型的大小 sizeof(0) = sizeof(int) = 4

	printf("sizeof(arr[0])       = %zu\n", sizeof(arr[0]));
	//arr[0]表示的是第一行的数组名,计算的是第一行的大小  4*sizeof(int) = 4*4 = 16

	printf("sizeof(arr[0]+1)     = %zu\n", sizeof(arr[0] + 1));
	//arr[0] 表示第一行的数组名, arr[0]+1 表示的是第一行第二个元素的地址  &arr[0][1]
	//4/8

	printf("sizeof(*(arr[0]+1))  = %zu\n", sizeof(*(arr[0] + 1)));
	// arr[0]+1 -> &arr[0][1]     *(arr[0]+1) = 0   计算元素类型的大小 4

	printf("sizeof(arr+1)        = %zu\n", sizeof(arr + 1));
	//arr+1,此时 arr表示首元素地址,第一行的地址, arr+1表示第二行的地址
	//计算地址大小  4/8

	printf("sizeof(*(arr+1))     = %zu\n", sizeof(*(arr + 1)));
	//对第二行的地址进行解引用,计算的是第二行数组的大小  16

	printf("sizeof(&arr[0]+1)    = %zu\n", sizeof(&arr[0] + 1));
	//&arr[0] 取出的是整个一维数组的地址, &arr[0]+1表示的是第二行的地址
	//计算地址的大小 4/8

	printf("sizeof(*(&arr[0]+1)) = %zu\n", sizeof(*(&arr[0] + 1)));
	//&arr[0] +1 表示第二行的地址  对第二行进行解引用,计算的是一维数组的大小 
	//16

	printf("sizeof(*arr)         = %zu\n", sizeof(*arr));
	//arr表示首元素地址,即第一行的地址 对一行地址解引用
	//计算一维数组的大小  16
 
	printf("sizeof(arr[3])       = %zu\n", sizeof(arr[3]));
	//arr[3] -> arr[0] 计算一维数组的大小
	//16
	return 0;
}

32位机器输出结果
在这里插入图片描述
64位机器输出结果
在这里插入图片描述


1.2 字符数组

int main()
{
	char str[] = { 'a','b','c','d','e','f' };

	printf("sizeof(str)       = %zu\n", sizeof(str));
	//计算整个数组大小

	printf("sizeof(str+0)     = %zu\n", sizeof(str + 0));
	//计算首元素地址大小

	printf("sizeof(*str)      = %zu\n", sizeof(*str));
	//*str == str[0] == 'a'  计算元素的类型大小 sizeof(char)

	printf("sizeof(str[1])    = %zu\n", sizeof(str[1]));
	//计算元素的类型大小 sizeof(char)

	printf("sizeof(&str)      = %zu\n", sizeof(&str));
	//&str整个数组的地址 计算的是地址的大小

	printf("sizeof(&str+1)	  = %zu\n", sizeof(&str + 1));
	//计算的是地址大小

	printf("sizeof(&str[0]+1) = %zu\n", sizeof(&str[0] + 1));
	//计算第二个元素的地址大小

	return 0;
}

32位机器输出结果
在这里插入图片描述
64位机器输出结果
在这里插入图片描述


1.3 字符指针

int main()
{
	const char* p = "abcdef";

	printf("sizeof(p)       = %zu\n", sizeof(p));
	//计算地址大小

	printf("sizeof(p+1)     = %zu\n", sizeof(p + 1));
	//计算地址大小

	printf("sizeof(*p)      = %zu\n", sizeof(*p));
	//计算元素类型大小

	printf("sizeof(p[0])    = %zu\n", sizeof(p[0]));
	//计算元素类型大小

	printf("sizeof(&p)      = %zu\n", sizeof(&p));
	//计算地址大小

	printf("sizeof(&p+1)    = %zu\n", sizeof(&p + 1));
	//计算地址大小

	printf("sizeof(&p[0]+1) = %zu\n", sizeof(&p[0] + 1));
	//计算地址大小

	return 0;
}

32位机器输出结果
在这里插入图片描述
64位机器输出结果
在这里插入图片描述


二、strlen()练习题

2.1 字符数组初始化时不包含\0

#include<string.h>
int main()
{
	char str[] = { 'a','b','c','d','e','f' };

	printf("strlen(str)    = %zu\n", strlen(str));
	//随机值 值>=6

	printf("strlen(str+0)  = %zu\n", strlen(str + 0));
	//随机值 值>=6

	//printf("strlen(*str)   = %zu\n", strlen(*str));
	//程序错误  *str == 'a' == 97 
	//printf("strlen(str[1]) = %zu\n", strlen(str[1]));
	//程序错误  str[1] == 'b' == 98

	printf("strlen(&str)   = %zu\n", strlen(&str));
	//&str的类型为 char(*)[6] 与strlen()的参数类型不相同,会有警告
	//随机值 值>=6  &str整个数组的地址,但是 &str的值和str的值相同,但类型不相同

	printf("strlen(&str+1) = %zu\n", strlen(&str + 1));
	//随机值-6

	return 0;
}

输出运行结果
在这里插入图片描述


2.2 字符数组初始化包含\0

int main()
{
	char str[] = "abcdef";

	printf("strlen(str)    = %zu\n", strlen(str));
	//值为6

	printf("strlen(str+0)  = %zu\n", strlen(str + 0));
	//值为6

	//printf("strlen(*str)   = %zu\n", strlen(*str));
	//程序错误  *str == 'a' == 97 
	//printf("strlen(str[1]) = %zu\n", strlen(str[1]));
	//程序错误  str[1] == 'b' == 98

	printf("strlen(&str)   = %zu\n", strlen(&str));
	//&str的类型为 char(*)[6] 与strlen()的参数类型不相同,会有警告
	//值为6  &str整个数组的地址,但是 &str的值和str的值相同,但类型不相同

	printf("strlen(&str+1) = %zu\n", strlen(&str + 1));
	//随机值

	return 0;
}

输出运行结果
在这里插入图片描述


2.3 字符指针指向字符串常量

int main()
{
	const char* p = "abcdef";

	printf("strlen(p)       = %zu\n", strlen(p));
	//值为6

	printf("strlen(p+1)     = %zu\n", strlen(p + 1));
	//值为5

	//printf("strlen(*p)      = %zu\n", strlen(*p));
	//printf("strlen(p[0])    = %zu\n", strlen(p[0]));
	//程序错误

	printf("strlen(&p)      = %zu\n", strlen(&p));
	//随机值

	printf("strlen(&p+1)    = %zu\n", strlen(&p + 1));
	//随机值

	printf("strlen(&p[0]+1) = %zu\n", strlen(&p[0] + 1));
	//值为5

	return 0;
}

输出运行结果
在这里插入图片描述


总结

sizeof()计算内存空间大小:
sizeof(单独数组名):计算数组大小;
sizeof(地址) :计算地址大小;
sizeof(类型):计算类型大小。
strlen()计算字符串长度

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CentOS7 搭建Hadoop集群

1.环境准备 准备三台Linux&#xff08;CentOS7&#xff09;服务器 IP服务器名称192.168.11.136Master192.168.11.137Slave01192.168.11.138Slave02 1.2修改配置文件 1.2.1修改hosts文件 # Master服务器 vi /etc/hosts192.168.11.137 Slave01 192.168.11.138 Slave02 192.1…

微短剧市场暴涨267.65%,用微短剧场景AUI Kit精巧入局

微短剧&#xff0c;不仅上头&#xff0c;更要上心。 微短剧&#xff0c;深度“拿捏”了这个碎片化时代&#xff0c;也是刚过去的2023年绕不开的热词。 与传统影视剧制作精益求精、耗时长相反&#xff0c;门槛与耗时“双低”恰恰成为了微短剧的独特优势&#xff0c;使其走上以量…

普通卷积、转置卷积(transposed convolution)的原理及运算步骤解释

1.首先声明一点&#xff0c;转置卷积不是卷积的逆运算&#xff0c;转置卷积也是一种卷积方式&#xff0c;作用是进行上采样&#xff01;主要出现在分割和对抗神经网络模型中比较多。 2.其次&#xff0c;transposed convolution、fractionally-strided convolution 和 deconvol…

Hadoop分布式文件系统(三)

目录 一、Hadoop 1、MapReduce 1.1、理解MapReduce思想 1.2、分布式计算概念 1.3、MapReduce介绍 1.4、MapReduce特点 1.5、MapReduce局限性 1.6、MapReduce实例进程 1.7、MapReduce阶段组成 1.8、MapReduce数据类型 1.9、MapReduce官方示例 2、YARN 一、Hadoop 1…

leetcode 每日一题 2024年01月11日 统计出现过一次的公共字符串

题目 2085. 统计出现过一次的公共字符串 给你两个字符串数组 words1 和 words2 &#xff0c;请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。 示例 1&#xff1a; 输入&#xff1a;words1 ["leetcode","is","amazing","a…

yolov8 瑞芯微 RKNN 的 C++部署,部署工程难度小、模型推理速度快

之前写过两次yolov8目标检测部署&#xff0c;后续继续思考&#xff0c;针对部署还有优化空间&#xff0c;本示例的部署方式优化了部署难度&#xff0c;加快了模型推理速度&#xff08;略微增加了后处理的时耗&#xff09;。 特别说明&#xff1a;如有侵权告知删除&#xff0c;…

支付宝异步验签踩的坑

最近公司要做支付宝小程序 我作为服务端就要给小程序配置下单啊&#xff0c;异步回调同步支付状态等功能 就不可避免的使用到了支付宝异步验签 首先背景是我是PHP语言&#xff0c;然后验签方式是RSA2 一开始写原生验签方法&#xff0c;验签失败&#xff0c;后面又搞sdk 验签…

ABAP message的6种类型

ABAP message的6种类型 代码示例&#xff0c; IF lt_bseg[] IS INITIAL. MESSAGE 测试的信息&#xff01; TYPE I. ENDIF.

[BJDCTF2020]ZJCTF,不过如此

题目源码&#xff1a; <?phperror_reporting(0); $text $_GET["text"]; $file $_GET["file"]; if(isset($text)&&(file_get_contents($text,r)"I have a dream")){echo "<br><h1>".file_get_contents($tex…

完全卸载grafana

先停掉grafana sudo systemctl stop grafana-server 查看要卸载的包的名字 yum list installed yum remove grafana-enterprise.x86_64 成功 删除grafana的数据目录 sudo rm -rf /etc/grafana/sudo rm -rf /usr/share/grafana/sudo rm -rf /var/lib/grafana/

【AT 指令开发】软件框架与接口

目录 1 软件逻辑2.代码2.1 at_command.h2.2 at_command.c本文主要用于记录纯MCU无OS下,AT 指令开发软件框架 1 软件逻辑 2.代码 2.1 at_command.h #ifndef AT_COMMAND_H #define AT_COMMAND_Hvoid AT_CMD_Process(uint8_t *uartBuffer, uint8_t dataLen);/*描述AT指令返回值…

STM32学习笔记二十二:WS2812制作像素游戏屏-飞行射击游戏(12)总结

至此&#xff0c;飞行射击游戏已经基本实现该有的功能&#xff0c;已经比较接近早期的商业游戏了。 如果采用脚本&#xff0c;可以完成关卡游戏&#xff0c;如果不用&#xff0c;也可以做成无限挑战游戏。 我们汇总一下制作的过程&#xff1a; 1、建模UML 2、主循环处理过程…

基于JavaWeb+BS架构+SpringBoot+Vue电影订票系统系统的设计和实现

基于JavaWebBS架构SpringBootVue电影订票系统系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 1 绪 论 3 1.1研究背景和意义 3 1.2拟解决的问题及特性 3 1.3论文的结构 …

数据库期末复习重点总结

数据库期末复习重点总结 本文为总结&#xff0c;如有不对的地方请指针 第2章 关系模型的介绍 名称符号选择σ投影∏笛卡儿积连接并∪集差-交∩赋值<-更名ρ 除操作 设R和S除运算的结果为T&#xff0c;则T包含所有在R中但不在S中的属性和值&#xff0c;且T的元组与S的元…

基于嵌入式的智能台灯系统

基于嵌入式的智能台灯系统 功能说明 通过微信小程序控制台灯的亮灭及亮度。采集温湿度传到微信小程序上&#xff0c;台灯可以显示实时北京时间。 功能展示 01智能台灯演示 Mqtt服务器 http://www.yoyolife.fun/iot&#xff1a;Mqtt服务器&#xff0c;我是在这里注册的&#x…

Java医院综合绩效考核系统源代码

医院绩效考核管理系统是采用B/S架构模式设计、使用JAVA语言开发、后台使用MySql数据库进行管理的一整套计算机应用软件。系统和his系统进行对接&#xff0c;按照设定周期&#xff0c;从his系统获取医院科室和医生、护士、其他人员工作量&#xff0c;对没有录入信息化系统的工作…

配网故障定位技术的发展与应用:保障电力供应安全稳定的重要支撑

在现代社会&#xff0c;电力供应安全稳定对于国家经济发展和民生福祉至关重要。然而&#xff0c;随着电网规模的不断扩大&#xff0c;配网故障问题也日益突出。为了确保电力供应的连续性和可靠性&#xff0c;人们不断探索和研发各种故障定位技术。本文将介绍一种基于行波测距技…

LLM大模型显存计算

一、目录 模型参数单位内存计算案例显卡算力推理显存计算训练显存计算huggface 官网计算 模型推理/训练 需要的显存大模型输入长度与显存的关系大模型推理 多线程与显存的关系 参考&#xff1a;https://blog.csdn.net/Johntill/article/details/132629075 二、实现 模型参数…

【详解】稀疏矩阵的十字链表✿◡‿◡

目录 引言&#xff1a; 稀疏矩阵的十字链表表示 第一步&#xff1a;创结点存数据 第二步&#xff1a;将头结点同数据结点串起来 第三步&#xff1a;创建一个总头结点构成循环链表 总代码如下&#xff1a; 运行结果如下&#xff1a; 结语&#xff1a; 引言&#xff1a; …

超简单的简历模板精选5篇

HR浏览一份简历也就25秒左右&#xff0c;如果你连「好简历」都没有&#xff0c;怎么能找到好工作呢&#xff1f; 如果你不懂得如何在简历上展示自己&#xff0c;或者觉得怎么改简历都不出彩&#xff0c;那请你一定仔细读完。 个人求职简历第 1 篇 男 22 本科 AI简历 市场营…