C++数组初始化[通俗易懂]

C++数组初始化[通俗易懂]C++数组初始化定义:int*pia=newint[10];// arrayof10uninitialized ints此 new 表达式分配了一个含有10个 int 型元素的数组,并返回指向该数组第一个元素的指针,此返回值初始化了指针 pia。在自由存储区中创建的数组对象是没有名字的,只能通过其地址间接地访问堆中的对象。注意:C++使用new和delete…

大家好,又见面了,我是你们的朋友全栈君。

C++数组初始化

定义:

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

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

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

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

动态数组初始化:

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

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

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

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

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

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

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

动态分配空数组:

char *cp = new char[0];

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

动态释放:

delete [] pia;

典型使用示例:

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

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

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

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

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

    // do something;

    delete [] pc2;

}

数组定义和初始化

一维数组初始化:

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

标准方式二 int value[100] = {1,2}; // value[0]value[1]的值分别为12,而没有定义的value[i>1]则初始化为0

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

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

二维数组初始化:

标准方式一 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必须为常量,调用直观。未初始化

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

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

              for(i) delete []value[i];

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

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

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

多维数组初始化:

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

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

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

数组访问:

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

*(value[i] + j) (*(value + i))[j]

数组作为参数传递

一维数组参数传递:

void Func(int *value);

或者是

void Func(int value[]);

二维数组传递:

定义是 int **value;的传递

void Func(int **value);

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

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

数组与指针关系

  • 数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;
  • 数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;
  • 指向数组的指针则是另外一种变量类型,(在win32平台下,长度为4),仅仅意味着数组存放地址。
  • 数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针,而且在其失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。

数组的存储格式

多维数组在内存中存储时是按照最低维连续的格式存储的,如二维数组{
{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,那么当给指针赋予其他的地址值时,原来的内存将无法释放,这就叫做内存泄露。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161044.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月18日 下午8:36
下一篇 2022年7月18日 下午8:46


相关推荐

  • 数组的增删改查操作

    数组的增删改查操作

    2022年1月22日
    36
  • centos7 x11vnc配置

    centos7 x11vnc配置shishi 将文件夹放入 opt 目录下面 安装 x11vnccd opt x11vnc1rpm ivh rpm 配置 x11vnccp opt x11vnc1 x11vnc service etc systemd system 文件内容如下 cat etc systemd system x11vnc service Unit Description Startx11vnca After multi user target Ser

    2026年3月16日
    2
  • Java数组初始化的内存分配

    Java数组初始化的内存分配1 Java 数组是静态的 Java 是静态语言 所以 Java 的数组也是静态的 即 数组被初始化后 长度不可变静态初始化 显式指定每个数组元素的初始值 系统决定数组长度 String books newString 疯狂 Java 讲义 ThinkinginJa Java 核心技术卷 String names newString 张三 李四

    2026年3月17日
    3
  • ifndef的用法

    ifndef的用法头件的中的 ifndef 这是一个很关键的东西 比如你有两个 C 文件 这两个 C 文件都 include 了同一个头文件 而编译时 这两个 C 文件要一同编译成一个可运行文件 于是问题来了 大量的声明冲突 nbsp 还是把头文件的内容都放在 ifndef 和 endif 中吧 不管你的头文件会不会被多个文件引用 你都要加上这个 一般格式是这样的 nbsp ifndef nbsp define

    2026年3月19日
    1
  • 复变函数 —— 0. 连接复数与三角函数的欧拉公式

    复变函数 —— 0. 连接复数与三角函数的欧拉公式文章目录什么是欧拉公式欧拉公式的推导什么是欧拉公式欧拉公式是数学中一类非常重要的 能够把三角函数和复数联系在一起 并在我们需要的时候可以简化问题的数学工具 欧拉公式的推导如果你懂级数的概念 那么推导处欧拉公式是非常简单的 首先 我们用泰勒级数分别展开 exe xex sin x sinxsinx 以及 cos x cosxcosxex 1 x1 x22 x33 xnn e x 1 frac x 1 frac x 2 2 frac x 3 3 c

    2026年3月17日
    2
  • 网上主要的搜索工具_互联网主要是做什么的

    网上主要的搜索工具_互联网主要是做什么的我的一位朋友,用了10年的电脑。作为一名老网民,他的信息检索能力让我诧异。每次需要找点图片、网站、研究报告甚至小电影,他都需要花费很多时间,在各个论坛、网站里疲于奔波。因为他只会用百度!然而,世界上不仅仅只有一类搜索引擎。百度或者google虽然可以提供海量的信息,但是信息的甄选是一件非常麻烦的事情。所以,在这些通用引擎之外,我们

    2025年10月20日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号