c语言之字符串的集合存放形式

采用指针分配的二维数组与直接定义的二维数组,sizeof的不同

采用指针分配的二维数组:

 它的遍历方式是:

上面这个是分配二级指针的地址,二级指针就是一片可以用来分配一级指针空间的地址,然后指针寻址本来就可以当成数组进行处理

这个是对triangle分配了一个一级指针的地址,而一级指针就是一个一维数组,是来存放具体相应数据类型的东西,比如int类型,比如double类型等等

因此这里采用指针的方式来做一个二维数组,我们需要先定义一个二级指针,然后再来定义一级指针,另外需要需要注意的地方就是,二级指针必须分配相应的内存空间,也就是malloc出来相应的类型空间。

这片空间分配多大没有关系,只要是一个二级指针,后面就可以来分配一级指针的空间。

重点:

       1. 用指针做的二维数组来讲,它的sizeof是一个指针大小,一般来讲是8个字节

        2.而用传统方式来做一个二维数组,sizeof出来是整个数组的字节大小,如果sizeof出来的是一个列数组,那么就是整列的字节大小

下面是针对某些情况的特例分析:

        1.一个一级指针要当成数组处理,比如说赋值啥的,就必须给这个一级指针malloc相应大小的内存空间

说一些可能会造成错误的情况:

        1.当一级指针当成数组处理,你没有分配足够的空间或者没有对这个变量进行初始化的时候,都有可能会分配成功或者赋值成功,但是它会造成一些潜在的问题,所以这里强烈建议就是:如果我们要用一级指针来当成数组赋值,必须给这个一级指针分配到足够大的空间。同样这个对于二级指针赋值同样适用

遍历方式 

目前来讲没有更加灵活的遍历方式,采用下面的方式进行遍历

这种方式是打印相对规则的二维数组有效,不规则的二维数组采用for循环的还是打印不出来的。

因为sizeof算不出来行数也算不出来列数,它能sizeof出来的就只有指针的大小,一般指针就是8个字节,你malloc这片空间不管多大都是8个字节的大小。

上面只是我们定义二维数组的一个特例,一般来讲定义一个二维数组要符合规范,每一行要有相同的数据分布

比如这样像如下这样定义

当我们需要存储很多字符串的时候,优先考虑采用什么样的方式存储

采用二级指针的方式存储还是采用二维数组的方式存储

strcpy与直接赋值字符串的使用场景

一般数组只能在初始化的时候进行字符串的赋值 ,下面这种场景都是会报错的

上面基本上都会提示赋值不兼容

根本原因就是:

    不能改变数组指向的内存位置,还有一点需要注意的是也不能使用赋值运算符为整个数组重新分配新的值 

正确的初始化字符串的方法是:

  

他们的赋值原理是:

        他们并不是改变了数组的内存指向,而是把常量区的字符串内容给赋值过来放到数组指向的空间里面。“这样的定义的字符串内容是放到常量区的不会不知道吧”,而这种字符串赋值操作只会是存在第一次初始化数组的时候

那么这个时候问题来了,没有在第一次初始化的时候赋值字符串,那么又该如何操作呢?

这个时候strcpy就上场了,它的核心就是把常量区的字符串内容赋值到数值里面。

所以,如果没有第一次初始化字符串给数组,我们可以操作

注意引入头文件<string.h>,因为strcpy是包含在里面的。

所以当我们需要存储很多字符串在一个盒子里面的时候,我们可以采用字符数组形式存放。

但是我们必须区分另外一种情况,就是下面这种情况的赋值原理

上面说到用字符串初始化一个数组的时候,会把常量区的内容给拷贝过去,那么这个的赋值原理一样吗?答案是:不一样

这个的赋值原理是直接指向了常量区的空间,然后我们可以把指针当成数组处理,然后进行赋值与查找值

两者对比

利用指针来存放其实没有太多的空间限制,你可以存一个很大的字符串,它在大多数的时候都是不会出错的。

但是采用二维数组来存放,就会有严格的数组空间限制,你超出了一个数组字符串的存放空间,就会出现乱码,比如下面

只能存五个当时你超了。

所以综合分析一下就是:在你对数据长度没有严格要求的时候,我们可以采用字符指针来存数据。但是如果你对数据长度有严格要求的情况下,我们就用二维数组来存放字符串

好了,祝大家早安午安晚安。 

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

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

相关文章

java算法day3

移除链表元素设计链表翻转链表两两交换链表中的结点 移除链表元素 ps&#xff1a;有时候感觉到底要不要写特判&#xff0c;你想到了就写&#xff01;因为一般特判有一劳永逸的作用。 解法有两种&#xff0c;一种是不用虚拟头结点&#xff0c;另一种就是用虚拟头结点。 这里我…

python安装的详细步骤

下载 1.打开Python官网.我们建议工具类的测试软件还是官网下载比较靠谱. https://www.python.org/getit/ 2.在下图界面中选择需要的方式进行点击 3.直接点击下载.可以进入保存界面,进行保存即可下载,后续安装 4.鼠标放在Downloads显示平台和版本选择界面,点击Windows,进入wi…

Spring-dataSource事务案例分析-使用事务嵌套时,一个我们容易忽略的地方

场景如下&#xff1a; A_Bean 中的方法a()中调用B_Bean的b();方法都开启了事务&#xff0c;使用的默认的事务传递机制&#xff08;即&#xff1a;属于同一事务&#xff09;&#xff1b; 如下两种场景会存在较大的差异&#xff1a; 在b()方法中出现了异常&#xff0c;在b()中进…

Unity射击游戏开发教程:(2)实例化和销毁游戏对象

现在我们有了“飞船”,我们可以在屏幕上移动它,现在我们需要发射一些激光!与宇宙飞船一样,我们将让事情变得简单并使用 Unity 自己的基本形状。舱体的效果很好,所以我们来创建一个。 我们保存了有关位置、旋转和缩放的信息。我们想要缩小这个对象,假设每个轴上缩小到 0.2…

【树莓派学习】hello,world!

系统安装及环境配置详见【树莓派学习】系统烧录及VNC连接、文件传输-CSDN博客 树莓派内置python3&#xff0c;可以直接利用python输出。

Jetson nx 外接OLED屏幕

40 针 GPIO 引脚 GPIO引脚可以用作输入或输出端口&#xff0c;它们提供了一个数字电平以使用户在外界设备上进行控制或读取。Jetson TX2 NX共有198个GPIO引脚&#xff0c;分为三个不同的管脚组&#xff1a;J1、J21和J22。每个管脚组都具有数字输入/输出和PWM功能。 以下是 TX2…

语音转换中的扩散模型——DDDM-VC

DDDM-VC: Decoupled Denoising Diffusion Models with Disentangled Representation and Prior Mixup for Verifed Robust Voice Conversion https://ojs.aaai.org/index.php/AAAI/article/view/29740https://ojs.aaai.org/index.php/AAAI/article/view/29740 1.概述 首先,语…

谷歌Gemini 1.5 Pro国内怎么用?国内镜像来了

长期以来&#xff0c;许多人向我咨询是否存在一个稳定而高效的全球AI大模型测试平台&#xff0c;这个平台需要不仅真实可靠&#xff0c;而且能够提供稳定和快速的服务&#xff0c;不会频繁出现故障或响应缓慢的问题。然而&#xff0c;当我发现了AskManyAI时&#xff0c;我被其所…

ModuleNotFoundError: No module named ‘scripts.animatediff_mm‘ 解决方案

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 本文主要介绍在使用 Stable Diffusion WebUI 安装 AnimateDiff 插件后出现的ModuleNotFoundError: No module named scripts.animatediff_mm异常的解决方案,希望…

初识ansible变量及实例配置

目录 1、为什么要使用变量 2、变量分类 3、 变量详解 3.1 vars,vars_files , group_vars 3.1 .1 vars 剧本中定义变量 3.1.2 vars_file 将变量存放到一个文件中&#xff0c;并在剧本中引用 3.1.3 group_vars 创建一个变量文件给某个组使用 实例1-根据不同的主机…

力扣HOT100 - 19. 删除链表的倒数第N个节点

解题思路&#xff1a; 链表题目&#xff1a;哑节点、栈、快慢指针&#xff08;双指针&#xff09; 方法一&#xff1a;计算链表长度 class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dum new ListNode(0, head);int len getLen(head);…

linux内核初始化成功后是如何过渡到android初始化的

Android用的linux内核&#xff0c;以完成OS该有的功能&#xff0c;例如&#xff0c;文件系统&#xff0c;网络&#xff0c;内存管理&#xff0c;进程调度&#xff0c;驱动等 &#xff0c;向下管理硬件资源向上提供系统调用。另一些Android特有驱动也放在内核之中。 当linux内核…

Java关键字和API

1 this和super关键字 1.this和super的意义 this&#xff1a;当前对象 在构造器和非静态代码块中&#xff0c;表示正在new的对象 在实例方法中&#xff0c;表示调用当前方法的对象 super&#xff1a;引用父类声明的成员 无论是this和super都是和对象有关的。 2.this和sup…

详解数据结构之-「数组篇」

详解数据结构之-「数组篇」 太久没有写算法了&#xff0c;最近在回顾数据结构和算法&#xff0c;准备把这块重新捡起来&#xff0c;给自己立一个flag&#xff0c;每周花时间练习算法&#xff0c;写一篇总结。 数组 数组数据结构&#xff08;英语&#xff1a;array data stru…

Mysql学习2

目录 一.数据库&#xff1a; 1.创建数据库&#xff1a; 2.查看数据库&#xff1a; 3.备份恢复数据库&#xff1a; 二.表 1.创建表指令&#xff1a; 2.MySQL常用数据类型&#xff1a; 3.删除与修改表&#xff08;重点&#xff09;&#xff1a; 4.数据库CRUD语句&#xf…

网络 (TCP/IP 四层协议中常见网络协议)

应用层 DNS (Domain Name System) 域名系统. DNS 是一整套从域名映射到 IP的系统 NAT 技术 解决 IP 地址不够用的问题. 可以实现私有 IP 和全局 IP 的相互转换 NAPT 技术 使用 IP Port 唯一确定局域网中的主机 传输层 TCP 协议 (Transmission Control Protocol 传输控制协议…

C++:范围-based for 循环

范围-based for 循环是 C11 引入的一种循环语法&#xff0c;它简化了遍历容器和数组等序列的操作&#xff0c;使代码更加清晰和简洁。它通常用于遍历容器类&#xff08;如数组、向量、列表等&#xff09;中的元素&#xff0c;或者以范围的形式遍历初始化列表。 范围-based for …

AI大模型探索之路-实战篇1:基于OpenAI智能翻译助手实战落地

文章目录 前言一、需求规格描述二、系统架构设计三、技术实施方案四、核心功能说明五、开源技术选型六、代码实现细节1.图形用户界面&#xff08;GUI&#xff09;的开发2.大型模型调用的模块化封装3.文档解析翻译结果处理 总结 前言 在全球化的浪潮中&#xff0c;语言翻译需求…

HarmonyOS NEXT 使用Canvas实现模拟时钟案例

介绍 本示例介绍利用 Canvas 和定时器实现模拟时钟场景&#xff0c;该案例多用于用户需要显示自定义模拟时钟的场景。 效果图预览 使用说明 无需任何操作&#xff0c;进入本案例页面后&#xff0c;所见即模拟时钟的展示。 使用说明 无需任何操作&#xff0c;进入本案例页…

20240330-2-XGBoost面试题

XGBoost面试题 1. RF和GBDT的区别 相同点&#xff1a; 都是由多棵树组成&#xff0c;最终的结果都是由多棵树一起决定。 不同点&#xff1a; 集成学习&#xff1a; R F RF RF属于 B a g g i n g Bagging Bagging思想&#xff0c;而 G B D T GBDT GBDT是 B o o s t i n g Bo…