数据结构const char *INSTNAME[]

news2024/9/25 22:40:10
  • 代码片段解析
#include <cstring>
#include <fstream>
#include <sstream>
#include <string>


const char *INSTNAME[]{
    "lui",  "auipc", "jal",   "jalr",  "beq",   "bne",  "blt",  "bge",  "bltu",
    "bgeu", "lb",    "lh",    "lw",    "ld",    "lbu",  "lhu",  "sb",   "sh"
};

int main(int argc, char **argv) {

  const char *instruction = INSTNAME[0]; // 获取第一个指令 "lui"
  printf("%s\n", instruction); // 输出: lui

  for (int i = 0; i < sizeof(INSTNAME) / sizeof(INSTNAME[0]); i++) 
  {
    printf("%s\n", INSTNAME[i]);
  }

  int index = 10; // 假设我们想访问 "lb"
  printf("Instruction at index %d: %s\n", index, INSTNAME[index]); // 输出: lb
  
  return 0;
}

这段代码定义了一个字符串数组 INSTNAME,包含 RISC-V 指令的名称。每个字符串代表一条指令,数组的每个元素都是一个 C 风格的字符串。

含义

  • const char *INSTNAME[]:定义了一个常量字符指针数组,数组中的每个元素都是指向一个字符串(即指令名称)的指针。
  • 数组中的每个元素代表 RISC-V 指令集中的一条指令,例如:
    • "lui""auipc""jal" 等。

访问字符指针

你可以通过数组下标来访问数组中的元素。每个元素是一个指向字符串的指针,下面是一些示例:

  1. 访问单个指令名称

    const char *instruction = INSTNAME[0]; // 获取第一个指令 "lui"
    printf("%s\n", instruction); // 输出: lui
    
  2. 遍历数组并输出所有指令名称

    for (int i = 0; i < sizeof(INSTNAME) / sizeof(INSTNAME[0]); i++) {
        printf("%s\n", INSTNAME[i]);
    }
    
  3. 根据指令索引获取指令名称

    int index = 10; // 假设我们想访问 "lb"
    printf("Instruction at index %d: %s\n", index, INSTNAME[index]); // 输出: lb
    

注意事项

  • 数组的索引从 0 开始,因此 INSTNAME[0] 是第一个指令,而 INSTNAME[1] 是第二个指令,以此类推。
  • 如果你想要获取指令的数量,可以使用 sizeof(INSTNAME) / sizeof(INSTNAME[0]) 来计算数组的长度。

const char *INSTNAME[] 是一个用于存储指令名称的字符串数组。这个数组的每个元素都是一个指向字符常量的指针,即每个元素都是一个 C 字符串(以 const char* 表示)。这里是对这个数据结构的形象解释:

  1. 数组类型const char *INSTNAME[] 是一个由指向 const char 类型的指针组成的数组。这意味着这个数组的每个元素都是一个指针,这些指针指向以空字符结尾的字符串。

  2. 用途:这个数组用来存储一组字符串,每个字符串代表一个指令的名称,比如 “lui”、“jal”、“add” 等。通常,这样的结构用于指令集架构中的指令名称列表,这在汇编器、模拟器或者编译器中是常见的,用于识别和处理相应的指令。

  3. 数组大小:数组的大小由初始化时提供的字符串个数决定。在这个例子中,数组包含 55 个指令名称。每个指令名称是一个字符串,例如 “lui”、“auipc” 等。

  4. 元素的访问方式:可以通过索引来访问数组中的元素,例如 INSTNAME[0] 会得到字符串 “lui”。这些字符串可以用在程序中进行查找、匹配、显示等操作。

  5. 不可变字符串:由于使用的是 const char*,指向的字符串是不可修改的,这意味着这些字符串的内容在程序运行时是只读的,防止了无意中修改指令名称的可能性。

形象理解:

可以把 const char *INSTNAME[] 看作是一个书架(数组),上面摆满了一排排小书签(指针),每个书签指向一本书(字符串)。每本书上都写着一个特定的指令名称,这些指令名称用来告诉计算机该做什么样的运算或操作。这个书架上共有 55 本这样的书,每一本都对某种操作进行了定义。

取出元素

const char *INSTNAME[] 这个数据结构中,INSTNAME 是一个指针数组,其中每个元素是一个指向字符串的指针。以下是对 INSTNAME[0]*INSTNAME[0] 的详细解释:

  1. INSTNAME[0] 的含义:

    • INSTNAME[0] 是数组 INSTNAME 的第一个元素。
    • 由于 INSTNAME 是一个指针数组,所以 INSTNAME[0] 是一个指针,指向第一个字符串(例如 "lui")。
    • 具体来说,INSTNAME[0] 返回的是这个字符串的首地址,即指向字符串 "lui" 的指针。
  2. *INSTNAME[0] 的含义:

    • *INSTNAME[0] 是对 INSTNAME[0] 的解引用操作。
    • 因为 INSTNAME[0] 是一个指向字符串的指针,所以 *INSTNAME[0] 表示取出该指针指向的字符串的第一个字符。
    • 例如,如果 INSTNAME[0] 指向字符串 "lui",那么 *INSTNAME[0] 就是 'l',即字符串的第一个字符。

为什么 INSTNAME[0] 取出的是第一个元素?

  • INSTNAME[0] 表示数组的第一个指针元素,而不是字符串的内容。它取出的是指向字符串的指针,而不是字符串本身的字符内容。

总结

  • INSTNAME[0] 是指向字符串的指针,是数组中第一个元素。
  • *INSTNAME[0] 是对这个指针的解引用操作,得到的是这个字符串的第一个字符。

占据空间分析,我理解是,在指针数组中每个指针(标签)占据空间是相同的

const char *INSTNAME[] 数组中,"or""and" 实际上在内存中占据的空间是不一样的,虽然它们作为指针在数组中表现类似。以下是更详细的解释:

内存占用的分析

  1. 数组元素的存储

    • INSTNAME 是一个指针数组,每个元素都是一个指向字符串的指针。
    • 这些指针指向的字符串是存储在程序的数据段或常量区的,只读内存中,并不是在数组本身内部存储字符串。
  2. "or""and" 在内存中的实际存储

    • "or" 由 3 个字节组成:'o''r' 和字符串的结束符 '\0',总共占用 3 个字节的空间。
    • "and" 由 4 个字节组成:'a''n''d' 和字符串的结束符 '\0',总共占用 4 个字节的空间。
  3. 指针的占用情况

    • INSTNAME[] 数组中,每个元素是一个指针(例如 INSTNAME[37] 指向 "or"INSTNAME[38] 指向 "and"),在典型的 32 位系统中,每个指针占用 4 个字节,在 64 位系统中,每个指针占用 8 个字节。
    • 指针本身所占的空间是固定的,但指向的字符串占据的空间是根据字符串的长度而不同的。

总结

  • 在内存中,"or" 占用 3 个字节,而 "and" 占用 4 个字节。
  • INSTNAME 数组中存储的是指针,指针所占的空间相同,但指针所指向的字符串的长度不同,因此它们在实际内存中的占用空间不一样。

可以用以下代码简单解释一下

  printf("sizeof(INSTNAME):  %d\n", sizeof(INSTNAME));
  printf("sizeof(INSTNAME[0]):  %d\n", sizeof(INSTNAME[0]));
  printf("sizeof(INSTNAME[1]):  %d\n", sizeof(INSTNAME[1]));
// 输出结果
sizeof(INSTNAME):  432
sizeof(INSTNAME[0]):  8
sizeof(INSTNAME[1]):  8
// 循环内添加代码可以打印指针值
printf("%p\n", INSTNAME[i]);
// 截取一部分,可以看出基本是连续存储的
div
0x55f945f080bc
rem 
0x55f945f080c0
lwu  // 占据4个空格,c4-c0=4
0x55f945f080c4
slliw
0x55f945f080c8
srliw // 占据6个空格,ce-c8=6
0x55f945f080ce

这是一个形象化的插图,展示了 const char *INSTNAME[] 数据结构的概念。图中使用书架和书籍的比喻,每本书代表一个指令名称,而书签代表指向这些名称的指针,帮助更好地理解这个编程结构。希望这个图能帮助你更直观地理解这个数据结构的运作方式!

在这里插入图片描述

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

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

相关文章

从理论到实践:解锁《数字化专业知识体系》助力企业数字化转型的落地之道

全面解码数字化转型——从理论构想到实践落地 在全球数字化浪潮的推动下&#xff0c;企业正面临前所未有的变革压力。虽然数字化转型的概念已经深入人心&#xff0c;但将其从战略蓝图转化为实际成果的过程仍充满挑战。《数字化专业知识体系》&#xff08;《Towards a Digital …

双目视觉路线,为什么一直没有存在感

“在大疆之前没有人做双目&#xff0c;现在基本上主流的都是单目加多传感器融合&#xff0c;推给车企的时候就会经历一个更长的过程。”一位前大疆车载员工曾这样向雷峰网《新智驾》表示。 双目视觉方案在车载上的应用起起伏伏&#xff0c;从早期的高端车型专属&#xff0c;到…

快手B端商业化技术探索:基于LLM构建智能RAG与Agent平台

导读&#xff1a;大模型技术正以前所未有的速度与各领域融合&#xff0c;为各行各业带来变革&#xff0c;围绕快手B端商业化的业务场景&#xff0c;本文详细阐述了构建基于LLM的Agent技术平台的策略、挑战及解决方案&#xff0c;为您带来宝贵的见解与启示。 一、大模型应用建设…

一日连发两款视频大模型,火山引擎杀疯了!

9月24日&#xff0c;字节跳动旗下火山引擎在深圳举办AI创新巡展&#xff0c;并首次对外发布豆包视频生成-PixelDance、豆包视频生成-Seaweed两款AI大模型&#xff0c;并公布了多项AI大模型的全新升级&#xff0c;以一种全新的姿态迎接AI时代的到来。 雷科技此次受邀参与巡展&a…

机器学习算法与Python实战 | 三万字详解!GPT-5:你需要知道的一切(上)建议收藏!

本文来源公众号“机器学习算法与Python实战”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;三万字详解&#xff01;GPT-5&#xff1a;你需要知道的一切 作者&#xff1a;Alberto Romero &#xff08;青稞AI整理&#xff09; 原…

2024杭电多校7——1007创作乐曲

补题链接 也是好久没补题了&#xff0c;欠了好多好多,我的评价是加训 题目如下: 官方题解: 官方题解一如既往的简洁&#xff0c; 对于不会做的人要读懂真的挺难 \sout{对于不会做的人要读懂真的挺难} 对于不会做的人要读懂真的挺难 首先询问最少删除多少音符(一般人来说不…

【教学类-52-14】20240925动物数独(N宫格通用版)1图、2图、6图、有答案、无答案 组合版18套

背景需求&#xff1a; 制作了3-5宫格&#xff08;1、2、6图&#xff09;样式18组&#xff0c;它们用的都是&#xff08;1、2、6图&#xff09;的word模板&#xff0c;只是宫格数量不同&#xff0c;图片插入大小不同&#xff0c;是否可以做一个通用代码&#xff1f; 【教学类-…

C#算法(16)—获取上升沿和下降沿信号

前言 我们在上位机软件开发的时候有时候需要抓取一个信号的上升沿或者下降沿,这时候就需要我们自己编写程序来实现抓取上升沿和下降沿的功能,详细内容如下: 一个信号从“无”到“有”,然后再从“有”到“无”,经历的过程如下:无-上升沿-有-下降沿-无,这样5个过程。 1…

基于微信小程序的电影院订票选座系统ssm(lw+演示+源码+运行)

摘 要 通过移动互联网这几年的发展&#xff0c;单独的开发某些APP已经到了日暮西山的地步&#xff0c;原因不在于单个的APP功能丰富与否&#xff0c;而是因为用户生态体系的问题。使用智能手机的用户经过多年的使用习惯&#xff0c;已经越来越不喜欢安装各种的APP&#xff0c;…

mysql 05 InnoDB数据页结构

01.数据页结构的快速浏览 02.记录在页中的存储 在页的7个组成部分中&#xff0c;我们自己存储的记录会按照我们指定的 行格式 存储到 User Records 部分。但是在一开始生成页的时候&#xff0c;其实并没有 User Records 这个部分&#xff0c;每当我们插入一条记录&#xff0c…

建立队列,插入队列,删除队列

代码&#xff1a; #include<iostream> using namespace std; template<class T> class sq_Queue {private:int mm;int front;int rear;int s;T *q; public:sq_Queue(int);void prt_sq_Queue();int flag_sq_Queue();void ins_sq_Queue(T);T del_sq_Queue(); }; tem…

【线程】自旋锁和读写锁

自旋锁 以前所讲的是挂起等待锁&#xff0c;申请锁成功继续执行&#xff0c;申请失败挂起等待 挂起等待和唤醒是需要时间的&#xff0c;有没有一种锁不会挂起等待呢&#xff1f;那就是自旋锁&#xff0c;申请锁失败它不会挂起&#xff0c;他会轮询&#xff0c;一直让我们的线…

如何给文件设置密级权限查看

一、使用文件加密软件&#xff1a; 选择专业的加密软件&#xff0c;如BitLocker&#xff08;Windows内置&#xff09; 对需要设置密级的文件进行加密&#xff0c;并设置访问密码。 这样&#xff0c;只有拥有正确密码的人才能查看或访问该文件。 二、第三方加密工具&#xff…

《Detection of Tea Leaf Blight in Low-Resolution UAV Remote Sensing Images》论文阅读

学习资料 论文题目&#xff1a;Detection of Tea Leaf Blight in Low-Resolution UAV Remote Sensing Images&#xff08;低分辨率UAV遥感图像中茶叶枯萎病的检测&#xff09;论文地址&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber10345618 Abstr…

这个博览会不一般,丰收的背后故事多!

在金秋送爽、硕果累累的季节里&#xff0c;我们迎来了第七个中国农民丰收节&#xff0c;2024 年 9 月 24日&#xff0c;“中国农民丰收节毕节庆祝活动第三届毕节天麻博览会”在七星关区盛大开幕&#xff0c;一场办在农民心坎上的庆丰收活动精彩上演&#xff01;这是一场属于农民…

手把手教程 | 在 Azure OpenAI 服务上微调 4o 模型

兴奋起来——你现在可以使用 Azure OpenAI 服务微调 4o&#xff01; 我们很高兴地宣布在 Azure 上推出 4o 微调的公开预览版。在成功进行私人预览后&#xff0c;4o 现已可供我们所有的 Azure OpenAI 客户使用&#xff0c;在 Azure OpenAI 服务中提供无与伦比的定制和性能。 …

通信工程学习:什么是ODN光分配网络

ODN&#xff1a;光分配网络 ODN&#xff08;Optical Distribution Network&#xff0c;光分配网络&#xff09;是光接入网中的重要组成部分&#xff0c;它位于光线路终端&#xff08;OLT&#xff09;和光网络单元&#xff08;ONU&#xff09;/光网络终端&#xff08;ONT&#x…

itc保伦股份智慧高校整体解决方案推动教育强国、科技强国、人才强国建设!

党的二十大报告指出&#xff0c;要“统筹职业教育、高等教育、继续教育协同创新&#xff0c;推进职普融通、产教融合、科教融汇&#xff0c;优化职业教育类型定位”。itc积极响应高校人才培养相关政策要求&#xff0c;基于互联网、物联网、大数据、AI等技术&#xff0c;面向老师…

高性价比的电脑桌面记事本便签,好用便签助力工作效率

在快节奏的工作环境中&#xff0c;我们常常需要快速记录下重要的信息和任务。而一款好用的电脑桌面记事本便签工具&#xff0c;可以成为我们提高工作效率的得力助手。在这里&#xff0c;向大家介绍一款高性价比的电脑桌面记事本便签&#xff0c;好用便签&#xff0c;帮助大家更…

100个ChatGPT学术指令—助你高效完成文献综述撰写!

写文献综述是不是让你觉得头大&#xff1f;每次翻了半天资料&#xff0c;脑子还是一片空白&#xff0c;根本不知道从哪儿开始写&#xff1f; 别慌&#xff0c;其实有个简单的套路——用AI&#xff01;没错&#xff0c;只要掌握好提示词&#xff0c;AI能帮你快速理清思路、找到…