【c语言】字符串的基本概念 | 字符串存储原理

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

c语言系列专栏: c语言之路重点知识整合

字符串 目录

  • 一、字符、字符数组
    • 1.字符
    • 2.字符数组
  • 二、字符串
  • 三、字符串的存储原理
      • 字符串常量在代码中代表所在常量区的首地址(地址常量)

一、字符、字符数组

1.字符

字符char知识点:字符类型详解

每个我们看见的字符影像都有自己的影响编码,每个字符对应着各自的影响编码(ASCII码)

根据ASCII码,每个字符都有其各自的数字编码,通过使用数字编码即可打印出对应的字符影像

对于一个字符输出其%d格式为其数字编码,输出%c格式就是其字符影像

2.字符数组

定义一个字符数组:

	char s1[] = { 'T','i','a','n','X','i'};
	char s2[] = { 'T',105,'\141','\x6',01011000,'i','\n'};
	printf("%s\n", s1);		// %s 以字符串格式打印
	printf("%s\n", s2);

运行结果出现了乱码:

image-20230506084356443

原因:

s1,s2字符数组在打印时,并不知道该打印到哪里结束,因此需要一个代表结束的字符——‘\0’

在字符数组的末尾添加结束语’\0’,再来输出就没有乱码:

image-20230506084849461

如果将结束语提前,放在字符数组中间位置呢?

image-20230506085028132

再打印输出到a(\141)就结束了,因为遇到了’\0’。

%s会一致打印每个字符,直到遇到’\0’为止。约定的特殊字符一一即字符串的结束标记’\0’

二、字符串

通过数组的方式定义字符串太过麻烦,我们可以直接用一个双引号代表字符串。

	char str[50] = "TianXiCoding";
	printf("%s\n", str);

image-20230506085527990

使用调试器查看str数组,str数组在字符串的后面自动补上了’\0’

image-20230506085655511

同样在字符串中间添加’\0’就可以提前结束

image-20230506085736680

三、字符串的存储原理

我们先定义一个字符串,并且使用指针指向它,再用调试器查看

	 char str1[] ="TianXi";
	 char *p1 = "TianXi";
	 char *p2="TianXi";

执行前:str1为7个字符的字符数组,p1,p2为还未指向任何的指针

image-20230506090018681

通过上面的定义代码后,p1,p2被指向了同一个地址

image-20230506090256086

尝试对指针进行修改时发生了错误:

image-20230506090438494

原因就是TianXi字符串存放在常量区,"TianXi"字符串常量返回的就是他所在内存中的首地址。

当 char str1[] =“TianXi”;这条语句执行时,系统会在""常量区"寻找"TianXi"字符串常量,如果没有就创建一个。

由于str1为字符串数组,它会在栈区创建字符数组并把字符串常量的每个字符存入栈区的每个数组成员。

但是当执行 char *pl =“TianXi”:时,发现“常量区”有该字符串就把其首地址赋给p1,因此通过p1只能访问的第一个字符h, char *p2亦如此。所以p1和 p2指向同一个地址。

p1,p2在栈区指向常量区的字符串常量 首地址 不可改变

str1数组也在栈区 可以改变

修改str1数组,p1,p2没有发生变化:

image-20230506091109357

同样 这条语句也不可执行:str1 = “how”;

数组名是个地址常量 不可被修改,数组知识点详见数组存储原理

字符串常量在代码中代表所在常量区的首地址(地址常量)

和数组一样,我们可以通过地址偏移读取字符串中的字符

数组和指针知识点:利用指针操作数组

#include <stdio.h>
int main()
{
	 char str1[] ="TianXi";
	 printf("%c\n", "TianXi"[3]);	//地址[偏移]  *(地址+偏移)
	 printf("%s\n", "TianXi"+2);
	return 0;
}

image-20230506091643705

大家的点赞、收藏、关注将是我更新的最大动力!欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!

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

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

相关文章

【Java EE】-博客系统(前端页面)

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【JavaEE】 分享: 且视他人如盏盏鬼火&#xff0c;大胆地去走你的道路。——史铁生《病隙碎笔》 主要内容&#xff1a;博客系统 登陆页面&#xff0c;列表页面&#xff0c;详情页…

AArch32 AArch64 Registers map详细解析与索引

1、AArch32 Registers AArch32 系统寄存器索引。 例如第一个寄存器ACTLR点击后解析如下&#xff1a; 2、AArch64 Registers AArch64 系统寄存器索引。 3、AArch32 Operations AArch32 系统指令索引。 例如第一个寄存器ACTLR_EL1点击后解析如下&#xff1a; 4、AArch…

Inception模型实现孤立手语词的识别

实现孤立手语词的识别流程如下&#xff0c;在实际研究中&#xff0c;本章将着重研究第三阶段内容&#xff0c;也就是模型的设计与实现过程&#xff0c;目的是提高手语图像的识别准确率。 Inception模型实现 Inception模型是谷歌研究人员在2014年提出的一个深度卷…

一文把 JavaScript 中的 this 聊得明明白白

文章目录 1.this 是什么&#xff1f;2.this的指向2.1 全局上下文的 this 指向2.2 函数&#xff08;普通函数&#xff09;上下文中的 this 指向2.3 事件处理程序中的 this 指向2.4 以对象的方式调用时 this 的指向2.5 构造函数中的 this 指向2.6 在 类上下文中 this 的指向。2.7…

84.python input输入函数知识拓展

文章目录 1. input函数知识回顾2. input常犯错误解析3. 用函数转换从终端输入的数据3.1 输入的数为整数&#xff0c;则用int转换为整数3.2 输入的数为浮点数&#xff0c;则用float转换为浮点数3.3 不考虑输入的数据类型&#xff0c;则用eval函数转换 4. 变量的多种赋值方式4.1 …

【软考中级】2022下半年软件设计师案例分析题级答案

试题一(共15分) 阅读下列说明和图&#xff0c;回答问题1至问题4&#xff0c;将解答填入答题纸的对应栏内。 【说明】 随着新能源车数量的迅猛增长&#xff0c;全国各地电动汽车配套充电桩急速增长&#xff0c;同时 也带来了充电桩计量准确性的问题。充电桩都需要配备相应的…

JAVA9新特性

JAVA9新特性 概述 ​ 经过4次推迟&#xff0c;历经曲折的Java9最终在2017年9月21日发布。因为里面加入的模块化系统&#xff0c;在最初设想的时候并没有想过那么复杂&#xff0c;花费的时间超出预估时间。距离java8大约三年时间。 ​ Java 9提供了超过150项新功能特性&#x…

三个令人惊艳超有用的 ChatGPT 项目,开源了!

自 3 月初 Open AI 开放 ChatGPT API 以来&#xff0c;GitHub 上诞生的开源项目数量之多&#xff0c;着实多得让我眼花缭乱、应接不暇。 今天&#xff0c;我将着重挑选几个对日常工作、生活、学习帮助较大的 ChatGPT 开源项目&#xff0c;跟大家分享下&#xff0c;希望对你有所…

使用eclipse创建一个图书管理系统(1)-----搭建架构

目录 思维导图&#xff1a; 图书管理系统的创建&#xff1a; 第一步&#xff1a;搭建框架-------使用者 第二步&#xff1a;搭建框架------被使用者 第三步&#xff1a;操作方法 第四步&#xff1a;main函数 思维导图&#xff1a; 前言&#xff1a; 昨天学了一下使用Java…

games103——作业2

实验二主要使用隐式积分法以及PBD法完成布料仿真 完整项目已上传至github。 文章目录 基于物理的方法弹簧系统单个弹簧多个弹簧弹簧网络结构化弹簧网络(Structured Spring Networks)非结构化弹簧网络(Unstructured Spring Networks)三角网格表示 代码 求解质量弹簧系统的显示积…

(别再手动点APP了)UiAutomator2自动化测试框架带你玩转APP操作

目录 前言 一、uiautomator/uiautomator2的前生今世 1.官方文档介绍 2.梳理一下脉络 3.三款框架对比 二、uiautomator2简介 1.项目组成 2.工作原理 三、环境搭建 1.安装uiautomator2 2.初始化设备 3.init时都干了啥&#xff1f; 四、基础操作 1.连接设备 2.命令…

Python——函数

概念 函数是一段具有特定功能&#xff0c;可重复使用的代码&#xff0c;python提供了很多内置函数&#xff0c;如&#xff1a;print()&#xff0c;input()&#xff0c;len()函数等&#xff0c;以及标准库函数&#xff0c;math库中的sqrt()函数等&#xff0c;除此之外用户还可以…

Hive3面试基础

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、基本知识Hive31.表的类型和表的存储格式a)b)c)创建表i&#xff09;ii&#xff09; 2.表 二、使用步骤1.引入库2.读入数据 总结 前言 面试准备之Hive 回顾…

设计模式之适配器模式

目录 1、什么是适配器模式 2、为什么用适配器模式 3、适配器模式的结构 4、类适配器模式代码实现 4.1 思想 4.2 代码实现 4.3 问题分析 5、对象适配器模式代码实现 5.1 思想 5.2 代码实现 6、适配器模式应用场景 1、什么是适配器模式 适配器模式&#xff08;Adapter…

19. Unity - 2D游戏开发小记02 --- 伪透视图、2D物体碰撞、瓦片地图碰撞、素材缩放平铺

1. 伪视图 在2D游戏开发当中,当角色移动时,会发生物体与物体之间的前后遮挡。2D视图中的前后关系是由 Y 轴决定,y 值越小物体越靠前。unity的渲染应开启根据 y 值的大小进行渲染才能保证正确的遮挡效果,在菜单栏Editor–>project setting --> Graphic中按照下图方式…

C++三大特性—继承“复杂的菱形继承及菱形虚拟继承”

C的一个大坑&#xff1a;菱形继承 希望这篇文章能让你理解什么是菱形继承&#xff0c;以及菱形继承的注意事项 单继承与多继承 单继承&#xff1a;一个子类只有一个直接父类时称这个继承关系为单继承 多继承&#xff1a;一个子类有两个或以上直接父类时称这个继承关系为多继承…

凌恩生物美文分享|HGTree v2.0:水平基因转移数据库

水平基因转移(HGT)是指遗传物在物种间从一个相邻生物体到另一个生物体横向传递&#xff0c;是原核生物遗传变异的重要过程。HGT是负责塑造原核生物基因组和在自然选择中生存的驱动力之一&#xff0c;对原核生物的进化有很大贡献&#xff0c;但它会使物种进化史复杂化&#xff0…

【Linux】进程信号保存

前言 上篇博客我们了解了进程信号的概念和信号如何产生。 本篇我们将学习进程信号如何保存。 文章目录 前言一. 阻塞信号二. 递达动作三. 信号集四. 信号集操作函数结束语 一. 阻塞信号 首先我们需要一些预备知识 实际执行信号的处理动作称为信号递达&#xff08;Delivery&am…

数字图像处理-绪论

数字图像处理-绪论 文章目录 前言一、闲谈二、什么是数字图像处理&#xff1f;2.1. 什么是数字图像&#xff1f;2.1.1. 可见光图像2.1.2. 不可见光图像 2.2. 什么是数字图像处理&#xff1f; 三、数字图像处理的前世今生3.1. 数字图像处理的前世3.2. 数字图像处理的今生 四、数…

【嵌入式系统】课程复习资料整理

【嵌入式系统】课程复习资料整理 一、绪论 1.定义 从技术的角度定义&#xff1a;以应用为中心、以计算机技术为基础、软件硬件可裁剪、对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。从系统的角度定义&#xff1a;嵌入式系统是设计完成复杂功能的硬件和软件&a…
最新文章