文档章节

C++二维数组的内存结构图与Java二维数组的内存结构图

z
 zsaniu
发布于 2017/04/09 00:15
字数 708
阅读 24
收藏 0

Java二维数组的内存结构图:

今天看了个视频,说Java中二维数组是这样的:java中的二位数组是按维存储的。

 

在Java中是可以这样的,二维数组有三种定义格式!

定义格式1:

定义格式1的内存图:
 

 

 

定义格式2:

 

定义格式2的内存结构图:
 

 

 

定义格式3:

定义格式3内存图:

 

C语言二维数组的内存结构图:

 

突然,感觉和自己脑海中C的不一样。还专门去看了下C的。

 void main()  
 {  
     int a[3][2];  
     cout << a <<"\t"<< &a << endl<<endl;  
          
     cout << a[0] << "\t" << a[1] << "\t" << a[2] << endl << endl;  
    
     cout << &a[0][0] << "\t" << &a[0][1] << endl << endl;  
     cout << &a[1][0] << "\t" << &a[1][1] << endl << endl;  
     cout << &a[2][0] << "\t" << &a[2][1] << endl << endl;  
      
 } 

运行结果:

 

也就是说,C语言的二维数组确实是下面这样:
,C语言的二维数组是连续一维存储的。

再详细看一下:

    #include<iostream>  
    using namespace std;  
      
    void main()  
    {  
        int a[3][3] = { 1, 5, 9, 15, 28, 44, 65, 88, 99 };  
        cout << "各元素:" << endl;  
        cout << a[0][0] << "  " << a[0][1] << "  " << a[0][2] << "  " << endl;  
        cout << a[1][0] << "  " << a[1][1] << "  " << a[1][2] << "  " << endl;  
        cout << a[2][0] << "  " << a[2][1] << "  " << a[2][2] << "  " << endl;  
      
        cout << "\n各元素地址:" << endl;  
        cout << &a[0][0] << "  " << &a[0][1] << "  " << &a[0][2] << "  " << endl;  
        cout << &a[1][0] << "  " << &a[1][1] << "  " << &a[1][2] << "  " << endl;  
        cout << &a[2][0] << "  " << &a[2][1] << "  " << &a[2][2] << "  " << endl;  
      
        cout << "\na[0]:" << a[0] << "    &a[0][0]: " << &a[0][0] << endl;   //a[0]  <==>  &a[0][0]  
        cout << "a[1]:" << a[1] << "    &a[1][0]: " << &a[1][0] << endl;     //a[1]  <==>  &a[1][0]  
        cout << "a[2]:" << a[2] << "    &a[2][0]: " << &a[2][0] << endl;     //a[2]  <==>  &a[2][0]  
      
        cout << "\na[0]+1:" << a[0]+1 << "  &a[0][1]:" << &a[0][1] << endl;  //a[0]+1  <==>  &a[0][1]  
        cout << "a[1]+1:" << a[1]+1 << "  &a[1][1]:" << &a[1][1] << endl;    //a[1]+1  <==>  &a[1][1]  
        cout << "a[2]+1:" << a[2]+1 << "  &a[2][1]:" << &a[2][1] << endl;    //a[2]+1  <==>  &a[2][1]  
      
        cout << "\n&a:" << &a << endl;       //&a:数组的首地址  
        cout << "&a +1:" << &a + 1 << endl;  //注意步长:直接跳了一个二维数组  
      
        cout << "\na+0:" << a << endl;    //第0行的首地址  
        cout << "a+1:" << a + 1 << endl;  //第1行的首地址  
        cout << "a+2:" << a + 2 << endl;  //第2行的首地址  
      
        cout << endl;  
        cout << "(*a)[2]:" << (*a)[2] << endl;  
        cout << "(*a +1)[2]:" << (*a + 1)[2] << endl;  
        cout << "*a[2]:" << *a[2] << endl;  
          
        cout << endl;  
        cout << "*a:" << *a << endl;  
        cout << "*(a+1):" << *(a + 1) << endl;  
        cout << "*(a + 1) + 2:" << *(a + 1) + 2 << endl;  
        cout << "*(*(a+1)+2):" << *(*(a + 1) + 2) << endl;  
    }  

附录:
java二维数组的遍历:

public class Main {  
  
    public static void main(String[] args) {  
          
        int[][] arr = { { 1, 2, 3 }, { 4, 5 }, { 6 } };  
  
        for (int row = 0; row < arr.length; row++) { // 外层循环:二维数组的长度,也就是一维数组的个数  
            for (int col = 0; col < arr[row].length; col++) { // 内层循环:某一维数组的长度  
                System.out.print(arr[row][col] + " ");  
            }  
            System.out.println();  
        }  
    }  
  
} 

打印结果:
1  2  3
4  5
6

本文转载自:http://blog.csdn.net/songshimvp1/article/details/49388413

共有 人打赏支持
上一篇: 经典设计模式
下一篇: SCT工作日志
z
粉丝 1
博文 38
码字总数 20723
作品 0
深圳
程序员
私信 提问
【广州】我想应聘一个C/C++/java软件开发职位

本人预计六月底七月初将去广州生活。希望在广州找到一份c/c++/java方面的软件开发职位。 以下 是我的简历,希望广州地区的it企业可以联系我。 周西的个人简历 姓  名: 周西 性  别: 男...

numcpp
2012/06/07
512
1
Android NDK开发之数组类型的操作

Jni 可以通过JNIEnv提供的方法,对传过来的Java数组进行相应的操作。它提供了两种函数:一种是操作Java的简单型数组的,另一种是操作对象类型数组的。 操作Java的简单型数组 因为速度的原因,...

zhiweiofli
2013/03/15
0
0
JNI学习笔记:二维数组的使用

1 前言 2 程序一:Java类中的二维数组成员传值给C++并求和 2.1 代码 2.2 总结 3 程序二:C++代码修改Java类中的二维数组 3.1 代码 3.2 总结 4 程序三:C++代码中返回一个二维数组给Java类 4....

whoisliang
2018/12/05
0
0
JNI开发流程与引用数据类型的处理

今天我们来看下Java JNI,先看下维基百科给的定义, JNI, Java Native Interface, Java本地接口,是一种编程框架,使得Java虚拟机中的Java程序可以调用本地应用或库,也可以被其他程序调用。...

juexingzhe
2018/05/04
0
0
Java中的引用和C++中引用的区别

用过java和C++的同学都知道在二者中均有引用的概念。但是这两个概念所代表的并不相同。 首先了解C++ 中引用的含义:“引用”即“别名”。C++中的引用代表的就是实际的存储空间。对其进行操作...

osDaniel
2013/12/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

pg_lightool基于basebackup的单表恢复和块恢复

开源软件pg_lightool,实现了基于wal日志的块恢复。详情参见博客:https://my.oschina.net/lcc1990/blog/1931485。由于wal日志中FPW的不确定性,它不能作为一个数据库恢复的解决方案。目前对...

movead
31分钟前
2
0
对比剖析Swarm Kubernetes Marathon编排引擎

Docker Native Orchestration 基本结构 Docker Engine 1.12 集成了原生的编排引擎,用以替换了之前独立的Docker Swarm项目。Docker原生集群(Swarm)同时包括了(Docker Engine \/ Daemons)...

Linux就该这么学
33分钟前
2
0
Mybatis的结果集处理

此时我们已经可以把整段的SQL语句取出,但还并没有在数据库中去执行,我们可以先来分析一下配置文件中SQL语句执行后的结果集是如何处理的。 Mybatis会将结果集按照映射配置文件中定义的映射规...

算法之名
45分钟前
23
0
Spring Boot(Spring的自动整合框架)

Spring Boot 是一套基于Spring框架的微服务框架,由于Spring是一个轻量级的企业开发框架,主要功能就是用于整合和管理其他框架,想法是将平时主流使用到的框架的整合配置预先写好,然后通过简...

花漾年华
48分钟前
2
0
Windows下条件变量的实现

条件变量是什么? 是一种同步对象。 条件变量有什么用? 用于复杂的、多线程的、多核的程序中,实现多个线程间同步任务。 条件变量与其它同步对象的区别? 与事件、互斥锁、segment等同步对象...

shzwork
50分钟前
2
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部