C语言进阶习题【1】指针和数组(2)——字符数组

3. 字符数组练习

sizeof 只关注占用内存空间的大小,单位是字节,不关心内存中存放的是什么
sizeof 是操作符

strlen是求字符串长度的,统计的是\0之前出现的字符个数,一定要找到\0才算结束,所以可能存在越界访问的
strlen是库函数

3.1 对于数组结尾没有‘\0’的情况, sizeof 和strlen

3.1.1 sizeof

代码验证

#include<stdio.h>

int main()
{

//字符数组
char arr[] = { 'a','b','c','d','e','f' }; //该数组没有'\0' 
printf("%d\n", sizeof(arr));   //arr单独放入sizeof中,表示整个数组的大小 6个元素,单个字符1字节,所以是6字节。
printf("%d\n", sizeof(arr + 0)); //arr没有单独放入,表示首元素地址+0还它本身,首元素地址大小 4字节/32位机器 或 8字节/64位机器
printf("%d\n", sizeof(*arr));//对首元素地址解引用,得到第一个元素‘a',大小1字节,
printf("%d\n", sizeof(arr[1]));//arr[1]表示第二个元素,大小1字节
printf("%d\n", sizeof(&arr));//数组名取地址,表示整个数组的地址,是地址大小 就是4字节/32位机器 或 8字节/64位机器
printf("%d\n", sizeof(&arr + 1));//数组名取地址,表示整个数组,&arr+1跳过整个数组,指向整个数组之后的位置,指针类型是char(*)[6] ,地址的大小就是 4字节/32位机器 或 8字节/64位机器
printf("%d\n", sizeof(&arr[0] + 1)); //arr[0]是首元素对首元素取地址,得到的是第一个元素地址,然后&arr[0]+1 表示的是第二个元素地址,大小是4字节/32位机器 或 8字节/64位机器


return 0;
}

在这里插入图片描述

代码分析

 sizeof(arr)

在这里插入图片描述

 sizeof(arr + 0);

在这里插入图片描述

 sizeof(*arr));

在这里插入图片描述

sizeof(arr[1])

在这里插入图片描述

sizeof(&arr)

在这里插入图片描述

sizeof(&arr + 1)

在这里插入图片描述

 sizeof(&arr[0] + 1)

在这里插入图片描述

3.1.2 strlen

首先需要明白,strlen求字符串长度,是数字符串结尾’\0’前面有几个字符
在这里插入图片描述

代码验证

#include<stdio.h>

int main()
{

	//字符数组
	char arr[] = { 'a','b','c','d','e','f' }; //该数组结尾没有'\0' 
    printf("%d\n", strlen(arr)); //求数组的长度,由于数组结尾没有'\0'所以算出来的是随机值,
    printf("%d\n", strlen(arr + 0));//和上面一条一样,随机值
    printf("%d\n", strlen(*arr));//对首元素解引用 是'a’strlen('a')->strlen(97),非法访问-err
    printf("%d\n", strlen(arr[1]));//和上一个一样   'b'-98,和上面的代码类似,是非法访问 - err
    printf("%d\n", strlen(&arr));//对整个数组取地址,得到的虽然是地址,但是仍然没有'\0',所以还是随机值
    printf("%d\n", strlen(&arr + 1));//对整个数组取地址+1 跳过整个数组,但是也是从头开始算长度,仍然没有'\0',所以还是随机值
    printf("%d\n", strlen(&arr[0] + 1));//&arr[0]得到 第一个元素a 再+1 得到b  求长度,也是随机值,因为没有'\0'
    return 0;
}

在这里插入图片描述
在这里插入图片描述

代码分析

strlen(arr)
strlen(arr + 0)

在这里插入图片描述

strlen(*arr)//error
strlen(arr[1])//error

在这里插入图片描述

strlen(&arr)

在这里插入图片描述

 strlen(&arr + 1)

在这里插入图片描述

strlen(&arr[0] + 1)

在这里插入图片描述

3.2 对于数组结尾有‘\0’的情况, sizeof 和strlen

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = "abcdef"; //数组是7个元素,后面还有一个'\0'
	printf("%d\n", sizeof(arr)); //arr单独在sizeof中表示求整个数组的大小 :7字节
	printf("%d\n", sizeof(arr + 0)); //arr不是单独放在sizeof中,表示首元素地址+0还是首元素地址,大小:4字节/32位机器 或 8字节/64位机器
	printf("%d\n", sizeof(*arr));//arr不是单独放在sizeof中,表示首元素地址,对首元素地址解引用,得到第一个元素‘a’ 大小:1字节
	printf("%d\n", sizeof(arr[1]));//arr[1]表示第二个元素’b’ 大小:1字节
	printf("%d\n", sizeof(&arr));//&arr表示整个数组的地址,是地址大小就是: 4字节/32位机器 或 8字节/64位机器
	printf("%d\n", sizeof(&arr + 1));// &arr表示整个数组的地址 +1就是跳过整个数组,指向数组之后的位置,该指针类型是char(*)[6] ,地址大小就是: 4字节/32位机器 或 8字节/64位机器
	printf("%d\n", sizeof(&arr[0] + 1));//&arr[0]表示第一个元素'a' + 1 表示第二个元素的地址,大小:4字节/32位机器 或 8字节/64位机器


	printf("%d\n", strlen(arr));//求字符串长度,长度:6字节
	printf("%d\n", strlen(arr + 0));//和上一条一样,长度:6字节
	//printf("%d\n", strlen(*arr));//对arr解引用,得到'a',是97,传给strlen是一个非法的地址,造成非法访问
	//printf("%d\n", strlen(arr[1]));//arr[1]是第二个元素,‘b'是98, 传给strlen是一个非法的地址,造成非法访问
	printf("%d\n", strlen(&arr));//&arr表示对整个数组取地址,得到整个数组地址(值是首地址的值,意义是整个数组)求该地址长度,大小是:6字节
	printf("%d\n", strlen(&arr + 1));//&arr表示对整个数组取地址,+1 得到跳过整个数组的地址,求该地址长度,是随机值,因为不清楚'\0'在哪里
	printf("%d\n", strlen(&arr[0] + 1));//&arr[0]表示第一个元素'a'+1得到’b' 从第二个元素往后统计字符串长度,大小:5字节
	return 0;
}

在这里插入图片描述
在这里插入图片描述

3.2.1 sizeof 代码分析

 sizeof(arr)

在这里插入图片描述

sizeof(arr + 0)

在这里插入图片描述

sizeof(*arr)

在这里插入图片描述

 sizeof(arr[1])

在这里插入图片描述

sizeof(&arr)

在这里插入图片描述

sizeof(&arr + 1)

在这里插入图片描述

sizeof(&arr[0] + 1)

在这里插入图片描述

3.2.2 strlen 代码分析

strlen(arr)
strlen(arr + 0)

在这里插入图片描述

strlen(*arr)//ERROR
strlen(arr[1]//error

在这里插入图片描述

strlen(&arr)
strlen(&arr + 1)

在这里插入图片描述

strlen(&arr[0] + 1)

在这里插入图片描述

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

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

相关文章

嵌入式工程师必学(67):SWD仿真接口(for ARM)的使用方法

概述: JTAG JTAG代表联合测试行动小组(定义JTAG标准的小组),旨在作为测试板的一种方式。JTAG允许用户与微控制器的各个部分进行对话。在许多情况下,这涉及一组指令或对电路板进行编程。JTAG标准定义了5个引脚: TCK: Test Clock TMS: Test Mode Select TDI: Test Data-…

代理模式实现

一、概念&#xff1a;代理模式属于结构型设计模式。客户端不能直接访问一个对象&#xff0c;可以通过代理的第三者来间接访问该对象&#xff0c;代理对象控制着对于原对象的访问&#xff0c;并允许在客户端访问对象的前后进行一些扩展和处理&#xff1b;这种设置模式称为代理模…

华为HuaweiCloudStack(一)介绍与架构

本文简单介绍了华为HCS私有云解决方案&#xff0c;并从下至上介绍HCS的整体架构&#xff0c;部署架构、部署方式等内容。 目录 HCS简介 HCS架构 纵向结构 ?管理平台类型 HCS节点类型 FusionSphere OpenStack CPS ServiceOM SC 运营面 OC 运维面 HCS部署架构 regi…

【视觉惯性SLAM:十七、ORB-SLAM3 中的跟踪流程】

17.1 跟踪流程流程图 ORB-SLAM3 的跟踪模块是整个系统的重要组成部分&#xff0c;负责实时确定相机在三维空间中的姿态位置&#xff0c;并保持关键帧之间的连续性。其基本目标是将输入的视频流与已有地图数据进行对齐&#xff0c;完成位姿估计和地图更新。 流程图概述 一个…

【机器学习实战入门项目】MNIST数字分类机器学习项目

Python 深度学习项目&#xff1a;手写数字识别 为了使机器更加智能&#xff0c;开发者们正在深入研究机器学习和深度学习技术。人类通过不断练习和重复来学习执行某项任务&#xff0c;从而记住如何完成这些任务。然后&#xff0c;大脑中的神经元会自动触发&#xff0c;他们能够…

Python Pyside6 加Sqlite3 写一个 通用 进销存 系统 初型

图: 说明: 进销存管理系统说明文档 功能模块 1. 首页 显示关键业务数据商品总数供应商总数本月采购金额本月销售金额显示预警信息库存不足预警待付款采购单待收款销售单2. 商品管理 商品信息维护商品编码(唯一标识)商品名称规格型号单位分类进货价销售价库存数量预警…

Ubuntu安装K8S

第一步&#xff1a; 安装docker Install Docker #注意docker是早期的名称已经过时了&#xff0c;因此请使用如下命令&#xff0c;一步到位安装docker-ce。 第二步&#xff1a;设置K8S源&#xff1a; &#xff08;大陆使用aliyun源&#xff0c;大陆外使用google源&#xff09;…

Linux图形界面详解以及替换桌面程序方法

说明&#xff1a;本文章主要说明Linux图形界面的启动流程&#xff0c;以及使用自己的图形化应用替换桌面程序的方法&#xff0c;类似与安卓启动会启动Launcher&#xff0c;使用自己程序替换Launcher一样&#xff0c;实现应用独占系统&#xff0c;或者设计自己的桌面程序。 一、…

第4章 Kafka核心API——Kafka客户端操作

Kafka客户端操作 一. 客户端操作1. AdminClient API 一. 客户端操作 1. AdminClient API

使用 Java 和 FreeMarker 实现自动生成供货清单,动态生成 Word 文档,简化文档处理流程。

在上一篇博客中主要是使用SpringBootApache POI实现了BOM物料清单Excel表格导出&#xff0c;详见以下博客&#xff1a; Spring Boot Apache POI 实现 Exc&#xff08;&#xff09;el 导出&#xff1a;BOM物料清单生成器&#xff08;支持中文文件名、样式美化、数据合并&#…

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)边缘检测

OpenCV中边缘检测四种常用算子&#xff1a; &#xff08;1&#xff09;Sobel算子 Sobel算子是一种基于梯度的边缘检测算法。它通过对图像进行卷积操作来计算图像的梯度&#xff0c;并将梯度的大小作为边缘的强度。它使用两个3x3的卷积核&#xff0c;分别用于计…

R语言绘图

多组火山图 数据准备&#xff1a; 将CSV文件同一在一个路径下&#xff0c;用代码合并 确保文件列名正确 library(fs) library(dplyr) library(tidyr) library(stringr) library(ggplot2) library(ggfun) library(ggrepel)# 获取文件列表 file_paths <- dir_ls(path &quo…

IDEA2023版中TODO的使用

介绍&#xff1a;TODO其实本质上还是注释&#xff0c;只不过加上了TODO这几个字符&#xff0c;可以让使用者快速找到。 注意&#xff1a;在类、接口等文件中&#xff0c;注释是使用// 即&#xff1a;// TODO 注释内容 在配置文件中&#xff0c;注释是使用# 即&#xff1a;# TO…

Maven的多模块架构设计诺依的多模块

Maven的多模块架构设计 多模块架构设计&#xff0c;本文采用 诺依的多模块架构设计分析

【JsonViewer】Json格式化

使用 Notepad 对 Json 数据进行格式化处理&#xff0c;使数据在结构上更清晰 1.在线安装 安装之后&#xff0c;重启应用&#xff0c;在插件菜单栏即可看到 JsonViewer 选项&#xff0c;在 Notepad 中放入 Json 数据&#xff0c;点击 Format Json 进行数据格式化 2.离线安装 …

【漏洞预警】FortiOS 和 FortiProxy 身份认证绕过漏洞(CVE-2024-55591)

文章目录 一、产品简介二、漏洞描述三、影响版本四、漏洞检测方法五、解决方案 一、产品简介 FortiOS是Fortinet公司核心的网络安全操作系统&#xff0c;广泛应用于FortiGate下一代防火墙&#xff0c;为用户提供防火墙、VPN、入侵防御、应用控制等多种安全功能。 FortiProxy则…

企业分类相似度筛选实战:基于规则与向量方法的对比分析

文章目录 企业表相似类别筛选实战项目背景介绍效果展示基于规则的效果基于向量相似的效果 说明相关文章推荐 企业表相似类别筛选实战 项目背景 在当下RAG&#xff08;检索增强生成&#xff09;技术应用不断发展的背景下&#xff0c;掌握文本相似算法不仅能够助力信息检索&…

Ubuntu打开文件夹不显示文件

1.情况介绍 使用ubuntu打开文件夹不显示文件夹里面的内容&#xff0c;而是直接打开了资源查看器。 2.解决办法 命令行安装nautilus sudo apt-get install nautilus

Go-知识 版本演进

Go-知识 版本演进 Go release notesr56(2011/03/16)r57(2011/05/03)Gofix 工具语言包工具小修订 r58(2011/06/29)语言包工具小修订 r59(2011/08/01)语言包工具 r60(2011/09/07)语言包工具 [go1 2012-03-28](https://golang.google.cn/doc/devel/release#go1)[go1.1 2013-05-13]…

pycharm+pyside6+desinger实现查询汉字笔顺GIF动图

一、引言 这学期儿子语文期末考试有一道这样的题目&#xff1a; 这道题答案是B&#xff0c;儿子做错了选了C。我告诉他“车字旁”和“车”的笔顺是不一样的&#xff0c;因为二者有一个笔画是不一样的&#xff0c;“车字旁”下边那笔是“提”&#xff0c;而“车”字是“横”&am…