C++总结笔记(十)——堆区内存开辟数组和二级指针

2023-11-11


一、堆区开辟数组

1. 数组指针与指针数组的区别

数组指针是指指向数组的指针,它的本体是一个指针, 声明指针变量的时候一般用括号,因为括号的优先级高于[],这样在编译的时候就知道这是声明一个数组的指针

int (*p)[5];

指针数组是指数组由指针组成的数组,下面表示由5个指针变量组成了一个名为p的一维数组。

int *p[5];

2. 1维数组

1维数组的声明方式很多,可以概括为4种方式
1:类名* 指针 = new 类名[Size];
2:类名* 指针 = new 类名[Size] ();
3:类名* 指针 = new 类名[2]{ N1,N2};
4:类名* 指针 = new 类名[2]{ N };

#include<iostream>
using namespace std;

int main()
{
	int* const p = new int[100];//在堆中开辟100个内存空间
	cout << p << endl;

	for (int i = 0; i < 100; i++)
	{
		p[i] = i + 1;//每次循环数组的值加1,p[]表示值,不是指针
	}

	//调用一维数组
	for (int i = 0; i < 100; i++) 
	{
		cout << p[i] << endl;
	}

	//用完记得删除
	delete[]p;
	return 0;
}

3. 2维数组

方法一:

#include<iostream>
using namespace std;

int main()
{
	//二维数组的格式为类名+(指针变量)[列数]。 
	int(*p)[3] = new int[3][3]
	{ {1,2,3},
	  {4,5,6},
	  {7,8,9} 
	};

	int i, j;//输入行列值
	cout << "输入行号:"; 
	cin >> i;
	cout << "输入列号:";
	cin >> j;
	//p表示指针首元素的地址,所以*(p+i-1)表示指针地址加了4*(i-1)*3,(*p+j-1)表示指针地址加了4*(j-1)
	cout << p << endl;
	cout << p[0] << endl;//1行1列元素的地址
	cout << (*(p + 1 - 1)) << endl;//1行1列元素的地址
	cout << (*(p + 1 - 1)+1) << endl;//1行2列元素的地址
	cout << (*(p + 2 - 1)) << endl;//二行一列元素的地址
	
	cout << *(*(p + i - 1) +j- 1) << endl;

	cout << p[i-1][j-1] << endl;//直接访问
}
输入行号:1
输入列号:1
0109E048
0109E048
0109E048
0109E04C
0109E054
1
1

方法二:

#include<iostream>
using namespace std;

int main()
{
	int row;
	cin >> row;

	int col;
	cin >> col;

	int** arr = new int* [row];//二级指针指向row行数组指针的地址

	for (int i = 0; i < row; ++i)
	{
		arr[i] = new int[col]();//为每一行分配地址,内存空间的长度为col*4
	}

	for (int i = 0; i < row; ++i)
	{
		for (int j = 0; j < col; ++j)//为数组填充元素
		{
			arr[i][j]++;
			cout << arr[i][j]<<endl;
		}
	}

	//释放空间
	for (int i = 0; i < row; ++i)
	{
		delete[col]arr[i];//先释放二维数组中每个元素指向的数组
		arr[i] = NULL;
	}

	delete[row]arr;//在释放该指针数组

}
3
3
1
1
1
1
1
1
1
1
1

二、二级指针

	int a = 10; 
	int* p = &a;
	int** p1 = &p;//a的指针的指针
	cout << p << endl;
	cout << *p1 << endl;
	cout << p1 << endl;
	cout << **p1 << endl;
0097FB0C
0097FB0C
0097FB00
10

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++总结笔记(十)——堆区内存开辟数组和二级指针 的相关文章

  • 成员字段、构建顺序

    在 C 中 当执行如下所示的操作时 构造顺序是否得到保证 Logger Logger kFilePath logs runtime log logFile kFilePath 是的 施工顺序始终得到保证 但是 不能保证它与对象在初始值设定项
  • BufferBlock 连续

    我想使用以下方式实现消费者 生产者模式BufferBlock
  • ASMX Web 服务,测试表单仅在本地计算机上适用于一种 WebMethod

    我有一个正在测试的 ASMX WebService 并且在大多数方法上我都可以使用测试表单进行测试 然而 我确实有一种方法 测试表上写着 The test form is only available for requests from t
  • 如何在 ASP.NET Core 6.0 Web API 项目中启用 cors?

    在我的 ASP NET Core 6 0 Web API 项目中配置了 CORS 但预检请求收到 http 405 错误 换句话说 不允许使用 HTTP OPTION 看起来 cors 没有启用 我见过的例子config EnableCor
  • c 使用 lseek 以相反顺序复制文件

    我已经知道如何从一开始就将一个文件复制到另一个文件 但是我如何修改程序以按相反的顺序复制它 源文件应具有读取访问权限 目标文件应具有读写执行权限 我必须使用文件控制库 例如 FILE A File B should be ABCDEF FE
  • 应用新设置时如何防止 GraphicsDevice 被丢弃?

    我的游戏窗口允许手动调整大小 这意味着它可以像任何其他普通窗口一样通过拖动其边缘来调整大小 游戏还利用了RenderTarget2D rt2d 在主 Draw 方法中设置主渲染目标 GraphicsDevice SetRenderTarge
  • C#生成的csv文件通过电子邮件发送嵌入到Lotus Note中电子邮件的底部

    我遇到了一个奇怪的问题 即使用 NET SmtpClient 通过电子邮件发送的 CSV 附件出现在电子邮件底部 而不是 Lotus Note 中的附件 我只是不知道如何解决这个问题 而且我无法访问客户端计算机 这使得调试非常困难 我可以采
  • 从 Golang 调用 C 函数

    我想在 Golang 中编写控制器逻辑并处理 json 和数据库 同时在 C 中使用我的数学处理模型 在我看来 调用 C 函数的开销必须尽可能低 就像设置寄存器 rcx rdx rsi rdi 一样 执行一些操作fastcall 并获取 r
  • 如果我重新分配并且新大小为 0,会发生什么情况。这与释放等效吗?

    给出以下代码 int a NULL a calloc 1 sizeof a printf d n a a realloc a 0 printf d n a return 0 它返回 4078904 0 这个 realloc 相当于 free
  • 如何解决文件被另一个进程使用的问题?

    我一直在 VS NET 2010 中调试 没有任何问题 但现在无法建造 我收到错误 Unable to copy file filename to bin Debug filename The process cannot access t
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE
  • 如果项目包含多个文件夹,如何使用 Add-Migration

    我想Add Migration使用我的 DbContext 但出现错误 The term add migration is not recognized as the name of a cmdlet function script fil
  • 使用联合对 IP 地址进行多种解释?

    在工作中 我们使用以下构造来将 IP 地址解释为 4 字节数组或 32 位整数 union IPv4 std uint32 t ip std uint8 t data 4 这很好用 但是读完这本书的第 97 章 不要使用联合来重新解释表示
  • Code::Blocks 中的调试似乎不起作用 - 缺少调试符号

    我正在尝试在 Code Blocks 中调试程序 我跟着本指南 http wiki codeblocks org index php title Debugging with Code Blocks and 这个短视频 http www y
  • 模板定义中的友元函数

    我的问题有点相关this https stackoverflow com questions 1297609 overloading friend operator for template class one 我想重载某些类的运算符 te
  • 在 C# 窗口应用程序中运行 C/C++ 控制台应用程序?

    现在 我想开发一个简单的应用程序 因此我决定最快的编码方式是 C NET 但现在 我很难实现我需要的功能之一 我想做的是在 C 应用程序的窗口内运行 C C 控制台应用程序 就像在虚幻前端中一样 添加一点通信方式 以便我可以为控制台应用程序
  • 检查另一种形式的线程是否仍在运行

    我有一个涉及两个窗体的 Windows 窗体应用程序 子表单用于将数据导出到 CSV 文件 并使用后台工作者写入文件 当这种情况发生时 我隐藏了表格 当后台工作程序运行时 父窗体仍然处于活动状态 因此即使后台工作程序正在写入文件 用户也可以
  • 是否可以检测流是否已被客户端关闭?

    简要介绍一下情况 我有一项服务可以通过套接字接收信息并发送回复 连接不安全 我想设置另一个可以为这些连接提供 TLS 的服务 这个新服务将提供单个端口并根据提供的客户端证书分发连接 我不想使用 stunnel 有几个原因 其中之一是每个接收
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS
  • 查找和替换正则表达式问题

    感谢这里对我其他问题的所有大力帮助 我开始掌握正则表达式 但我仍然对这个一无所知 我的代码是 StreamReader reader new StreamReader fDialog FileName ToString string con

随机推荐

  • 1-1、Qt基本概念以及界面绑定信号与槽的实例

    1 各种程序格式的选择方式 2 例子 新建mainwindow的项目 在ui拖动一个pushbuttton 点击界面下的信号与槽的部分 点击 然后选择发送者 信号 接收者 槽 一下为源码 sampl 1 pro Project create
  • yum提示 “Cannot retrieve metalink for repository: epel/x86_64” 的解决方法

    今天在centos7服务器上用yum的时候发现 yum命令不能用了 不管用yum什么命令都会出现如下提示 完整的错误提示如下 One of the configured repositories failed Unknown and yum
  • 深入理解[观察者模式]原理与技术

    观察者模式 Observer Pattern 也叫做发布 订阅 Publish Subscribe 模式 模型 视图 Model View 模式 这个模式的一个最重要的作用就是解耦 也就是将被观察者和观察者进行解耦 使得他们之间的依赖性更小
  • 【华为OD机试真题 C++】计算最大乘积 【2022 Q4

    前言 华为OD机试真题 C 本专栏包含华为OD机试真题C 解答 会实时更新收纳网友反馈 为大家更新最新的华为德科OD机试试题 为大家提供学习和练手的题库 订阅本专栏后可私信进交流群哦 答案仅供参考 不可照抄哦 题目描述 计算最大乘积 给定一
  • 【Unity3D】粒子光环

    作业要求 参考http i remember fr en 这类网站 使用粒子流编程控制制作一些效果 如 粒子光环 这个网站打不开 参考了一下师兄们的博客的图片 我看了一下 我感觉和上课做的粒子海洋有一些相似 就是需要变成一个环形 制作流程
  • JavaScript 数字去掉小数点后的0

    JavaScript 数字去掉小数点后的0 方法很简单 JavaScript提供了现成的方法 parseFloat function parseNum value value parseFloat value
  • 从头再来系列-Markdown基本语法

    以下内容摘抄于网络 Markdown 简介 Markdown 是一种轻量级标记语言 它允许人们使用易读易写的纯文本格式编写文档 Markdown 语言在 2004 由约翰 格鲁伯 英语 John Gruber 创建 Markdown 编写的
  • oracle基础知识

    1 oracle特点 2 oracle体系 实例 一组oracle后台进程以及在服务器中分配的共享内存区域 数据库 基于磁盘的数据文件 控制文件 日志文件 参数文件和归档文件等组成的物理文件集合 数据库服务器 三者之间的关系 实例用于控制和
  • 【DBeaver日常】查询出结果后,无法回到SQL编辑页面

    正常的查询页面 正常页面可以通过以下图示中的符号进行上下调整 上三角点击完以后的展示页面 如下图 下三角点击完以后的展示页面 如下图 误触以后的页面 误触以后可以通过下图中标示的部分进行恢复 结果面板恢复 最大化区域图示 选择上图中红色框线
  • QT学习之个人编程规范

    每个人对语言的编程习惯都不一样 这里简单介绍一下自己在学习使用Qt时养成的编程习惯 仅供参考 1 命名规则 1 1 常规命名规则 1 1 1 类命名规则 适用对象 1 窗口控件实现类 所有之间或间接继承于QWidget类的实现类 规则 命名
  • OpenMP设置线程数及开启方法

    1 OpenMP线程数设置 通常我们希望并行线程数可以随着机器改变自适应的调整 网上介绍OpenMP的文章很多 但是很少提到该怎么分配线程数 一般来说线程数最大可以开到2 核心数 但是这样电脑计算资源就会被占用的过多 其他程序基本上会卡的不
  • ASP.NET Core WebAPI学习-6

    ASP NET Core WebAPI学习 1 ASP NET Core WebAPI学习 2 ASP NET Core WebAPI学习 3 ASP NET Core WebAPI学习 4 ASP NET Core WebAPI学习 5
  • 数据结构——图的广度优先遍历(BFS)

    本文内图的存储方式是邻接矩阵 不过BFS的具体实现代码与图的存储结构无关 BFS的遍历方法 与树的层次遍历几乎一样 在实现树的层次遍历时 需要找到结点的所有子结点 在实现BFS时 需要找到该结点的所有邻接点 所以在实现BFS之前 需要先学习
  • VS2010 的卸载方法

    如何完全卸载VS2010 亲自体验过 1 首先用360卸载 当卸载完成后 提示有残余的话 就强力清除 PS 笔者使用专用卸载工具 IobitUninstaller 工具 此工具是单文件 免安装 它的特点是拥有360安全卫士 金山安全卫士 Q
  • 复制虚拟机后无法上网的问题

    1 背景 虚拟机用的是VMWare为了得到新的环境 而又不想每次都重装虚拟机 于是某天我复制了一台待机的虚拟机 然鹅它起来后却上不了网 无论我设了静态ip还是动态ip都不行 2 解决方法 问了下chatgpt 说是因为虚拟机的MAC地址冲突
  • 第十五章 AlibabaCloud微服务下的分布式配置中⼼

    1 微服务下的分布式配置中 现在微服务存在的问题 配置 件增多 不好维护 修改配置 件需要重新发布 什么是配置中 句话 统 管理配置 快速切换各个环境的配置 相关产品 百度的disconf 地址 https github com knigh
  • DolphinScheduler跨版本升级1.3.8至3.0.1

    DolphinScheduler跨版本升级1 3 8至3 0 1 Refer 背景 基础环境 依赖版本升级 修改pom xml 问题解决 MYSQL升级 1 文件替换 2 修改表结构 t ds process definition t ds
  • 三菱PLC 红绿灯 步进指令 STL

    自己写的红绿灯 有启动 停止两个按钮 南北通行4S 东西通行5S 链接 https caiyun 139 com m i 0E5CJEoVGt4D0 提取码 kVOA SET 启动 启动标志 RST 启动 停止标志 SET 停止 停止标志
  • 实例讲解MOS管电源开关电路的软启动

    看到一篇文章 作者在做一款大电压 大电流供电的产品 测试发现启动时的冲击电流很大 最大达到了14 2A 见下图示波器通道2的蓝色波形 通道4的绿色波形是采样电阻的电压 当时作者没有经验 不知道如何去解决 后来同事指点说 解决这个问题需要增加
  • C++总结笔记(十)——堆区内存开辟数组和二级指针

    文章目录 一 堆区开辟数组 1 数组指针与指针数组的区别 2 1维数组 3 2维数组 二 二级指针 一 堆区开辟数组 1 数组指针与指针数组的区别 数组指针是指指向数组的指针 它的本体是一个指针 声明指针变量的时候一般用括号 因为括号的优先