深层次分析字符数组和字符串的区别是什么?

前言

(1)休闲时刻刷B站,看到一个卖课的,发视频问,char arr1[]={‘H’,‘E’,‘L’,‘L’,‘O’};和char arr2[]=“HELLO”;区别是什么。
(2)看那个卖课博主一顿分析,最后成功得出:字符串比字符数组末尾多一个’\0’。
(3)很好,成功浪费我生命的3分钟。无语,就这水平还卖课。如果各位有幸看到这货,希望能够保持清晰,不要被这种无良卖课机构欺骗。
(4)为了防止被当成地图炮,我声明一下,我只diss那种没啥实力乱忽悠的买课机构。对于教干货的培训机构,我还是保持尊重态度的!

浅层分析

存储大小

(1)就像那个卖课说的一样,字符串比字符数组末尾多一个’\0’。因此字符串比字符数组的大小比字符数组大一个字节。

char arr1[]={'H','E','L','L','O'};
char arr2[]="HELLO";
sizeof(arr1);  //返回5
sizeof(arr2);  //返回6,因为最后有一个'\0'

strlen()测试结果不一样

(1)那个卖课的也没有水到无药可救,这个程度还是分析到了,我还是有些许欣慰的。
(2)我们需要知道strlen()函数作用是什么。strlen()函数可以计算字符串的大小,而strlen()函数底层实现是什么呢?
(3)说白了一点一点的往后爬,,直到找到了ascii中的0。找到0之后,退出while循环,然后根据地址相减,就可以得出字符串长度。(注意:因为char只有一个字节,所以地址相减就可以直接得出字符串长度)
<1>可能还有一些同学没有理解,我直接拿上面的"hello"字符串分析,假设"hello"字符串首字符’h’的地址为0x50。因此传入strlen()函数的str的值为0x50。
<2>const char *s = str; 经过这一句,s也是0x50。
<3>第一次while(),*s为0x48(字符’H’的ASCII值是0x48),所以进入循环,s自增,从0x50变成0x51。
<4>按照<3>的步骤来4次,s是0x54的时候,在 while (*s)的时候,*s为0x4F(字符’O’的ASCII值是0x48),此时s再次自增。
<5>关键来了,第五次while (*s)的时候,我们发现,*s的值居然是0!于是退出while()循环。
<6>然后s - str =5即可计算出字符串长度了。

在这里插入图片描述

size_t strlen(const char *str) {const char *s = str;while (*s)s++;return s - str;
}

(4)现在我们知道了strlen的原理之后,我们再看看字符数组。字符数组中,char arr1[]={‘H’,‘E’,‘L’,‘L’,‘O’};的字符’O’后面的值是未知的,可能是0也可能是一些其他值,所以strlne()测试出来的字符数组长度是无法确定的!

总结

(1)上面这些都是非常浅显的知识,但凡认真学了C语言都懂的,真心搞不懂那个卖课的搞到那么神秘兮兮的干嘛。
(2)总结起来就是字符串比字符数组末尾多一个’\0’,因此导致存储大小和strlen()结果不一致。

深层分析

存储位置不一样

(1)字符串是存储在常量区的,一般来说,常量区存储在ROM中。
(2)字符数组存储位置要看情况而定。但是都是存储在RAM。
<1>如果字符数组是全局变量,就存储在静态数据区。
<2>如果字符数组是局部变量,就存储在栈中。

修改权限不一样

(1)字符串是存储在常量区的,所以说,字符串没有修改权限。CPU无法对字符串修改。
(2)字符数组要么是静态数据,要么是栈中。CPU都能够对字符数组进行修改。

断电存储大小不一样

(1)对于字符串而言,他是在常量区,所以即使机器断电,他的数据依旧存在。
(2)但是对于字符数组而言,假如他是局部变量。断电之后他的数据就会消失了。但是字符数组是全局变量他的数据还是会存在于ROM。
(3)这么不明白的同学,可以看RAM明明断电会丢失数据,为什么初始化的全局变量存储在RAM?详细分析程序的存储

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

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

相关文章

IT运维:使用数据分析平台监控DELL服务器

概述 在企业日常运维中&#xff0c;我们有着大量的服务器设备&#xff0c;设备故障一般可以通过常用的监控软件实现自动告警&#xff0c;但如果在管理运维中我们要做的不仅仅是发现故障&#xff0c;处理硬件故障&#xff0c;我们还需要进一步的了解&#xff0c;今年一共出现了多…

nodejs+vue+elementui农业产品信息网上商城管理系统_9927h

语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 前端nodejsvueelementui,系统使用权限分别包括管理员、种植户和用户&#xff0c;其中管理员拥有着最大的权限&#xff0c;同时管理员的…

MySQL数据库 索引、事务、储存引擎

索引 索引的概念 索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff08;类似于C语言的链表通过指针指向数据记录的内存地址&#xff09;。 使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是先通过索引表找…

【智算中心】GPU是如何改变世界的

现在有市场消息表示&#xff0c;NVIDIA正计划减少A800 GPU的产量&#xff0c;以促进其更高端的H800 GPU 的销售。很显然NVIDIA是希望从H800 GPU上获得更多销售量&#xff0c;从中国市场获得更多利益。而且最近一段时间有传闻美国要彻底封杀AI芯片的出口&#xff0c;让国内甚至连…

【java】LinkedList 和 ArrayList的简介与对比

Java LinkedList和 ArrayList 在使用上&#xff0c;几乎是一样的。由于LinkedList是基于双向链表的&#xff0c;会多出list.getFirst();获取头部元素等方法 链表&#xff08;Linked list&#xff09;是一种常见的基础数据结构&#xff0c;是一种线性表&#xff0c;但是并不会按…

掌握指针和数组:经典笔试题攻略(万字详解)

&#x1f341;博客主页&#xff1a;江池俊的博客 &#x1f4ab;收录专栏&#xff1a;C语言刷题专栏 &#x1f4a1;代码仓库&#xff1a;江池俊的代码仓库 &#x1f3aa;我的社区&#xff1a;GeekHub &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐ 文章目录 前…

电脑显示“Operating System not found”该怎么办?

“Operating System not found”是一种常见的电脑错误提示&#xff0c;这类错误会导致你无法成功启动Windows。那么电脑显示“Operating System not found”该怎么办呢&#xff1f; 方法1. 检查硬盘 首先&#xff0c;您可以测试硬盘是否存在问题。为此&#xff0c;您可以采取以…

基于JSP+Servlet+Mysql停车场管理系统(含实训报告)

TOC 一、系统介绍 项目类型&#xff1a;Java web项目 项目名称&#xff1a;基于JSPServlet的停车场管理系统 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 前端技术&#xff1a;HTML、CSS、JS、JQuery等技术 后端技术&#xff1a;JSP、Servlet、JDBC等技术…

Python案例|Matplotlib库实现的数据分析

数据展示是数据分析和挖掘中的重要环节&#xff0c;通过图形的形式可以直观、清晰地呈现数据内在的规律。 本文所用数据采用上一篇案例实现后的数据表&#xff0c;数据存储在newbj_lianJia.csv文件中&#xff0c;具体代码如下。 import pandas as pd #导入库 import matplot…

自定义拖拽功能,上下拖拽改变盒子高度

核心在于监听鼠标的move来改变div的高度&#xff0c;抽成了组件 <template><div ref"container" class"drag"><z-tooltip v-if"isShowIcon" effect"dark" content"格式化" placement"top-start"&…

视频分割合并工具说明

使用说明书&#xff1a;视频分割合并工具 欢迎使用视频生成工具&#xff01;本工具旨在帮助您将视频文件按照指定的规则分割并合并&#xff0c;以生成您所需的视频。 本程序还自带提高分辨率1920:1080&#xff0c;以及增加10db声音的功能 软件下载地址 https://github.com/c…

树模型与集成学习:LightGBM

目录 树模型与集成学习 LightGBM 的贡献 LightGBM 的贡献&#xff1a;单边梯度抽样算法 LightGBM 的贡献&#xff1a;直方图算法 LightGBM 的贡献&#xff1a;互斥特征捆绑算法 LightGBM 的贡献&#xff1a;深度限制的 Leaf-wise 算法 树模型与集成学习 树模型是非常好的…

Windows系统下,将文件夹中文件名字全部复制提取出来

一、使用命令提示符&#xff08;Command Prompt&#xff09;&#xff1a; 1、打开文件夹&#xff0c;确保你所需的文件都在该文件夹中。 2、在文件夹的路径栏中&#xff0c;输入 “cmd” 并按下 Enter 键&#xff0c;以打开命令提示符并将其当前路径设置为所选文件夹的路径。 …

Java——一个简单的使用JPanel和JButton来设计窗口界面

这段代码是一个简单的使用JPanel和JButton来设计窗口界面的例子。 在designFrame方法中&#xff0c;创建了一个JFrame对象作为窗口&#xff0c;然后创建了两个JPanel对象作为面板&#xff0c;分别用于放置按钮。 创建了两个JButton对象作为按钮&#xff0c;并设置按钮的文本内容…

AI 时代,程序员无需焦虑 | 《服务端开发:技术、方法与实用解决方案》(文末送书福利4.0)

文章目录 &#x1f4cb;前言&#x1f3af;程序员会被 AI 取代么&#xff1f;&#x1f3af;服务端开发尚难被 AI 取代&#x1f3af; 服务端开发何去何从&#xff1f;&#x1f3af;业界首部体系化、全景式解读服务端开发的著作&#x1f4ac;读者对象&#x1f4da;本书优势&#x…

k-近邻算法概述,k-means与k-NN的区别对比

目录 k-近邻算法概述 k-近邻算法细节 k值的选取 分类器的决策 k-means与k-NN的区别对比 k-近邻算法概述 k近邻&#xff08;k-nearest neighbor, k-NN&#xff09;算法由 Cover 和 Hart 于1968年提出&#xff0c;是一种简单的分类方法。通俗来说&#xff0c;就是给定一个…

3D角色展示

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>3D卡片悬停</title><style>font-face {font-family: "Exoct";src: url("htt…

centos7设置java后端项目开机自启【脚本、开机自启】

1.切换目录 cd /etc/init.d/2.编辑脚本 vim wbs-service-start.sh编辑内容 #!/bin/bash # chkconfig: 2345 80 90 # description: auto_runnohup java -jar /usr/java/wbs-service.jar > /dev/null 2>&1 & echo $! > /var/run/wbs-service.pid3.添加进入系…

Hugo·Stack主题·杂记

运行环境 hugo版本&#xff1a;v0.117.0&#xff08;扩展版&#xff09; go&#xff1a;1.21.0 PowerShell 7&#xff08;x64&#xff09; Windows10 添加主题 git submodule add https://github.com/CaiJimmy/hugo-theme-stack/ themes/hugo-theme-stack修改配置文件 m…

C++ 编译器优化与SIMD指令集

C 编译器优化与SIMD指令集 1. 汇编语言1.1 通用寄存器&#xff1a;32位时代1.2 通用寄存器&#xff1a;64位时代1.3 8位&#xff0c;16位&#xff0c;32位&#xff0c;64位版本1.4 AT&T 汇编语言1.5 返回值&#xff1a;通过 eax 传出1.6 前6个参数&#xff1a;分别通过 edi…