C++中数组初始化方法

2023-05-16

定义:

int *pia = new int[10]; // array of 10 uninitialized ints

此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向该数组第一个元素的指针,此返回值初始化了指针 pia。

在自由存储区中创建的数组对象是没有名字的,只能通过其地址间接地访问堆中的对象。

注意:C++使用new和delete在堆(自由存储区)上分配和释放动态数组。

动态数组初始化:

1. 元素只能初始化为元素类型的默认值,而不能像数组变量一样,用初始化列表为数组元素提供各不相同的初值。

2. 对于内置数据类型元素的数组,必须使用()来显示指定程序执行初始化操作,否则程序不执行初始化操作:


  
  1. int *pia = new int[10]; // 每个元素都没有初始化

  2. int *pia2 = new int[10] (); // 每个元素初始化为0

3.类类型元素的数组,则无论是否使用(),都会自动调用其默认构造函数来初始化:


  
  1. string *psa = new string[10]; // 每个元素调用默认构造函数初始化

  2. string *psa = new string[10](); // 每个元素调用默认构造函数初始化

动态分配空数组:

char *cp = new char[0];

之后,可以动态改变cp的维数。

动态释放:

delete [] pia;

典型使用示例:

复制代码


  
  1. const char *pc = "a very long literal string"; // 处理C风格字符串时使用const指针

  2. const size_t len = strlen(pc) +1; // size_t用于数组的大小和下标

  3. for (size_t ix = 0; ix != 1000000; ++ix) {

  4. char *pc2 = new char[len]; // pc2指向的存储空间的内容会动态改变,因此不使用const

  5. strncpy (pc2, pc, len); // 使用strncpy比使用strcpy安全

  6. // do something;

  7. delete [] pc2;

  8. }

复制代码

参考:C++ Primer 学习笔记:动态数组

一、数组定义和初始化

复制代码


  
  1. 1: 一维数组初始化:

  2. 2: 标准方式一: int value[100]; // value[i]的值不定,没有初始化

  3. 3: 标准方式二: int value[100] = {1,2}; // value[0]和value[1]的值分别为1和2,而没有定义的value[i>1]

  4. 4: // 则初始化为0

  5. 5: 指针方式: int* value = new int[n]; // 未初始化

  6. 6: delete []value; // 一定不能忘了删除数组空间

  7. 7:

  8. 8: 二维数组初始化:

  9. 9: 标准方式一: int value[9][9]; // value[i][j]的值不定,没有初始化

  10. 10: 标准方式二: int value[9][9] = {{1,1},{2}}; //value[0][0,1]和value[1][0]的值初始化,其他初始化为0

  11. 11: 指针方式一: int (*value)[n] = new int[m][n];

  12. 12: delete []value; // n必须为常量,调用直观。未初始化

  13. 13: 指针方式二: int** value = new int* [m];

  14. 14: for(i) value[i] = new int[n];

  15. 15: for(i) delete []value[i];

  16. 16: delete []value; // 多次析构,存储麻烦,未初始化

  17. 17: 指针方式三: int * value = new int[3][4]; // 数组的存储是按行存储的

  18. 18: delete []value; // 一定要进行内存释放,否则会造成内存泄露

  19. 19:

  20. 20: 多维数组初始化:

  21. 21: 指针方式: int * value = new int[m][3][4]; // 只有第一维可以是变量,其他几维必须都是常量,否则会报错

  22. 22: delete []value; // 一定要进行内存释放,否则会造成内存泄露

复制代码

数组初始化的大括号后面要加“;”来表示结束。

数组访问:

指针形式:如二维数组value[i][j]的访问:

*(value[i] + j) 或

(*(value + i))[j]

二、数组作为参数传递

复制代码


  
  1. 1: 一维数组参数传递:

  2. 2: void Func(int *value);

  3. 3: 或者是

  4. 4: void Func(int value[]);

  5. 5:

  6. 6: 二维数组传递:

  7. 7: 定义是 int **value;的传递

  8. 8: void Func(int **value);

  9. 9: 定义是 int (*value)[n] = new int[m][n];的传递

  10. 10: void func(int (*value)[n]); // sizeof(p)=4,sizeof(*value)=sizeof(int)*n;

复制代码

三、数组与指针关系

1、数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;

2、数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;

3、指向数组的指针则是另外一种变量类型,(在win32平台下,长度为4),仅仅意味着数组存放地址。

4、数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针,而且在其失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。

四、数组的存储格式

多维数组在内存中存储时是按照最低维连续的格式存储的,如二维数组{undefined{1,2},{3,4}}在内存中的位置是这样顺序的“1,3,2,4”,这跟matlab是有区别的,matlab是按列进行存储的。在使用指针进行索引时很有用。

五、字符数组

char类型的数组被称作字符数组,通常用来存储字符串。字符串是附加有特殊字符(串尾标志)的字符序列。串终止字符表明字符串已经结束,该字符由转义序列‘\0’定义,有时被称为空字符,占用一个字节,其中8位全为0。这种形式的字符串通常被称为C型字符串,因为以这样的方式定义字符串是在C语言中推出的,在C++一般使用string,而MFC中则定义了CString类。

字符串中每个字符占用一个字节,算上最后的空字符,字符串需要的字节数要比包含的字节数多一个。如:

char movie_star[15] = “Marilyn Monroe”;

这里字符串是14个字符,但是要定义15个字符串的数组。也可以不指定字符数组的个数。如:

char movie_star[] = “Marilyn Monroe”;

六、内存泄露

我们定义了一个指针,然后给它赋予了一个地址值,然后又不再使用,但是没有delete,那么当给指针赋予其他的地址值时,原来的内存将无法释放,这就叫做内存泄露。

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

C++中数组初始化方法 的相关文章

  • MFC中添加的ID资源号提示找不到声名问题

    1 查看resource h资源文件 xff0c 基本上都是因为某些界面上的修改等原因造成了里面部分定义ID号值重复了才报的错 xff0c 所以要在resource h文件中手动修改成不一样的id值
  • vnc远程桌面,vnc远程桌面使用教程图解

    作为一个新手小白 xff0c 你是否也像小编一样不知道如何实现vnc远程桌面呢 xff1f vnc作为一款出色的远程软件 xff0c 在远程桌面方面也同样出色 xff0c 那如何实现vnc远程桌面使用 xff1f 小编发现了一款超好用的vn
  • MFC-创建模态对话框和非模态对话框的方法

    注意 xff1a 以下实例中创建模态对话框时没有用create xff08 id号 xff09 绑定资源id xff0c 而非模态对话框中要用create xff08 id号 xff09 绑定对话框资源id 在MFC中对话框有两种形式 xf
  • MFC-动态创建控件并使用的方法

    CListBox newLisBox 61 new CListBox newLisBox gt SetParent amp m tab CRect rc m tab GetClientRect rc rc top 43 61 20 43 G
  • c#实例-子线程查找另一线程模态对话框句柄(invoke测试)

    private void button3 Click object sender EventArgs e Task Factory StartNew 61 gt Form1 form1 61 new Form1 form1 Name 61
  • WindowsAPI-获得当前活动窗口(运行自身消息循环的窗体)的句柄

    GetForegroundWindow 返回 Windows 系统的当前激活的窗口句柄 GetActiveWindow 返回自己程序的当前激活窗口的句柄 Screen gt ActiveForm 返回自己程序的激活的TForm派生的窗口 S
  • 一个线程资源中有多个模态对话框的问题

    一个线程资源中有多个模态对话框下 xff0c 不是激活的无法调用关闭 xff0c 只有非激活状态才可以调用关闭 xff0c 但是可以通过sendmessage发送消息给非激活状态下的模态对话框处理关闭等逻辑
  • sqlite语句大全

    一 基础 1 说明 xff1a 创建数据库 CREATE DATABASE database name 2 说明 xff1a 删除数据库 drop database dbname 3 说明 xff1a 备份sql server 创建 备份数
  • sqlite-常用语句

    一 xff1a 查询 查找C2最大值的C2值和C1值 select max C2 C1 as valueC1 from ExperimentTable where C2 61 39 N A 39 以下两条都可以 select max C2
  • C语言-指针

    目录 指针是什么 xff1f 指针变量 使用指针变量的例子 通过指针引用数组 amp 数组名vs数组名 野指针 野指针成因 如何避免野指针 指针运算 指针是什么 xff1f 指针是c语言中的一个重要概念 xff0c 也是C语言的一个重要的特
  • C#截获其它窗口的WM_PAINT 消息

    在C 底下如何截获其它窗口的WM PAINT 消息啊 自己窗口可以这样截获 protected override void WndProc ref Message m switch m Msg case WM PAINT
  • C语言-动态内存管理

    C语言中 xff0c 我们在使用数组的时候 xff0c 经常有这样的一个问题 xff1a 数组在申明的时候 xff0c 必须指定数组的长度 xff0c 它所需要的内存在编译时分配 有的时候 xff0c 我们开辟的空间太小 xff0c 无法满
  • tightvncserver中文版,3步实现tightvncserver中文版下载

    tightvnc是一个免费的软件控制软件开发包 xff0c 您可以通过鼠标 键盘操作远程机器 tightvnc对个人和商业应用都免费 xff0c 开放所有源代码 Ttightvnc可以运行在Windows Unix Mac系统上 xff0c
  • c语言-指针的本质和使用

    指针的本质和使用 一 地址概念 我们首先来看看地址 是个什么概念 每一个变量都有一个内存位置 xff0c 每一个内存位置都定义了可使用 amp 运算符访问的地址 xff0c 它表示了在内存中的一个地址 画图简单说明 xff1a 二 什么是指
  • C++类与对象概念详解

    一 简介 1 类用于指定对象的形式 xff0c 它包含了数据表示法和用于处理数据的方法 类中的数据和方法称为类的成员 函数在一个类中被称为类的成员 2 类提供了对象的蓝图 xff0c 所以基本上 xff0c 对象是根据类来创建的 声明类的对
  • C++类对象的创建与释放过程详解

    类的定义与实例化 类对象的创建方法 类对象的创建过程 类对象的释放过程 析构函数 缺省析构函数 类的定义与实例化 类对象的创建方法 1 在栈上创建 类名 对象 无参创建方法 类名 对象 实参 有参创建方法 2 在堆上创建 类名 对象指针 6
  • c++中类创建对象的两种方式

    class A xff1b 1 A a xff1b 2 A a 61 new A 第一种方式对象数据存在栈中 xff0c 是局部变量 xff1b 第二种方式方式申请了动态内存 xff0c 即对象数据在堆区
  • C#里面SQLite读取数据的操作

    挂载表格时候用 public static DataSet Query string SQLString using SQLiteConnection connection 61 new SQLiteConnection connectio
  • C#-Hook钩子实例

    一 写在最前 本文的内容只想以最通俗的语言说明钩子的使用方法 xff0c 具体到钩子的详细介绍可以参照下面的网址 xff1a http www microsoft com china community program originalar

随机推荐

  • C#-invoke与sendmessage,findWindow的阻塞实验

    虽然模态对话框阻塞了顶层窗体 xff0c 但是仍然可以通过findwindow查找顶层窗体句柄 xff0c 并使用sendmessage向顶层窗体发送消息并执行消息内的逻辑 xff08 验证实例如下 xff09 public partial
  • c#中使用Marshal手动在堆中创建非托管内存并使用

    使用 Marshal 做出可以快速释放内存的大数组 需要不断申请一段大内存数组 xff0c 然后就释放他 xff0c 但是 C 对于大内存不是立刻释放 xff0c 所以就存在一定的性能问题 在博客园看到了一位大神使用 Marshal 做出快
  • C#-利用Marshal类实现序列化

    主要是使用Marshal类里的两个方法 xff1a 第一个是StructureToPtr xff0c 将数据从托管对象封送到非托管内存块 第二个是PtrToStructure xff0c 将数据从非托管内存块封送到新分配的指定类型的托管对象
  • c#中事件注册多个委托并获取委托列表

    using System namespace 委托和事件 internal class Program private static void Main string args Action action 61 One action 43
  • vnc怎么注册,教你3步解决vnc怎么注册

    VNC Virtual Network Computing 是一款优秀的远程控制工具软件 xff0c 由著名的AT amp T的欧洲研究实验室开发的 VNC是在基于UNIX和Linux操作系统的免费的开放源码软件 xff0c 远程控制能力强
  • C#中4种深拷贝方法实例

    1 xff1a 利用反射实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public static T DeepCopy lt T gt T obj 如果是字符串或值类型则直接返回 if obj is string
  • c#子线程和主线程创建窗体时顶层显示的区别

    主线程 1 设置TopLevel xff0c Topmost bringfront属性 子线程 2 在可在Load事件里注册循环设置TopLevel xff0c Topmost bringTofront属性的方法 xff0c 如下 frm
  • 模态对话框阻塞主线程的话不影响其他线程操作主线程控件(不阻塞)

    Task Factory StartNew 61 gt Thread Sleep 5000 this Invoke new Action 61 gt this button7 Text 61 34 aaaaaaaaaaaaaa 34 Mes
  • Ubuntu18.04.3虚拟机安装步骤图文教程

    虚拟机的安装步骤就不教学了 xff01 自行百度 xff01 接下来 教学ubuntu18 04 3desktop amd64版本的安装和配置教程 软件下载地址详细介绍 xff1a ubuntu 18 04 3 下载速度很快 xff1a 2
  • Linux安装QTCreator问题解决汇总

    关于Ubuntu18版本下新安装Qtcreator编译报错 cannot run compiler clang 43 43 output的解决办法 前两次本以为记住了 xff0c 结果第三次再次在Linux下安装qtcreator依然捣鼓搞
  • Qt路径中常用字符“./”、“../”、“/”、“*”的含义

    在Qt中进行编程时 xff0c 当我们需要调用某些路径时候 xff0c 特别是调用QDir类进行访问时 xff0c 会定义一系列的字符串 xff0c 并将这些字符串赋值给路径 xff0c 这时候就出现了一个问题 xff0c 这些字符串所代表
  • Qt工程pro文件的配置和头文件和库的添加

    Qt开发中 xff0c pro文件是对正工程所有源码 编译 资源 目录等的全方位配置的唯一方式 xff0c pro文件的编写非常重要 xff0c 以下对几个重要项进行说明 xff08 win和linux xff0c mac平台通用配置 xf
  • Qt -线程基础(QThread、QtConcurrent、信号槽等)

    昨晚看Qt的Manual xff0c 突然发现下一个版本的Qt中 Qt4 7 4 Qt4 8等 增加了一个特赞的介绍多线程的文章 xff1a Thread Basics 注意 xff1a 该链接以后会失效 xff0c 但是 到时候你直接看Q
  • Qt中线程同步的几种方法详解

    1 QMutex类 QMutex类就像一把锁 xff0c 在互斥量以前上锁 xff08 QMutex lock xff09 xff0c 而后在使用完互斥量以后解锁 xff08 QMutex unlock xff09 好比下面的代码 xff1
  • Qt中多线程同步总结示例

    1 QMutex QMutex mutex void func mutex lock mutex unlock 2 QMutex联手QMutexLocker 在复杂函数或者异常处理中 xff0c 对mutex进行lock 和unlock 操
  • vnc远程连接ubuntu,如何实现vnc远程连接ubuntu教程图解

    Ubuntu Linux是由南非人马克 沙特尔沃思 Mark Shuttleworth 创办的基于Debian Linux的操作系统 Ubuntu几乎包含了所有常用的应用软件 xff1a 文字处理 电子邮件 软件开发工具和Web服务等 用户
  • 什么是元学习?

    作者 Aleksandr Movchan 编译 VK 来源 Medium 人工智能的一个基本问题是它无法像人类一样高效地学习 许多深度学习分类器显示了超人的表现 xff0c 但需要数百万个训练样本 知识不共享 xff0c 并且每个任务都独立
  • Qt-多线程-QThread分析总结

    QThread是Qt提供的线程类 xff0c 每一个QThread均可管理一个线程 其具有两种使用方式 xff1a 1 继承为QThread的子类 xff1b 2 继承为QObject的子类 xff0c 并使用QObject moveToT
  • C++中 二重指针详解

    前言 上篇博文讲到数组和指针的一些关系 xff0c 本篇博文会在这基础之上讲解一些更为复杂的指针 xff0c 这些指针在笔试题中经常出现 xff0c 对刚毕业找工作的大学生有很大的作用 指向指针的指针 在指针篇 xff08 1 xff09
  • C++中数组初始化方法

    定义 xff1a int pia 61 new int 10 array of 10 uninitialized ints 此 new 表达式分配了一个含有 10 个 int 型元素的数组 xff0c 并返回指向该数组第一个元素的指针 xf