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

news2024/11/13 10:03:19

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] (); // 每个元素初始化为0

int 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可以不为常数,调用直观。未初始化
指针方式二:
	创建new
		int** value = new int* [m];
		for(i) value[i] = new int[n];
	删除delete
		for(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] (); // 每个元素初始化为0

int 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 关键字id
	enum RSL_KEY_WORD {
		KEY_step,				///< 完整表示一个步骤的所有行为
		KEY_STD_FUNC_Speak,		///< 计算表达式合成一段文字,调用媒体服务器进行语音合成并播放
		KEY_STD_FUNC_Listen,	///< 进行语音识别,语音识别的结果调用“自然语言分析服务”分析客户的意愿
		KEY_STD_FUNC_Branch,	///< 对客户的意愿进行分支处理,不同的意愿,跳转到不同的Step
		KEY_STD_FUNC_Silence,	///< 如果用户不说话,应该跳转到哪个Step
		KEY_STD_FUNC_Default,	///< 如果客户意愿没有相应匹配,应该跳转到哪个Step
		KEY_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.coloradmin.cn/o/417248.html

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

相关文章

8.1 假设验证的基本概念

学习目标&#xff1a; 要学习假设检验的基本概念&#xff0c;我会按照以下步骤进行&#xff1a; 了解假设检验的基本概念&#xff1a;假设检验是一种统计推断方法&#xff0c;用于判断某个假设是否成立。一般来说&#xff0c;假设检验包括原假设和备择假设两个假设&#xff0c…

语雀笔记备份导出

参考: https://www.cnblogs.com/ssslinppp/p/17020303.htmlhttps://github.com/yuque/yuque-exporterhttps://zhuanlan.zhihu.com/p/582287220https://www.yuque.com/duzh929/blog/ocffqghttps://www.yuque.com/hijiaobu/datalife/onf6sy#BKajf 现在需要超级管理员,若是没有超级…

JDK8新特性 (Lambda表达式和Stream流式编程)

目录 一&#xff1a;JDK8新特性 1. Java SE的发展历史 2. 了解Open JDK 和 Oracle JDK 3. JDK 8新特性 3.1 Lambda表达式&#xff08;重点&#xff09; 3.2 接口的增强 3.3 函数式接口 3.4 方法引用 3.5 集合之Stream流式操作&#xff08;重点&#xff09; 3.6 新的时…

Windows wsl连接网络代理

使用 WSL 访问网络应用程序 | Microsoft Learn 为 WSL2 一键设置代理 - 知乎 (zhihu.com) 介绍 本文介绍开通了Windows WSL子系统之后&#xff0c;怎么在两者之间进行网络通讯&#xff1b;对在windows系统中开启了代理以后&#xff0c;如何在WSL中设置网络代理问题进行了详细…

光萤CEO陈海洲:平台模式将成为户用分布式光伏市场的主流 | 爱分析调研

近两年来&#xff0c;随着国家“双碳”目标的确立&#xff0c;清洁能源迎来重要发展机遇&#xff0c;其中户用分布式光伏因其对土地资源占用少、离用电侧距离近以及与国家乡村振兴战略共振的效果而受到显著的政策倾斜性支持。2020-2022年户用分布式光伏新增装机量持续攀升&…

【C++基础】auto关键字(C++11)(auto的使用细则;auto不能推导的场景;auto的使用场景;基于范围的for循环)

九、auto关键字 9.1 auto简介 在早期C/C(C98)中auto的含义是&#xff1a;使用auto修饰的变量&#xff0c;是具有自动存储器的局部变量&#xff0c;但遗憾的是一直没有人去使用它。因为在函数内定义的变量默认就是局部变量。 C11中&#xff0c;标准委员会赋予了auto全新的含义…

目标检测基础之IOU计算

目标检测基础之IOU计算概念理解——什么是IOUdemo后记概念理解——什么是IOU IOU 交并比&#xff08;Intersection over Union&#xff09;&#xff0c;从字面上很容易理解&#xff1a;计算交集在并集的比重。从网上截张图看看 IOUA∩BA∪BIOU \frac{A \cap B}{A \cup B} IO…

【Java版oj】day32淘宝网店、斐波那契凤尾

目录 一、淘宝网店 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 二、斐波那契凤尾 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 一、淘宝网店…

idea将本地项目上传git

idea将本地项目上传git 第一步&#xff1a;菜单栏 VCS——>import into Version control——>Create git Repository——>弹出框找到选中自己项目——>点击OK 第二步&#xff1a;选中项目右键 ——>git——>Add 文件会变成绿色表示成功 第三步:VCS——>co…

Nginx的概述与配置

一、Nginx概述 1、Nginx的特点 一款高性能、轻量级web服务 • 稳定性高 • 系统资源消耗低高 • 对HTTP并发连接的处理能力 单台物理服务器可支持30000~50000个并发请求 2、 Nginx编译安装 • 安装支持软件 • 创建运行用户、组 • 编译安装Nginx 3、Nginx运行控制 …

Java面试突击班(抓住金九银十) 持续更新中

文章目录1.Java中线程的实现方式&#xff1f;2. Java线程中的状态&#xff1f;3. Java中如何停止线程&#xff1f;4. Java中Sleep和wait方法的区别&#xff1f;5.扩展—— P5典型 P6典型 P7典型6.并发编程的三大特性原子性什么时并发编程得原子性保证并发编程得原子性可见性什么…

【CSS】固定定位示例 ( 屏幕左右两侧广告栏 | 开发要点分析 | 代码示例 )

文章目录一、开发要点分析二、代码示例一、开发要点分析 实现下图样式 : 中间部分是网页内容 , 左右两侧是 固定广告栏 , 不管浏览器如何滚动 , 缩放 , 该左右两侧广告栏不变 ; 标签结构分析 : 上述页面中 , 中心的版心盒子 与 左侧广告栏 / 右侧广告栏 是兄弟关系 ; <div …

如何在rust中使用泛型,trait对象的总结以及kv sever(3)

可以说在 Rust 开发中&#xff0c;泛型编程是我们必须掌握的一项技能。在你构建每一个数据结构或者函数时&#xff0c;最好都问问自己&#xff1a;**我是否有必要在此刻就把类型定死&#xff1f;**是不是可以把这个决策延迟到尽可能靠后的时刻&#xff0c;这样可以为未来留有余…

谷歌的Bard和OpenAI的GPT4的对比

前言 随着上个月21日谷歌面向公众开放人工智能聊天机器人Bard的访问权限&#xff0c;同样是上个月的14日OpenAI为聊天机器人ChatGPT发布的最新语言模型&#xff1a;GPT-4的问世&#xff0c;可以说关于ChatGPT应用的推出进入了百家争鸣的情况&#xff0c;而且竞争变得激烈起来&a…

手把手教你Temporal Fusion Transformer——Pytorch实战

建立了一个关于能源需求预测的端到端项目&#xff1a; 如何为 TFT 格式准备我们的数据。 如何构建、训练和评估 TFT 模型。 如何获取对验证数据和样本外预测的预测。 如何使用built-in model的可解释注意力机制计算特征重要性、季节性模式和极端事件鲁棒性。 什么是Temporal F…

Prophet学习(二) 时序预测开源工具包Prophet介绍

目录 一、Prophet 简介 二、Prophet 适用场景 三、Prophet 算法的输入输出 四、Prophet 算法原理 五、与机器学习算法的对比 六、代码 6.1 依赖安装 6.2 预测demo 七、参考资料 八、官方链接&#xff1a; 九、案例链接&#xff1a; 一、Prophet 简介 Prophet是Faceb…

C++学习 Day1

目录 1. C关键字(C98) 2.命名空间 3. C输入&输出 1. C关键字(C98) C总计63个关键字&#xff0c;C语言32个关键字 目前只是初学阶段&#xff0c;只是大致的了解&#xff0c;以后再深入研究。 2.命名空间 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&am…

C++中的类模版

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下…

Linux驱动开发——高级I/O操作(一)

一个设备除了能通过读写操作来收发数据或返回、保存数据&#xff0c;还应该有很多其他的操作。比如一个串口设备还应该具备波特率获取和设置、帧格式获取和设置的操作;一个LED设备甚至不应该有读写操作&#xff0c;而应该具备点灯和灭灯的操作。硬件设备是如此众多&#xff0c;…

PDF怎么转CAD文件?(免费!高效转换方法汇总)

一般而言&#xff0c;PDF图纸是不能修改的。若需修改&#xff0c;则需将PDF转CAD&#xff0c;此时如何满足PDF转CAD的需求呢&#xff1f;今天&#xff0c;我将教你两种免费的PDF转CAD的方法&#xff0c;助力高效办公。 1.本地软件转换法 这是用本地软件转换方法&#xff0c;支…