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

news/2024/10/30 13:38:23/

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

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.ppmy.cn/news/61420.html

相关文章

android 隐藏底部虚拟按键

方法一 滑动屏幕 可重新显示出来 protected void hideBottomUIMenu() { //隐藏虚拟按键&#xff0c;并且全屏 if (Build.VERSION.SDK_INT <11 && Build.VERSION.SDK_INT < 19) { // lower api View v this.getWindow().getDecorView(); v.setSyst…

第三十五章 Unity人形动画(下)

本章内容主要就是动画数据的独立文件使用方式。有了独立的动画文件&#xff0c;我们就可以将其应用到其他模型上面了。最简单的方式就是&#xff0c;我们可以给其他模型编辑动画控制器的时候&#xff0c;使用这些动画文件。Unity则给我们提供了更加高级的共享方式&#xff0c;就…

C嘎嘎的运算符重载基础教程以及遵守规则【文末赠书三本】

博主名字&#xff1a;阿玥的小东东 大家一起共进步&#xff01; 目录 基础概念 优先级和结合性 不会改变用法 在全局范围内重载运算符 小结 本期送书&#xff1a;盼了一年的Core Java最新版卷Ⅱ&#xff0c;终于上市了 基础概念 运算符重载是通过函数重载实现的&#xf…

从一到无穷大 #8 Arrow,Parquet and ORC

文章目录 引言ArrowParquetNested EncodingRepetition LevelsDefinition Levels 列化压缩 ORC 引言 以我的机器为例来做一个简单的计算&#xff1a; 执行cat /proc/cpuinfo |grep MHz|uniq可以看到目前机器中CPU频率&#xff0c;得到值 2494.140MHZ&#xff5e;2494140000HZ&…

118-Linux_数据库_索引

文章目录 一.索引是什么?二.索引为什么选择b树三.测试索引1.在mysql中创建数据库 test_indexdb2.在test_indexdb中创建表 test_index3.运行程序向表中插入1万条数据&#xff0c;都是字符串4. 查询验证 一.索引是什么? 索引是一种特殊的文件&#xff0c;它包含着对数据表里所…

Docker虚拟化概念

Docker虚拟化概念 1、虚拟化技术的概念 虚拟化技术主要是将物理资源转变为逻辑上可以管理的资源&#xff1b;用以打破物理资源结构之间的壁垒&#xff1b;让计算的原件运行在虚拟的基础之上&#xff1b;而不是直接运行在硬件设备资源上&#xff1b; 说白了就是硬件资源转变成…

考研机试刷题第二天:任意进制转任意进制【高进度短除法】

理一下思路&#xff1a; 看了y总的视频之后我觉得这道题其实只需要对上次写的进制转换微微做一下调整即可。 于是我写出了下面的代码 #include <iostream> #include <vector> #include <algorithm> #include <cstring>using namespace std;vector<…

精品:Stimulsoft Forms 2023.2.2

Stimulsoft Forms 是一种用于创建、编辑、填写、发布、分发交互式表单和收集结果的工具。我们的产品可嵌入到应用程序中&#xff0c;并允许您创建各种自定义填充模板。丰富的功能使模板具有真正的交互性。用户会收到 PDF 格式的可填写表格&#xff0c;他们可以在任何支持此格式…