用new创建数组

用new创建数组用new创建数组用new创建数组的优势由于new创建的对象是在运行时确立的,所以有着具体情况具体分析的优点,那么什么叫做具体情况具体分析呢?我觉得c++primerplus的一个例子十分贴切——比如你在度假,已经做好每天的参观计划,可突然有一天天气不好或你心情不好,此时你就不想参观了,如果此时是在编译状态,系统是不允许的,你必须按照计划去参观,但运行时状态,系统是允许的,此时你就可以呆在酒店尽情的玩耍了。用new创建数组也有此优点,即数组长度可以根据情况而定。比如说创建10个元素的数组,可以如下代

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

用new创建数组

用new创建数组的优势

由于new创建的对象是在运行时确立的,所以有着具体情况具体分析的优点,那么什么叫做具体情况具体分析呢?我觉得c++ primer plus的一个例子十分贴切——比如你在度假,已经做好每天的参观计划,可突然有一天天气不好或你心情不好,此时你就不想参观了,如果此时是在编译状态,系统是不允许的,你必须按照计划去参观,但运行时状态,系统是允许的,此时你就可以呆在酒店尽情的玩耍了。用new创建数组也有此优点,即数组长度可以根据情况而定。

比如说创建10个元素的数组,可以如下代码定义:

int* ptr = new int[10];

但不能写成一下代码:

int* ptr = new int[];

为什么呢?

因为此时如果再new一个动态数组,内存就不好分配了,如果你不知道需要多少元素个数,可以这样写:

int n;

int* ptr = new int[n];

cin >> n;

Q:假如我已经确定要建立7个元素了,但我手欠,少输入了了两个元素,那new会新建7个元素的内存,还是5个

A:会新建7个,而且如果不对这7个元素赋值,其默认的值是0,可根据一下代码证明:

#include<iostream>
using namespace std;

int main() {
    int* ptr = new int[7];
    ptr[0] = 1;
    ptr[1] = 2;
    ptr[2] = 3;
    ptr[3] = 4;
    ptr[4] = 5;
    cout << "ptr + 4 = " << ptr + 4 << endl;
    cout << "ptr[5] = " << ptr[5] << endl;
    cout << "ptr + 5 = " << ptr + 5 << endl;
    cout << "ptr[6] = " << ptr[6] << endl;
    cout << "ptr + 6 = " << ptr + 6 << endl;

    delete [] ptr;
    return 0;
}![1](F:\图片\1.PNG)

实现结果如下

在这里插入图片描述

Q:假如我又手欠了,多输入了一个元素,如果delete以后,这两个的内存会被释放掉吗

A:会的

可以以下代码证明

#include<iostream>
using namespace std;

int main() {
    int* ptr = new int[2];
    int* ps;
    ps = ptr;
    ptr[0] = 1;
    ptr[1] = 2;
    ptr[2] = 3;
    ptr[3] = 4;
    ptr[4] = 5;
    cout << "释放前:\n";
    ps = ps + 2;
    cout << "addr = " << ps << endl;
    cout << "value = " << *ps << endl;
    
    delete [] ptr;
    cout << "释放后:\n"; 
    
    cout << "addr = " << ps << endl;
    cout << "value = " << *ps << endl;
    
    return 0;
}

代码执行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-afM2IEx9-1640241670545)(F:\图片\2.PNG)]

<< endl;

return 0;

}


代码执行结果

![在这里插入图片描述](https://img-blog.csdnimg.cn/811be136acf5423aa6d998b0dc7e9da5.png#pic_center)


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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • EJB学习笔记

    EJB学习笔记Chapter01企业级开发背景知识一、什么是企业级程序(EnterpriseApplication)? 具有以下特点的程序: (1)围绕商业目的; (2)分布分层的程序架构。二、企业级应用的架构发展历史Host/Terminal(主机/终端,终端不具备处理能力,数据由主机处理)终端为哑终端,可接受命令,不处理命令优点:安全(不能直接访问)

    2022年9月30日
    3
  • Python for循环的使用

    Python for循环的使用Pythonfor循环的使用(一)for循环的使用场景1.如果我们想要某件事情重复执行具体次数的时候可以使用for循环。2.for循环主要用来遍历、循环、序列、集合、字典,文件、甚至是自定义类或函数。(二)for循环操作列表实例演示使用for循环对列表进行遍历元素、修改元素、删除元素、统计列表中元素的个数。1.for循环用来遍历整个列表#for循环主

    2022年8月12日
    8
  • RestTemplate post请求返回状态码415「建议收藏」

    RestTemplate post请求返回状态码415「建议收藏」背景:跨模块通过post请求调用指定接口,返回415415状态码解释:UnsupportedMediaType对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝错误日志:org.springframework.web.client.HttpClientErrorException:415nullatorg.springf…

    2022年5月15日
    161
  • 汉字字典树[通俗易懂]

    汉字字典树[通俗易懂]字典树的概念我就不说了,不过大多题目都是英文的字典树,我就闲的蛋疼去写了中文的字典树,实现起来也挺简单的。#include&lt;iostream&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#include&lt;stdio.h&gt;#include&lt;map&gt;usingnamespacestd;…

    2022年9月6日
    5
  • 未来将是越界的时代

    未来将是越界的时代

    2021年12月2日
    49
  • 动画:用动画给面试官解释 TCP 三次握手过程

    动画:用动画给面试官解释 TCP 三次握手过程作者|小鹿来源|公众号:小鹿动画学编程写在前边TCP三次握手过程对于面试是必考的一个,所以不但要掌握TCP整个握手的过程,其中有些小细节也更受到面试官的青睐。对于这部分掌握以及TCP的四次挥手,小鹿将会以动画的形式呈现给每个人,这样将复杂的知识简单化,理解起来也容易了很多,尤其对于一个初学者来说。学习导图一、TCP是什么?TCP(Transmissio…

    2022年6月17日
    36

发表回复

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

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