我们常常看见,在图论中,对一个Graph类在初始化的时候,对类的成员变量**arc(邻接矩阵,是一个二维数组,大小是顶点数*顶点数,存储内容为边的权值,而且矩阵的对角线元素均为0),有如下的初始化方法:

//构造函数
Graph_DG::Graph_DG(int vexnum, int edge) {//初始化顶点数和边数this->vexnum = vexnum;this->edge = edge;//为邻接矩阵开辟空间和赋初值arc = new int*[this->vexnum];dis = new Dis[this->vexnum];for (int i = 0; i < this->vexnum; i++) {arc[i] = new int[this->vexnum];for (int k = 0; k < this->vexnum; k++) {//邻接矩阵初始化为无穷大arc[i][k] = INT_MAX;}}
}

首先arc是一个二级指针,为arc分配this->vexnum空间,每一维都是一个指向数组的指针,且每个数组内部的地址空间是连续的,但是数组之间的地址空间没有连续性。

注意,动态分配内存后的值是一个不定值,而并非0。

这种分配方法在内存中的布局:

参考代码

#include <iostream>
using namespace std;int main()
{int **arc;int x = 5;int y = 5;arc = new int*[x];for (int i = 0; i < y; i++){arc[i] = new int[y];}for (int i = 0; i < x; i++)for (int j = 0; j < y; j++)cout << arc[i][j] << endl;cout << "--------------------------------------------------------" << endl;for (int i = 0; i < x; i++)for (int j = 0; j < y; j++)cout << &(arc[i][j]) << endl;system("pause");return 0;
}

输出结果:

#include <iostream>
using namespace std;int main()
{int *arc;int x = 5;arc = new int[x];for (int i = 0; i < x; i++)cout << arc[i] << endl;cout << "--------------------------------------------------------" << endl;for (int i = 0; i < x; i++)cout << &(arc[i]) << endl;system("pause");return 0;
}

注意,同一个new出来的是连续内存,new一个一维数组确实是连续内存,但多个new出来的就不是连续内存了。

凡是new出来的都是建立在堆上,不管是不是连续内存。也就是说,堆上建立的,不一定是不连续内存。

基础知识

我们先说一说int a[10]和int* a=new int[10]]。

1、int a[10]使用简单,系统会自动实现内存的分配和回收。int* a=new int[10]需要判断内存是否分配成功,以及在不用时需要使用delete[] a进行内存释放,否则会造成;
  2、如果不是a[10],而是a[1000000000]或者更大的话,那一般情况下,就只能使用int* a=new这种方式了。这个涉及到内存存放位置的问题,int a[]这种方式,内存是存放在栈上;int* a=new这种方式,内存是存放在堆上栈的实际内存是连续内存,因此可分配空间较小,堆可以是非连续内存,因此可以分配较大内存。因此,如果需要分配较大内存,需要分配在堆上;(注意,同一个new出来的是连续内存,new一个一维数组确实是连续内存,但多个new出来的就不是连续内存了。)

  3、使用int a[10]这种方式,内存大小需要用常量指定,比如这里的10。不能用int m=10;int a[m]这种方式。但是int* a= new这种方式可以,因此在动态分配内存上,后者有非常大的优势。

双重指针

我们先看下代码:

#include <iostream>
using namespace std; int main() {int p = 10; int *ptr = &p; cout << "p的值:" << p << endl; cout << "p的内存地址: " << &p << endl;cout << "*ptr指示的值: " << *ptr << endl; cout << "ptr的值: " << ptr << endl; cout << "ptr的内存地址: " << &ptr << endl; system("pause");return 0;
}

输出结果如下:

一般的整型指针定义是int* ptr=&p,表示int* ptr,初始化了一个整型的指针ptr,然后ptr=&p,即将ptr指向了p所在的地址,所以ptr的值就是内存地址,而*ptr的值就是取出ptr表示的内存地址中的内容,所以*ptr=p。而&ptr必然就是p的地址了,这就涉及到了双重指针。

双重指针就是指针的指针,简称双指针,如果在上面的代码中,我们要存储ptr的内存地址,就必须定义一个int** ptr2=&ptr。

C++中int a[10]和int* a=new int[10]]有什么区别相关推荐

  1. php中int()强制转换,php下intval()和int强制转换使用的区别是什么

    php下intval()和int强制转换使用的区别是:1.[intval()]如果参数是字符串,则返回字符串中第一个不是数字的字符之前的数字串所代表的整数值:2.转换为int的PHP字符串,在使用之前 ...

  2. c语言(int)x 100,【单选题】下列语句执行后,变量a、c的值分别是( ) int x=182; int a,c;c=x/100;a=x%10;...

    [单选题]下列语句执行后,变量a.c的值分别是( ) int x=182; int a,c;c=x/100;a=x%10; 更多相关问题 阅读下面短文,掌握其大意,然后从36-55各题所给的四个选项( ...

  3. int CWnd::GetWindowTextW(LPTSTR,int) const”: 不能将参数 1 从“char [10]”转换为“LPTSTR”

    问题描述: [cpp] view plaincopy //定义了三个编辑框控件 接受num1 num2 num3 void CTestDlg::OnBnClickedButton1()   //响应按 ...

  4. *java* 在Java中给Int类型的最大值+1 ,以及int与byte之前强转的例子

    1.给int最大值+1 public class Test1{public static void main(String[] args){//保存当前int的最大值,同理也有long maxValu ...

  5. php (0.1 0.7)10,int((0.1 + 0.7)* 10)= 7在几种语言。 如何防止这一点?

    int((0.1 + 0.7)* 10)= 7在几种语言. 如何防止这一点? 最近我遇到了几种语言的错误/function. 我有一个非常基本的知识,它是如何引起的(我想要一些详细的解释),但是当我想 ...

  6. C语言试题四十七之程序定义了N×M的二维数组,并在主函数中自动赋值。请编写函数function(int a[N][M], int m),该函数的功能是:将数组右上半三角元素中的值乘以m。

    1. 题目 程序定义了N×M的二维数组,并在主函数中自动赋值.请编写函数function(int a[N][M], int m),该函数的功能是:将数组右上半三角元素中的值乘以m. 2 .温馨提示 C ...

  7. [置顶] C语言中各种数据类型的长度 sizeof char, short, int, long, long long

    这些数据类型的sizeof具体长度依赖于编译器和操作系统(32-bit or 64-bit) 1: 首先,参见c99标准 标准中没有定义这些数据类型的长度,而是定义了这些数据类型能表达的大小范围的最小 ...

  8. mysql datetime timestamp 索引_MYSQL中时间类型底层存储,DATETIME ,TIMESTAMP,INT 如何选择?...

    在优化索引时,思考了一个问题,DATE, DATETIME, TIMESTAMP,还有INT存储的时间,在索引中哪个效率更高一些? 索引存储的,如果单纯的测试,而不去了解底层存储的方式和类型就不能断言 ...

  9. mysql的int多少溢出_mysql 整型(int)数字溢出在程序和数据库设计中的考虑

    以下试以整型(int)抛砖引玉: 一:MySQL5 以MySQL5版本为例,大多数管理员可能把自增数字.或者其它应用数字字段的列属性设置为int类型,int占用4个字节,而int又分为无符号型和有符号 ...

  10. Java中怎么将Long类型转换成Integer或int类型

    Java中怎么将Long类型转换成Integer或int类型?    强转.Long a=10l; int b = (int)a; 不过如果long值超出int的取值范围后再转型的话会有问题的.就是转 ...

最新文章

  1. sql server分布式事务解决方案[新事务不能登记到指定的事务处理器中错误]
  2. ssh 连接服务器_使用 SSH Key 访问服务器
  3. 风格迁移应用_[风格迁移][超分][ECCV2016]Perceptual Losses for Real...
  4. Linux下 Nginx 启动 重启 关闭
  5. java spring redis_spring配置redis(xml+java方式)
  6. iOS 3DTouch
  7. 源代码可以从应用提取码_大规模下加速源代码分析
  8. 读取Apache访问日志,查看每一个独立客户端连接获得的字节数
  9. Spring Boot 如何获取 Controller 方法名和注解信息?
  10. php 小数 精度不准,php小数精度问题
  11. 无人机——凤凰模拟器篇(五)遥控器的配置教程
  12. oracle卸载重新安装失败,Oracle卸载重新安装——实战
  13. 惠普怎样启动计算机上的无线功能,如何打开hp无线网卡?如何打开惠普笔记本电脑无线网卡...
  14. 【通讯术语】VoLTE
  15. 【文件】Notepad3下载和配置
  16. 【半导体先进工艺制程技术系列】SOI技术(上)
  17. 华为5G模块MH5000-31资料全集5G技术论坛
  18. 一个简单的静态web服务器实现
  19. 经典算法之直接选择排序
  20. die查壳工具 使用教程

热门文章

  1. 历史辩证唯物主义下的金融业发展的思考*
  2. CSS,给你点“颜色“看看
  3. C++入门:鸡兔同笼问题
  4. 计算机组成原理六单元答案,计算机组成原理第六章中央处理器(含答案)
  5. TDengine 在 TCL 空调能源管理平台的实践
  6. java和基岩版凋零打法,六种凋零打法介绍 凋零还可以这么打
  7. 个人人民币定期存款-存本取息Personal CNY Time Deposit – Schedule
  8. java8 无限流_java – “有效无限流”是什么意思
  9. 氮化镓助力快充小型化,KEMET聚合物钽电容大显身手
  10. Java多线程-将全量用户表70万数据压缩并生成CSV文件和推送到FTP上(最快快方式)