C++ 数组、指针、数组指针、指针数组、多级指针、STL-map、结构体 的 初始化 及其 初始化赋值

news/2024/5/18 14:33:39/文章来源:https://blog.csdn.net/zsssss333/article/details/130123422

C++ 数组、指针、数组指针、指针数组、多级指针、STL-map、结构体 的 初始化 及其 初始化赋值

  • C++ 数组、指针、数组指针、指针数组、多级指针、STL-map、结构体 的 初始化 及其 初始化赋值
    • C++ 数组、指针、数组指针、指针数组、多级指针
      • 数组
        • 一维数组初始化:
        • 二维数组初始化:
          • 运算表达式 的 优先级 + 结合律
          • 数组 【指针】: 不要使用,这一意味着你的【指针】指向的是一片连续的空间【数组】,即指向静态数组
          • 指向int的 指针【数组】
          • 指向字符的 指针【数组】
          • 内存图
          • 几种写法:初始化、new
            • 内存图
            • 错误提示:
        • 多维数组初始化:
    • C++ 初始化赋值
      • 数组:一维数组、二维数组、
      • STL——map
      • 结构体

C++ 数组、指针、数组指针、指针数组、多级指针、STL-map、结构体 的 初始化 及其 初始化赋值

C++ 数组、指针、数组指针、指针数组、多级指针

数组

一维数组初始化:

T arr[] = { 1, 2, 2 };
A* array_p = new A[5];int *pia = new int[10]; // 每个元素都没有初始化
int *pia2 = new int[10] (); // 每个元素初始化为0int value[100]; // value[i]的值【不定】,没有初始化
int value[100] = {1,2}; 
// value[0]和value[1]的值分别为1和2,
// 而没有定义的value[i>1],则【初始化为0】int* value = new int[n]; // 未初始化delete []value; // 一定不能忘了删除数组空间

二维数组初始化:

运算表达式 的 优先级 + 结合律

从右至左,表示先算右边,再算左边。
[]优先级最高,先 a[]

  • 优先级第二稿,后 *a[] === *(a[])
    在这里插入图片描述
数组 【指针】: 不要使用,这一意味着你的【指针】指向的是一片连续的空间【数组】,即指向静态数组
#include <stdio.h>
#include <stdlib.h>
int main()
{int a[3][4] = { { 0, 1, 2, 3 },{ 4, 5, 6, 7 },{ 8, 9, 10, 11 } };int(*p)[4]; // 指向静态数组p = a; // 指向静态数组printf("%d,%d,%d,%d\n", sizeof(*(p)),sizeof(*(p + 1)),sizeof(*(p + 2)),sizeof(*(p + 3)));printf("%d\n", **p);//a[0][0]printf("%d\n", *(*(p + 1)));//a[1][0]system("pause");return 0;

在这里插入图片描述

在这里插入图片描述

指向int的 指针【数组】

想要让【数组】存储【指向 int 或 char 或其他数据类型的指针】

#include <iostream>using namespace std;
const int MAX = 3;int main ()
{int  var[MAX] = {10, 100, 200};int *ptr[MAX];结合:  int * (ptr[MAX]);  首先是一个数组for (int i = 0; i < MAX; i++){ptr[i] = &var[i]; // 赋值为整数的地址}for (int i = 0; i < MAX; i++){cout << "Value of var[" << i << "] = ";cout << *ptr[i] << endl;}return 0;
}
--------------------------------------------------
Value of var[0] = 10
Value of var[1] = 100
Value of var[2] = 200
指向字符的 指针【数组】

想要让【数组】存储【指向 int 或 char 或其他数据类型的指针】

#include <iostream>using namespace std;
const int MAX = 4;int main ()
{
结合: const char* (names[MAX])  首先是一个数组const char *names[MAX] = {"Zara Ali","Hina Ali","Nuha Ali","Sara Ali",};for (int i = 0; i < MAX; i++){cout << "Value of names[" << i << "] = ";cout << names[i] << endl;}return 0;
}
----------------------------------
Value of names[0] = Zara Ali
Value of names[1] = Hina Ali
Value of names[2] = Nuha Ali
Value of names[3] = Sara Ali
内存图
	int (*a)[10];    //*a = int[10],一个指向  【包含10个整数元素【数组】】的  【指针】,是一个指针,内容是一个地址,地址处是连续10int,即地址处是int[10]想要让【数组】存储【指向 intchar 或其他数据类型的指针】指向整数的指针数组int* a[10];   int *a[10];    //a = int*[10], 一个有10个  【指向整数的指针】元素的  【数组】,是一个数组,内容是int*数组,

第一行代码:int* a[10];
它表示一个包含10个元素的【数组a】,每个【元素】都是指向int类型数据的【指针】。
对应的内存结构如下:

                           |--------------|
a[0]  --->  |              |      int     ||--------------|
a[1]  --->  |              |      int     ||--------------|
a[2]  --->  |              |      int     ||--------------||        .             .           .|        .             .           .|        .             .           .|--------------| 
a[9]  --->  |              |      int     ||--------------|    

第二行代码:int (*a)[10];
它表示一个指向 一个包含10个整数的int类型数组 的【指针a】。
对应的内存结构如下:

                  |--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|a  --->      |       [0]    |       [1]    |       [2]    |       [3]    |       [4]    |       [5]    |       [6]    |       [7]    |       [8]    |       [9]    ||--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------||      int     |     int      |     int      |    int       |     int      |     int      |     int      |     int      |     int      |     int      ||--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|

在这里插入图片描述
在这里插入图片描述

几种写法:初始化、new
内存图

new int [m][n] 连续分配mn
new int
[m] 分散的int*数组,一共m个
在这里插入图片描述

int value[9][9]; // value[i][j]的值不定,没有初始化
int value[9][9] = {{1,1},{2}}//value[0][0,1]和value[1][0]的值初始化,其他初始化为0指针方式一:int (*value)[n] = new int[m][n];delete []value; // n必须为【常量】,只有【第一个】m可以不为常数,调用直观。未初始化
指针方式二:创建newint** value = new int* [m];for(i) value[i] = new int[n];删除deletefor(i) delete []value[i];delete []value; // 多次析构,存储麻烦,未初始化
指针方式三: 错误写法,新版本C++会报错,new出来的**int不可以直接转换成int*,有风险
int * value = new int[3][4]; // 数组的存储是按行存储的,一次性分配连续空间,3*4=12
delete []value; // 一定要进行内存释放,否则会造成内存泄露指针形式:如二维数组的访问:value[i][j]*(value[i] + j)(*(value + i))[j]
错误提示:

在这里插入图片描述
在这里插入图片描述

多维数组初始化:

指针方式: 
int * value = new int[m][3][4]; // 只有第一维可以是变量,其他几维必须都是常量,否则会报错
delete []value; // 一定要进行内存释放,否则会造成内存泄露

C++ 初始化赋值

数组:一维数组、二维数组、

T arr[] = { 1, 2, 2 };
A* array_p = new A[5];int *pia = new int[10]; // 每个元素都没有初始化
int *pia2 = new int[10] (); // 每个元素初始化为0int value[100]; // value[i]的值【不定】,没有初始化
int value[100] = {1,2}; 
// value[0]和value[1]的值分别为1和2,
// 而没有定义的value[i>1],则【初始化为0】int* value = new int[n]; // 未初始化字符串的长度未知,只需要告诉是个const char*就可以了
const char names[MAX][。。。] = {
const char *(names[MAX]) = { 等价写法
const char *names[MAX] = {"Zara Ali","Hina Ali","Nuha Ali","Sara Ali",
};

STL——map

在 Script.h 定义类,静态成员属性 static RSL_KEY_WORD getEnum(const string sKey);
/// @brief 关键字管理类
/**
*  @author      赵雨腾(zyt1850298154@qq.com)
*  @date        2021/12/16 16:58
*  @class       Key
*  @brief       关键字管理类,预先映射,加速匹配
*  @note        无
*/
class Key {
public:/// @brief 关键字idenum RSL_KEY_WORD {KEY_step,				///< 完整表示一个步骤的所有行为KEY_STD_FUNC_Speak,		///< 计算表达式合成一段文字,调用媒体服务器进行语音合成并播放KEY_STD_FUNC_Listen,	///< 进行语音识别,语音识别的结果调用“自然语言分析服务”分析客户的意愿KEY_STD_FUNC_Branch,	///< 对客户的意愿进行分支处理,不同的意愿,跳转到不同的StepKEY_STD_FUNC_Silence,	///< 如果用户不说话,应该跳转到哪个StepKEY_STD_FUNC_Default,	///< 如果客户意愿没有相应匹配,应该跳转到哪个StepKEY_STD_FUNC_Exit,		///< 结束对话};
public:/// @brief 从str映射到关键字id,如果没有找到,报错,退出程序/// @param sKey 输入字符串/// @return 字符串对应的 enum RSL_KEY_WORD static RSL_KEY_WORD getEnum(const string sKey);public:/// @brief 关键字str:关键字enum,作用:加速关键词匹配,然后进行分流static map<string, RSL_KEY_WORD> mSK;
};
Script.cpp 中初始化上述的 static map<string, RSL_KEY_WORD> mSK;
map<string, Key::RSL_KEY_WORD> Key::mSK({{"step",	KEY_step},{"Speak",	KEY_STD_FUNC_Speak},{"Listen",	KEY_STD_FUNC_Listen},{"Branch",	KEY_STD_FUNC_Branch},{"Silence",	KEY_STD_FUNC_Silence},{"Default",	KEY_STD_FUNC_Default},{"Exit",	KEY_STD_FUNC_Exit},}
);

结构体

Person p1 = { "aaa", 18, 100 };block  test = {    .type= 1,    .size = 12,    .name= "version" };----------------------------------------------如果要声明结构体数组,这里介绍一种表驱动型写法,利用上述方法+枚举的形式来定义,个人感觉十分优雅。typede struct block { char name[32];     int type;     int size; 
}block;  enum{     ENUM_NAME,    ENUM_TYPE,     ENUM_SIZE,     ENUM_MAX 
};  const block motor[ENUM_MAX] = {    [ENUM_NAME] = {.name = "version", .type = 1, .size = 32},    [ENUM_TYPE] = {.name = "device", .type = 2, .size = 16},    [ENUM_SIZE] = {.name = "firmware", .type = 3, .size = 8}, 
};

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

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

相关文章

算法训练Day30:332.重新安排行程 51. N皇后 37. 解数独

文章目录重新安排行程题解[N 皇后](https://leetcode.cn/problems/n-queens/description/)题解解数独题解重新安排行程 CategoryDifficultyLikesDislikesContestSlugProblemIndexScorealgorithmsHard (47.57%)7650--0 TagsCompanies 给你一份航线列表 tickets &#xff0c;其…

零基础如何入门网络安全?【2023最新】

前言 最近收到不少关注朋友的私信和留言&#xff0c;大多数都是零基础小友入门网络安全&#xff0c;需要相关资源学习。其实看过的铁粉都知道&#xff0c;之前的文里是有过推荐过的。新来的小友可能不太清楚&#xff0c;这里就系统地叙述一遍。 01.简单了解一下网络安全 说白…

【数据结构与算法篇】时间复杂度与空间复杂度

目录 一、数据结构和算法 1.什么是数据结构&#xff1f; 2.什么是算法&#xff1f; 3.数据结构和算法的重要性 二、算法的时间复杂度和空间复杂度 1.算法效率 2.算法的复杂度 3.复杂度在校招中的考察 4.时间复杂度 5.空间复杂度 6.常见复杂度对比 7.复杂度的OJ练…

射频功率放大器在液体超声声强的光电测量中的应用

实验名称&#xff1a;液体中超声声强的光电测量 研究方向&#xff1a;光电测量 测试目的&#xff1a; 声强是描述声场的基本物理量口&#xff0c;超声效应直接与声强有关。例如在工程技术领域&#xff0c;液体中的声场分布直接影响流场分布口&#xff0c;声强的大小影响着超声波…

ChatGPT 学习 ES lucene 底层写入原理,源码

一直有个疑问“学习最新版lucene 数据写入相关的源码&#xff0c;应该看哪些源码&#xff0c;以什么顺序看&#xff08;先看什么&#xff0c;后看什么&#xff09;&#xff1f;” 对于Lucene的数据写入过程&#xff0c;可以分为以下几个阶段 在学习Lucene的数据写入相关的源码…

Nextcloud去掉URL中的index.php以及强制https(Win10子系统WSL)

一、Nextcloud去掉URL中的index.php 1、启用相关模块 cd /var/www/nextcloud #进入程序目录sudo chmod -R 777 .htaccess #设置.htaccess文件权限可读写sudo a2enmod envaudo a2enmod rewrite #启用rewrite模块2、修改nextcloud配置文件 vim /var/www/nextcloud/config/…

<数据结构>NO1.算法的时空复杂度

文章目录&#x1f6a9;算法效率算法复杂度&#x1fa85;时间复杂度大O的渐进表示法常见的时间复杂度举例&#x1fa85;空间复杂度大O的渐进表示法常见的空间复杂度举例&#x1f5ef;️常见复杂度对比&#x1f5ef;️&#x1f6a9;算法效率 算法是一个被设计好的&#xff0c;计…

CentOS7.6 磁盘挂载

CentOS7.6 磁盘挂载 目录CentOS7.6 磁盘挂载1.磁盘说明2.磁盘分区步骤1.磁盘说明 1、Linux硬盘分IDE硬盘和SCSI硬盘&#xff0c;目前基本上是SCSI硬盘 2、对于IDE硬盘&#xff0c;驱动器标识符为"hdx"&#xff0c;""代表分区&#xff0c;前四个分区用数字…

停车场管理系统文件录入(C++版)

❤️作者主页&#xff1a;微凉秋意 ✅作者简介&#xff1a;后端领域优质创作者&#x1f3c6;&#xff0c;CSDN内容合伙人&#x1f3c6;&#xff0c;阿里云专家博主&#x1f3c6; 文章目录一、案例需求描述1.1、汽车信息模块1.2、普通用户模块1.3、管理员用户模块二、案例分析三…

C++中的引用变量详解

文章目录声明及定义代码引用变量的特点图片解释引用变量的本质引用变量的用途int & 和 const int & 的区别引用变量和宏定义&#xff08;#define&#xff09;的区别声明及定义 [const] int& 变量名 右值 注意&#xff1a;[]内的是可选的。即这里的const限定词是可…

香港布局Web3.0 既是金融试探,也是未来战略

香港Web3.0协会成立的消息已在业内刷屏&#xff0c;作为跨业界的非盈利机构&#xff0c;该协会致力于促进Web3.0生态环境的建设&#xff0c;港府特首李家超和北京中央驻港联络办公室部分领导均出席了成立典礼。 李家超在致辞中表示&#xff0c;Web3.0的发展正值黄金起点&#x…

SpringCloud GateWay与Nacos使用

网关就相当于一个内网与外网的出入口&#xff0c;起着 安全、验证的功能&#xff0c;如果没有网关&#xff0c;那么如果需要实现验证的功能&#xff0c;除非 SpringCloud GateWay 作为微服务的网关,起着如下作用 ① 作为所有API接口服务请求的接入点 ② 作为所有后端业务服务…

如何在企业微信中使用低代码工具?

企业微信是一款非常强大的办公应用软件&#xff0c;可以方便地进行企业内部的沟通、协作、管理等工作。虽然企业微信本身并不提供低代码工具&#xff0c;但是可以通过集成第三方的低代码工具来实现在企业微信中的使用。 例如&#xff0c;可以使用低代码平台简道云&#xff0c;…

蓝桥杯之我见

前言 关于蓝桥杯&#xff0c;应该有很多人不知道这是一个什么样的比赛。但是作为一名合格的程序员&#xff0c;就算之前没有参加过蓝桥杯的比赛&#xff0c;或者没听说过蓝桥杯&#xff0c;读完本篇文章再说不知道蓝桥杯&#xff0c;就有点不合适了吧&#xff1f;&#xff01;那…

Linux驱动之LED驱动

之前学习完了字符设备驱动的大体框架&#xff0c;现在我们就使用这个基本的框架来对硬件进行操作&#xff0c;例如通过指令控制led的状态&#xff0c;编写LED驱动。LED驱动有多种实现方式。 目录 GPIO函数 IO内存映射 混杂设备驱动 GPIO函数 首先加入需要的头文件。 #incl…

为一副通用纸牌设计数据结构

为一副通用纸牌设计数据结构 大家好&#xff0c;我是易安&#xff0c;今天我们来聊一道笔试题&#xff0c;这也是我曾经面试华为时做过的题&#xff0c;今天分享给大家。 题目&#xff1a; 如何设计一个通用的扑克牌数据结构&#xff1f;请解释如何继承它来实现特定的扑克游戏…

如何将本地项目上传到Github的方法步骤

默认&#xff1a;已经安装好了git。 第一步&#xff1a;我们需要先创建一个本地的版本库&#xff08;其实也就是一个文件夹&#xff09;。 你可以直接右击新建文件夹&#xff0c;也可以右击打开Git bash命令行窗口通过命令来创建。 第二步&#xff1a;通过命令git init把这个…

【C++】1. 命名空间

文章目录一、命名空间的由来二、命名空间的使用2.1 关键字&#xff1a;namespace2.2 访问命名空间里的标识符2.3 命名空间的特点三、总结一、命名空间的由来 当我们使用c语言编写项目时&#xff0c;可能遇到以下情况&#xff1a; 变量名与某个库函数名重复&#xff0c;导致保…

HTML学习(5)Canvas绘图

文章目录HTML5 CanvasHTML5 内联SVGHTML5 Canvas 使用 Canvas 进行绘图工作&#xff0c;Canvas元素用于在网页上绘制图片。 创建一个Canvas的元素&#xff1a; <canvas id"myCanvas" width"200" height"100"></canvas>但是Canvas…

部署zabbix代理服务器和snmp监控

目录 zabbix代理服务器 分布式监控的作用 部署zabbix代理服务器 在 Web 页面配置 agent 代理 snmp监控 SNMP简介 部署zabbix-snmp 服务端安装snmp监控程序 在 Web 页面配置 snmp 方式监控 zabbix代理服务器 分布式监控的作用 分担 server 的集中式压力 解决多机房之…