C语言(数组和指针存储字符串)

news2025/2/22 2:42:31

目录

一.数组和指针

1.字符串数组和字符数组区别

2.数组存储字符串常量

3.指针存储字符串

二.数组和指针的区别

1.常量和变量

2.修改成本

3.存储成本

一.数组和指针

1.字符串数组和字符数组区别

char ch[]="hello world",末尾存储着\0,就是字符串,相当于Char ch[]={'h','e','l','l','o',' ','w','o','r','l','d','\0'}

Char ch[]={'h','e','l','l','o',' ','w','o','r','l','d'},字符数组(末尾并没有存储\0)

这里的\0属于char形式的空字符,不是数字字符0

字符数组因为没有'\0',所以系统在打印的时候是无法检测到结束的,啥时候能结束全靠啥时候能遇到一个'\0';

演示代码:

#include <stdio.h>

#define CHAR "hello world"



int main()

{

char ch_o[] = { 'h','e','l','l','o' };

char ch_t[] = "hello";

printf("字符数组: %s\n字符串数组: %s\n", ch_o, ch_t);

return 0;

}

这里可以看出来字符数组打印中会出现一段乱码部分。该演示代码,具体效果不固定,但基本原理一致。

2.数组存储字符串常量

数组形式,Char ch[]="hello world",ch在计算机的内存中分别为了一个内含12个元素的数组(每个元素对应一个字符,还加上一个末尾的空字符‘\0’),每个元素被初始化为字符串字面量对应的字符。

通常,字符串都作为可执行文件的一部分存储在数据段中。当把程序载入内存时,也载入了程序中的字符串。

字符串存储在静态存储区中,但是,程序在开始运行时才会为该数组分配内存,然后猜把字符串拷贝到数组中。注意此时字符串有两个副本。一个时在静态内存中的字符串字面量,另一个时存储在ch数组中的字符串。

演示代码:

#include <stdio.h>

#define CHAR "hello world"



int main()

{

char ch[] = CHAR;

printf("CHAR 地址: %p\n\"hello world\"地址: %p\nch 地址: %p\n", CHAR,"hello world", ch);

return 0;

}

明示常量CHAR,“hello world”和字符串数组的内容都是一样,但首元素地址是完全不同的,这也说明了ch存储的是"hello world"的副本。

3.指针存储字符串

指针形式,Char * ch = "hello world"也时得编译器为字符串在静态存储区预留12个元素得数组。另外,一旦开始执行程序,它会为指针变量ch留出一个存储位置,并把字符串得地址存储在指针变量中。该变量最初指向该字符串得首字符。

演示代码:
#include <stdio.h>

#define CHAR "hello world"



int main()

{

char* p = CHAR;

printf("CHAR 地址: %p\np存储的地址: %p\nhello world字符串地址: %p", CHAR, p,"hello world");

return 0;

}

明示常量CHAR,“hello world”和指针P的内容都是一样,同时三者的首元素地址也都是相同的。

二.数组和指针的区别

1.常量和变量

Char ch1[]="hello world"

Char * ch2 = "hello world"

首先我们要理清一个逻辑,数组名就是首元素的地址,这就意味着数组名是一个常量,如果我们对这个常量进行的更改,那么我们将无法在访问到这个字符串副本了。而指针属于变量,对于对于变量,指针所指向的地址是可以改变的

演示代码:
#include <stdio.h>

#define CHAR "hello world"



int main()

{

char ch[] = CHAR;

char* p = CHAR;

printf("ch首元素地址: %p 字符串值: %s\np首元素地址: %p 字符串值: %s\n", ch, ch, p, p);

p++;

ch++;

}

这里其实我想演示下,但编译器已经报警,不让这样操作。

2.修改成本

因为指针指向字符串存储位置,所以该变一处就会直接影响字符串内容,所以一般推荐用

 const Char * ch2 = "hello world" 保证字符串内容不会被改变

但数组因为存储的字符串副本,所以可以随意更改

这里其实我想修改指针,但编译器已经报警,不让这样操作。

所以这里我演示修改了数组ch,可以发现程序没有报警。

3.存储成本

因为数组存储的是副本,这就意味着它所需要的存储空间是个完整的字符串大小。但指针因为只存储字符串的首元素地址,所以它一般只占用8个字节(或4个字节)

演示代码:
#include <stdio.h>

#define CHAR "hello world"



int main()

{

char ch[] = CHAR;

char* p = CHAR;

printf("ch字符串: %s ch大小: %zd\n指针p字符串: %s p大小: %zd\n\

 明示变量CHAR字符串: %s CHAR大小: %zd\n", ch,sizeof(ch), p,sizeof(p), CHAR,sizeof(CHAR));

return 0;

}

所以根据上面三个区别,如果想要修改字符串内容,用数组。如果想要降低存储大小,就用指针


好了朋友们我们今天的内容到这就结束了,今天的内容到这里就结束了,如果有啥不会的朋友记得论坛里面提问哈~

如果朋友你感觉文章的内容对你有帮助,可以点赞关注文章和专栏以及关注我哈,嘿嘿嘿我会定期更新文章的,谢谢朋友你的支持哈

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

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

相关文章

RabbitMQ工作模式

目录1.Work queues工作队列模式1.1 模式说明1.2 代码1.3 测试1.4 小结2.订阅模式类型3.Publish/Subscribe发布与订阅模式3.1 模式说明3.2 代码3.3 测试3.4 小结4.Routing路由模式4.1 模式说明4.2 代码4.3 测试4.4 小结5.Topics通配符模式5.1 模式说明5.2 代码5.3 测试5.4 小结6…

使用crontab执行定时任务

本来这个东西是挺简单的&#xff0c;是我脑子一直没转过来弯&#xff0c;我就想看看有多少人跟我一样&#x1f60f; crontab语法自己去菜鸟教程看看就知道了&#xff0c;没什么难度 需求&#xff1a;每分钟定时执行一个PHP文件或者一个PHP命令 这是需要执行的文件&#xff0…

《Redis实战篇》七、Redis消息队列

7.1 Redis消息队列-认识消息队列 什么是消息队列&#xff1a;字面意思就是存放消息的队列。最简单的消息队列模型包括3个角色&#xff1a; 消息队列&#xff1a;存储和管理消息&#xff0c;也被称为消息代理&#xff08;Message Broker&#xff09;生产者&#xff1a;发送消息…

JAVA锁相关的概念和分类

JAVA对象和对象头 java中object对象一般由对象头、示例数据、填充字节三部分组成其中填充字节是为了补全对象大小为8bit的倍数而存在&#xff0c;没太多功能性要求对象头包括mark word和class point class point存放的是指向堆中数据类型的指针mark word是存储了许多和当前对象…

Linux配置和使用Git

本文已收录至《Linux知识与编程》专栏&#xff01; 作者&#xff1a;ARMCSKGT 演示环境&#xff1a;CentOS 7 ​ 目录 前言 正文 注册Giett构建仓库 注册giett 构建仓库 Linux配置Git 下载Git 配置Git用户名 配置Git账户邮箱 验证是否初始化成功 生成授权证书 获…

重新认识 React Hooks useContext

通常来说,React 数据的传递方式都是一层一层把资料 props 传到子层的 就算第二层(Function Component)、第三层(Button Group Compontn) 根本没有用到这个资料,但是为了传到最底层(button) ,每一层还是必须要传props // App.js const App = () => {const [dark, setDark…

vue3:加载本地图片等静态资源

背景 在我们用 vue2 webpack 的时候&#xff0c;加载图片资源是这样用的&#xff1a; <img :src"require(/assets/test.png)" />这样打包后就会触发 file-loader 打包图片资源&#xff0c;在 dist 文件夹中就可以看到这个图片&#xff08;如果图片较小会打包…

Vue3+vite4使用mockjs进行模拟开发遇到的坑

Vue3vite4使用mockjs进行模拟开发遇到的坑 最近没那么忙了&#xff0c;就想着自己写一个后台管理系统的小demo。刚好最近把Vue3的文档撸了一遍&#xff0c;正好可以顺便练习一下Vue3ts。 插件 1、mockjs是必不可少的。 2、vite-plugin-mock。由于现在创建Vue3项目默认都使用vit…

Django框架之配置信息

静态文件 项目中的CSS、图片、js都是静态文件。一般会将静态文件放到一个单独的目录中&#xff0c;以方便管理。在html页面中调用时&#xff0c;也需要指定静态文件的路径&#xff0c;Django中提供了一种解析的方式配置静态文件路径。静态文件可以放在项目根目录下&#xff0c…

2023年,pmp项目管理师证书有用么?难考吗?

一、这个证书含金量高么&#xff1f; 是高的&#xff0c;在项目管理或者管理领域中&#xff0c;知名度和含金量都是在前列的。看项目岗位要求&#xff1a;“PMP证书优先”&#xff0c;“”具备项目管理资质&#xff08;PMP&#xff09;优先“。 且在行业内几乎是共识了&#…

2023最新软件测试八股文,能不能拿Offer就看你背得怎样了

前言鉴于目前测试就业越来越严峻&#xff0c;内卷也成了测试领域的代名词了。我的一个HR朋友告诉我&#xff0c;由于门槛较低&#xff0c;现在普通测试岗&#xff08;偏功能&#xff09;的投递比已经将近100&#xff0c;也就是一个岗位差不多有百分简历投进来。 所以现在还想从…

【机器学习】lightGBM是什么?

梯度提升法(Gradient Boosting Machine&#xff0c;简记 GBM)以非参数方法&#xff08;不假设函数形式&#xff09;估计基函数&#xff0c;并在“函数空间”使用“梯度下降”进行近似求解。非参数方法包括K近邻法、决策树、以及基于决策树的装袋法、随机森林与提升法等。 01 梯…

MySQL-Innodb引擎事务原理

文章目录1.事务介绍2 事务特性3. 事务的实现原理4 redo log 保证持久性5 undo log 保证原子性6 MVCC 概念6.1 隐藏字段6.2 版本链6.3 ReadView6.3.1readview 版本控制规则7 隔离性 实现7.2 隔离性- REPEATABLE READ 可重复读下8 一致性1.事务介绍 事务是一组操作的集合&#xf…

Vue (4)

文章目录1. 绑定样式1.1 绑定 class 样式1.2 绑定 style 样式2. 条件渲染2.1 v-show2.2 v-if3. 列表渲染3.1 v-for3.2 key 的作用与原理3.3 列表过滤3.4 列表排序1. 绑定样式 说 绑定样式 前&#xff0c;先准备好 以下几个 样式 : <style>.basic {width: 400px;height: 1…

四数之和(详细题解:双指针+排序)

18. 四数之和 难度中等1502 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#x…

Java 魔法类 Unsafe 详解

阅读过 JUC 源码的同学&#xff0c;一定会发现很多并发工具类都调用了一个叫做 Unsafe的类。 那这个类主要是用来干什么的呢&#xff1f;有什么使用场景呢&#xff1f;这篇文章就带你搞清楚&#xff01; Unsafe 介绍 Unsafe 是位于 sun.misc 包下的一个类&#xff0c;主要提…

要发计算机SCI论文,参考文献应该怎么引用? - 易智编译EaseEditing

SCI论文发表中经常被引用的参考文献主要有以下四种。 一是关于具体的实验的方法&#xff0c;二是支持性或者有冲突的证据&#xff0c;三是比较有用的类似的文献&#xff0c;四是有历史背景的和有意义的文献。 其实归根到底&#xff0c;你引用的SCI的参考文献必须对你的论文发表…

031_SSS_Imagic Text-Based Real Image Editing with Diffusion Models

Imagic: Text-Based Real Image Editing with Diffusion Models 1. Introduction 本文提出了一种新的基于Diffusion的方法称作Imagic&#xff0c;可以实现复杂的基于文本的图像编辑。与之前的方法不同&#xff0c;本文的方法只需要一张输入图像和一个目标文本&#xff0c;并且…

线程私有变量ThreadLocal详解

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 烈火试真金&#xff0c;逆境试强者。——塞内加 文章目录什么是ThreadLocalThreadLocal 原理set()方法get()方法remove()方法ThreadLocal 的Hash算法ThreadLocal 1.7和1.8的区别ThreadLocal 的问题ThreadLoca…

StarRocks获评「2022 中国开源社区健康案例」!

近日&#xff0c;OSCHINA 2022年度中国开源项目评选结果正式揭晓&#xff0c;StarRocks开源社区成功入选 OSCHINA “2022中国开源社区健康案例”&#xff01;开源社区健康指的是围绕一个开源项目形成的社区中关于项目的技术迭代、社区的组织架构、成员构成、开源治理、上下游协…