用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:\图片.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)


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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 为什么卡巴斯基中国没有市场_卡巴斯基2019免费版怎么样

    为什么卡巴斯基中国没有市场_卡巴斯基2019免费版怎么样概述在2019Q3中,我们观察到一种新型的DDoS攻击,证实了我们先前有关攻击者正通过Memcached协议进行攻击的假设。正如我们推测的那样,攻击者尝试使用另外一种不常见的协议来放大DDoS攻击。AkamaiTechnology的专家最近发现他们的一位客户曾遭受攻击,该攻击是借助WS-Discovery多播协议,通过欺骗返回IP地址来实现的。根据其他安全研究人员的说法,网络犯罪分子只是在最…

  • centos7网络设置ipv4_centos7连接wifi详细步骤

    centos7网络设置ipv4_centos7连接wifi详细步骤系统版本centos7.71、ip配置(配置后局域网内可互ping)同网段内设置,不用网关即可通信1、临时设置#设置接口ens33的地址为192.168.59.27ipaddradd192.168.56.27/24devens33#查看接口ens33地址ipaddrshowens332、永久设置进入目录,/etc/sysconfig/network-scripts,修改文件ifcfg-ens33,修改或添加下列几项BOOTPROTO=”none”#

  • springcloud启动错误[通俗易懂]

    springcloud启动错误[通俗易懂]标题:springcloud启动错误AfatalerrorhasbeendetectedbytheJavaRuntimeEnvironment:EXCEPTION_ACCESS_VIOLATION(0xc0000005)atpc=0x0000000000000000,pid=5900,tid=7172JREversion:Java™SERuntimeEnvironment(12.0.2+10)(build12.0.2+10)JavaVM:Jav

  • 虚拟存储器中页面置换算法的实现课程设计_段页式存储管理方式的内存地址为

    虚拟存储器中页面置换算法的实现课程设计_段页式存储管理方式的内存地址为设计目的 通过请求页式存储管理中页面置换算法模拟程序,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。 设计内容 阅读教材《计算机操作系统》第四章,掌握存储器管理相关概念和原理。模拟实现页式虚拟存储管理的三种页面置换算法(OPT、FIFO和LRU),并通过比较性能得出结论。前提:(1)页面分配采用固定分配局部置换。(2)作业的页面走向…

  • linux重启mysql

    linux重启mysqllinux重启mysql的方法:1、直接使用“servicemysqldrestart”或“servicemysqlrestart”命令重启;2、使用“/etc/init.d/mysqldrestart”命令重启。1、查看mysql版本方法一:status;方法二:selectversion();2、Mysql启动、停止、重启常用命令a、重启1)、使用service启动: 1 2 servicemysqldres.

    2022年10月17日
  • 内网IP和公网IP的区别

    内网IP和公网IP的区别IP地址对于经常上网的人应该都不陌生,ip地址又可以分成内网ip地址和公网ip地址,今天就来简单介绍下这两者的区别。通常我们所说的内网也就是局域网,是内网的计算机以网络地址转换协议,通过一个公共的网关访问Internet。而内网的计算机也可以向Internet上的其他计算机发送连接请求。但是但Internet上其他的计算机无法向内网的计算机发送连接请求。为了简单理解我们就以网吧的网络举个列子,网吧的网线都是连接在同一个交换机上面的,也就是说它们的IP地址是由交换机或者路由器进行分配的。而且每…

发表回复

您的电子邮箱地址不会被公开。

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