精华内容
下载资源
问答
  • new创建多维数组时,最后需要用delete,但是我在delete时遇到了麻烦,实在不能再浪费时间了,先mark一下,至少创建多维数组这段是对的 以int型数组为例,我们知道 ...三维数组 int c[2][3][4] = {

    用new创建多维数组时,最后需要用delete,但是我在delete时遇到了麻烦,实在不能再浪费时间了,先mark一下,至少创建多维数组这段是对的

    以int型数组为例,我们知道

    一维数组  int a[4] ={1,2,3,4};

    二维数组  int b[3][4] = {1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4}

    三维数组  int c[2][3][4] = {1,2};


    那么用new方式如何创建呢

    一维数组有

    int *p1 = new int[4];

    二维数组有

    int (*p2)[4] = new int[3][4];


    三维数组

    int (*p3)[3][4] = new int[2][3][4];//两维三行四列


    同样的四位数组

    int (*p4)[2][3][4] = new int[1][2][3][4];//不知道怎么叫了


    忘了从哪里看到的说: 从二维数组开始,定义并不是写成  int *p2[4]、int * p3[3][4]、...这是因为int * p2[4]表示定义一个数组p2,该数组是int *型,数组内的每个元素都是指向int型的指针。

    	//step 1定义多维数组
    
    	//int *q1 = new int[4];  //创建一维数组,暂时不用
    	//int (*q2)[4] = new int[0][4];//创建二位数组,暂时不用
    	int (*p)[3][4] =  new int[2][3][4];//创建三维数组,本文研究的重点,我为了少打字,这个变量我定义成了p,并不是p3
    	//int (*p4)[3][4][5] = new int [0][3][4][5];//创建四维数组
    
    	//留个标记,用于
    	//存放这些数组的指针,用于验证是否delete时会用到
    	int *backup[24];
    	int imark = 0;
    
    	//循环将三维数组每个元素均赋值为1
    	printf("------初始化得到的二维数组----\n");
    	for(int i = 0;i< 2;i++)
    	{
    
    		for(int j = 0;j<3;j++)
    		{
    			for(int k = 0;k<4;k++)
    			{
    				printf("%d --->",(*(*(p+i)+j)+k));//初始化之前均为0
    				printf("%d ",*(*(*(p+i)+j)+k));//这里打印了new出来的三维数组,本层循环最后将每个值赋值成了1
    
    
    				backup[imark++] = (*(*(p+i)+j)+k);
    				*(*(*(p+i)+j)+k) = 1;//这里将每个元素赋值成了1,为的是方便后面delete时对比查看
    
    			}
    			printf("\n");
    		}
    
    	}
    
    	printf("---------------------\n");//
    
    	//step 2 准备检验
    
    	//前辈说书中讲的,数组的大小在之前的四个字节内存储着,究竟是啥呢,在这里可以打印查看printf("front 4 byte is %d, -->%d\n",&p[0][0][0]-1,(int)*(&p[0][0][0]-1));printf("p[0][0][0] address is %d\n",&p[0][0][0]);printf("p[1][2][3] address is %d\n",&p[1][2][3]);printf("\n");//这里尝试了好多种delete的方式都没有成功???╮(╯▽╰)╭
    	//第一种尝试,直接删除p数组,这个似乎从原理上很容易否定
    	/*
    	delete []p;//这种方式发现只删除了new出来的前两个元素
    
    	*/
    
    	//第二种尝试,借用一下保存的指针,用指针一个一个去free
    	/*
    	for(int i =0;i<24;i++)
    	{
    	delete backup[i];//用backup中记忆的位置一个一个删除,发现行不通,&backup[i]也行不通
    	//delete []backup;//这种也是行不通的,我注解上了,可以试试
    	}
    
    	*/
    
    	//第三种尝试,嵌套进入生成的数组,一层一层的去free,然而依然失败,不知道是重复删除了,还是怎么了,感觉是重复删除了
    	for(int i = 0;i<2;i++)
    	{
    		for(int j = 0;j<3;j++)
    		{
    			delete [] p[i][j];
    		}
    	delete []p[i];
    	}
    
    
    	//第四种尝试,一个一个删,但依然没有成功,我从大到小,先小到大均试了一次,依然失败,下面写的是从大到小
    	/*
    	delete p[1][2][3];//不要搞混乱,2*3*4维数组最大值就是这个
    	delete p[1][2][3];//不列写了,因为占篇幅,可以肯定的是没成功
    	//...
    	delete p[0][0][0];
    	*/
    
    
    	//这里面检查是否已经delete了
    	for (int i = 0; i < 24; i++) {
    		if ((i != 0) && (i % 4 == 0))
    		{
    			printf("\n");
    		}
    		printf("[%d]%d--->%d ", i, backup[i], (int) *backup[i]);
    	}
    	printf("\n");
    	return 0;
    


    我目前gdb方式还不会看,另外delete还学得不够深入,再钻进去周末别的也就看不成了,所以得先记下。


    另外粘一个别人new三维数组的方法

    int*** a= new int**[5];
    for (int i = 0; i < 5; ++i)
    {
         a[i] = new int*[6];
         for (int j = 0; j < 6; ++j)
        {
                a[i][j] = new int[7];
         }
    }
    for (int i = 0; i < 5; ++i)
    {
         for (int j = 0; j < 6; ++j)
         {
               delete[] a[i][j];
         }
         delete[] a[i];
    }
    delete[] a;


    就先到这里吧



    展开全文
  • 三维数组三维数组的指针

    千次阅读 2011-12-16 20:27:00
    本文主要给出三维数组三维数组的指针的使用方法,对于二维数组和二维数组的指针的使用请参见: http://apps.hi.baidu.com/share/detail/6320035 在讲述之前,还是先给出一段代码,之后,我将结合这一代码来跟...
    本文主要给出三维数组和三维数组的指针的使用方法,对于二维数组和二维数组的指针的使用请参见:
    在讲述之前,还是先给出一段代码,之后,我将结合这一代码来跟大家一起学习三维数组和三维数组的
    指针的妙用。
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    #define unsigned char u8
    #define ROW_MAX     10
    #define COLUMN_MAX     6
    #define GRID_MAX_SIZE     10
    using namespace std;

    int main(int argc, char *argv[]) {
          //定义一个三维数组
         char arr[ROW_MAX][COLUMN_MAX][GRID_MAX_SIZE];                               //P0
         //定义一个指向数组的指针parr
         char (*parr)[COLUMN_MAX][GRID_MAX_SIZE];
        
         char tmp[10];
         int i,j;
          //给三维数组赋初值
         for(j=0;j<ROW_MAX;j++)
         {
              for(i=0;i<COLUMN_MAX;i++)
              {
                   memset(tmp,0,sizeof(tmp));
                   sprintf(tmp,"%d.%d",j,i);
                   strcpy(arr[j][i],tmp);
              }
         }
        //打印三维数组的值
         for(j=0;j<ROW_MAX;j++)
         {
              for(i=0;i<COLUMN_MAX;i++)
              {
                   cout<<arr[j][i]<<" ";
              }
              cout<<endl;
         }
        
         cout<<endl;

         parr=arr;
         //将数组的指针指向三维数组
         
         
         
                                                    //P1

        
         for(i=0;i<5;i++)
         {
              cout<<arr[i]<<"\t"<<parr++<<"\t"<<(parr+1)<<endl;
                  //P2

         }
        
         parr=arr;
         for(i=0;i<COLUMN_MAX;i++)
         {    
              cout<<parr[i]<<"\t";                                                                    //P3
              cout<<*parr[i]<<"\t";
         
         
         
         
         
                                                //P4

              cout<<**(parr+sizeof(char)*10*i)<<"\t";                                  //P5
              cout<<((char (*)[GRID_MAX_SIZE])parr)[i]<<"\r\n";               //P6
         }
         cout<<endl;
          parr++;                                                                                               //P7
         for(i=0;i<COLUMN_MAX;i++)
         {
              //cout<<**(parr+sizeof(char)*10*i)<<" ";
               cout<<((char (*)[GRID_MAX_SIZE])parr)[i]<<" ";                      //P8
         }
         cout<<endl;
        
         return 0;
    }


    运行结果:

    0.0 0.1 0.2 0.3 0.4 0.5
    1.0 1.1 1.2 1.3 1.4 1.5
    2.0 2.1 2.2 2.3 2.4 2.5
    3.0 3.1 3.2 3.3 3.4 3.5
    4.0 4.1 4.2 4.3 4.4 4.5
    5.0 5.1 5.2 5.3 5.4 5.5
    6.0 6.1 6.2 6.3 6.4 6.5
    7.0 7.1 7.2 7.3 7.4 7.5
    8.0 8.1 8.2 8.3 8.4 8.5
    9.0 9.1 9.2 9.3 9.4 9.5

    0x22fcd2        0x22fcd2        0x22fd0e
    0x22fd0e        0x22fd0e        0x22fd4a
    0x22fd4a        0x22fd4a        0x22fd86
    0x22fd86        0x22fd86        0x22fdc2
    0x22fdc2        0x22fdc2        0x22fdfe
    0x22fcd2        0.0     0.0     0.0
    0x22fd0e        1.0     9.5     0.1
    0x22fd4a        2.0     O       0.2
    0x22fd86        3.0     P       0.3
    0x22fdc2        4.0     r       0.4
    0x22fdfe        5.0     \       0.5

    1.0 1.1 1.2 1.3 1.4 1.5


    << Program finished: exit code: 0 >>
    << Press enter to close this window >>


    结果分析:

    P0:
    定义一个三维数组arr,可以想像这是一个二维的表格,行数为10,列数6,每个单元格中都用来存放一个字符串,
    字符串的最大长度为10。同时,定义一个指向数组的指针parr(有别于指针数组)。

    为了更好好表现多维数组和数组的指针的使用与及二者之间的关系,我给数组进行了赋值。

    P1:
    将数组的指针指向指针的数组,这正是数组的指针的作用,下面将展示数组的指针的妙用

    P2:
    这句代码是用来展示数组的指针加1的情况。
    0x22fcd2        0x22fcd2        0x22fd0e
    0x22fd0e        0x22fd0e        0x22fd4a
    ……
    从上面运行结果,显而易见,数组的指针加1时地址偏移量并不是1,而是定义数组的指针时数组的大小,在这里,
    char (*parr)[COLUMN_MAX][
    COLUMN_MAX
    ];
    所以,偏移量为 COLUMN_MAX* COLUMN_MAX*sizeof(char)=60=0x3c
    这里的偏移量跟arr[i]之间的arr[i+1]的地址偏移是一样的

    P3~P7:
    用于展示怎样通过数组的指针来访问多维数组
    0x22fcd2        0.0     0.0     0.0
    0x22fd0e        1.0     9.5     0.1
    0x22fd4a        2.0     O       0.2
    0x22fd86        3.0     P       0.3
    0x22fdc2        4.0     r       0.4
    0x22fdfe        5.0     \       0.5
    从以上的运行结果,可见
    parr[i],为每行的首地址,即arr[i]
    *
    parr[i],指向每行的第一个单元格,即arr[i][0]
    **(parr+sizeof(char)*10*i),跟以上相似,也是访问某一行的第一个单元格
    在这里,因为,单元格是一行一行偏移的,所以要访问某一行中的非首个单元格,则要对
    parr作一些转换,如下所示:
    (char (*)[GRID_MAX_SIZE])parr
    上面这一句是将parr,强制转换成一维数组的指针,并且数组的大小为sizeof(char)* GRID_MAX_SIZE,
    此时,parr++的偏移就是 sizeof(char)*GRID_MAX_SIZE,而不是 COLUMN_MAX*COLUMN_MAX*sizeof(char)=60=0x3c
    故通过 ((char (*)[GRID_MAX_SIZE])parr)[i]可以访问一行中的任一个单元格,相当于arr[j][i]的作用。

    注意:P0和P6 *号两边的括号不可去掉,否则就成了指针数组了

    第一次写博客,有什么不对之处,望各位前辈达人,不吝指正……

    展开全文
  • 维数组 /* * 二维数组 * 1:定义,初始化 * int[][] arr2 = new int[3][3]; * 第1个3代表这个二维数组是由3个一维数组构成的 * 第2个3代表每个一维数组的元素的个数有3个 * * 二维数组分类 * 1:规则二维数组:...

    二维数组

    /*
     * 二维数组
     *   1:定义,初始化
     *   int[][] arr2 = new int[3][3];
     *   第1个3代表这个二维数组是由3个一维数组构成的
     *   第2个3代表每个一维数组的元素的个数有3个
     *   
     *   二维数组分类
     *     1:规则二维数组:每个一维数组的元素个数相同
     *     2:不规则二维数组:每个一维数组的元素个数不相同
     *   2:遍历
     *     普通for循环
     *     for---each
     *   3:内存分配
     *   4:二维数组的转置
     *   原二维数组
     *     a   b    c   d
     *     00  01   02  03
     *     e f g h
     *     j j k l
     *     
     *  
     *     
     *   
     *   
     *   
     *   二维数组的使用场合
     *   1:2D游戏地图
     *   2:省市联动
     *
     */

    public static void main(String[] args) {
        
        String[][] pro = {
                {"武汉市","黄冈市","黄石市"},
                {"西安市","咸阳市","宝鸡市","延安市"}
        };
        
        //1:定义,初始化  动态初始化  根据数组的长度,确定数组的元素的个数
        /*int[][] arr3 = new int[3][3];
        arr[0][0] = 10;
        arr[0][1] = 20;
        arr[0][2] = 30;
        arr[1][0] = 40;
        arr[1][1] = 50;
        arr[1][2] = 60;
        arr[2][0] = 70;
        arr[2][1] = 80;
        arr[2][2] = 90;*/
        //2:静态初始化   根据元素的个数,确定数组的长度
        int[][] arr2 = new int[][]{{10,20,30},{40,50,60},{70,80,90}};
        //静态初始化  根据元素的个数,确定数组的长度
        int[][] arr = {
                        {10,20,30,100},
                        {40,50,60,110},
                        {70,80,90,120}
                        };
        //外层循环的次数是二维数组中一维数组的的个数  普通for循环
        for(int j = 0;j<arr.length;j++){
            //里层循环的次数是每一个一维数组元素的个数
            for(int i = 0;i<arr[j].length;i++){
                System.out.println(arr[j][i]);
            }
        }

        //双层   for-each
        System.out.println("---------------------");
        for (int[] is : arr) {
            for (int i : is) {
                System.out.println(i);
            }
        }
        
        
        //不规则二维数组  先确定一维数组的个数  ,动态初始化
        String[][] str = new String[3][];
        //分别给每个一维数组,赋予长度
        str[0] = new String[3];
        str[1] = new String[4];
        str[2] = new String[5];
        //静态初始化
        String[][] str2 = new String[][]{{"a"},{"b","c"},{"d","e","f"}};
        
        String[][]  str3 = {
                            {"a"},
                            {"b","c"},
                            {"d","e","f"}
                            };
        

    }
     

     

    三维数组

    1.直接定义法,直接定义三维

     int a[][][] = new int[1][1][1];
    2.二维转三维,先定义若干二维,再直接填充进三维中.

     public final static int[][] a0 = {
       { 0, 1, 2}, {3,4,5}, {4,6,7} };
     public final static int[][] a1 = {
       { 0, 4, 6,}, {6, 8, 8, 6}, {8, 8, 6, 12, 14, 4, 4, 0} };
     public final static int[][][] as = {a0,a1 };

    展开全文
  • 三维数组

    万次阅读 2019-01-24 15:50:41
    定义一个三维数组,并初始化之。 写一个打印函数,负责打印三维数组中的数据,并测试。 2.代码运行结果: 3.代码 public static void main(String[] args) { //1、定义一个三维数组 int[][][] t = new int...

    1.需求

    定义一个三维数组,并初始化之。
    写一个打印函数,负责打印三维数组中的数据,并测试。
    

    2.代码运行结果:

    3.代码

       public static void main(String[] args) {
            //1、定义一个三维数组
            int[][][] t = new int[2][2][3];
    
            //2、初始化
            for (int i = 0; i < t.length; i++) {
                for (int j = 0; j < t[i].length; j++) {
                    for (int k = 0; k < t[i][j].length; k++) {
                        t[i][j][k] = i + j + k;
                    }
                }
            }
    
            //3、打印三维数组的方法测试
            print(t);
        }
    
        private static void print(int[][][] t){
            for (int i = 0; i < t.length; i++) {
                for (int j = 0; j < t[i].length; j++) {
                    System.out.println("t["+ i +"][" + j + "] = "+ Arrays.toString(t[i][j]));
                }
            }
        }

     

    展开全文
  • 1.一维数组转二维数组 /// <summary> /// 一维数组转2维数组(矩阵) /// </summary> /// <param name="obj"></param> /// <param name="len">矩阵行数</param> /// <...
  • JAVA基础之二维数组三维数组及应用

    千次阅读 2018-01-05 19:17:19
    描述:该二维数组中有个一维数组 每一个一维数组中有4个元素 打印二维数组的长度 相当于打印数组中有多少个一维数组 System.out.println(array.length); 结果为:3 System.out.println(array[0].leng...
  • //动态定义一维数组、二维数组、三维数组 #include #include using namespace std ; int main() { int hight , row , col ; register int i , j , k ; srand((unsigned)time(NULL)) ; cout输入一维数组的行"; cin>>...
  • java 二维数组,三维数组 ,糊糙数组,多维数组示例代码
  • 类型[] 变量名 = new 类型[数组元素个数];   int[]a = new int[10]; first index:0;max:length-1;1.2、创建和初始化数组:1.2.1、创建时指定大小: //创建时指定大小 int[] arrays = new int[2]; arrays[0] = 1...
  • c++定义动态二维数组二维指针vector 推荐使用 ...二维数组本身相当于是一维数组下存储指针,可以用new int[m]定义一维数组,但是不能定义new int[m][n] //定义m行n列数组 int **array = new int ...
  • 一位数组: 初始化:int[] arr = new int[5] = {1,2,3,4,5}; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace wm110_5 { class Program { static void
  • 1. 下面是为一维数组 / 二维数组 / 三维数组 动态分配内存 实现的代码: // 一维数组动态申请,a数组大小为: n int *a = new int[n]; // 二维数组动态申请,b数组大小为: n*p int **b = new int*[n]; ...
  • php三维数组转二维数组

    千次阅读 2017-12-05 21:40:15
    //循环遍历三维数组$arr3 foreach($result as $value){  foreach($value as $v){  $arr2[]=$v;  } } //销毁$arr3  unset($result,$value,$v); echo ...
  • 一、一维数组 两种创建数组的语法: 1、构造函数的形式: new Array()  2、创建字面量的形式: [ ] 那么下面我们来分别举个栗子: 第一种创建数组的方法举例 栗2: 用创建字面量的形式: 补充: 获
  • java输出三维数组

    千次阅读 2017-11-09 23:45:13
    三维数组
  • * 问题:定义一个三维数组,并初始化之。写一个打印函数,负责打印三维数组中的数据,并测试。 */ public class Test11 { public static void main(String[] args) { int[][][] arr = new int[2][][]; //对第一...
  • C++动态定义三维数组

    千次阅读 2018-09-29 19:06:13
    C++实验作业:动态创建三维数组,各维长度通过输入给定。 #include &lt;bits/stdc++.h&gt; using namespace std; int main() { int height, row, col; //依次为三维数组的高、行、列 cout &lt;&...
  • cout输入三维数组高,行,列 : "; cin>>hight>>row >> col ; int *** p3 ; p3 = new int**[hight ] ; for( i = 0 ; i ; i ++ ) p3[i] = new int*[row] ; for( i = 0 ; i ; i ++ ) for( j = 0 ; j ; j ++ ) p3[i]...
  • 今天为什么要把“二维数组”这个概念重新拎出来说一说呢。原因是这样的:前几天在用c++写银行家算法的时候,resource类的成员变量有二维数组,开始写的是默认初始化的方式,类似于这种: class A { ... ...
  • 维数组
  • 实现一个三维数组模版CArray3D,可以用来生成元素为任意类型变量的三维数组,使得下面程序输出结果是: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36...
  • php三维数组变二维数组

    千次阅读 2014-04-15 12:11:09
    //循环遍历三维数组$arr3 foreach($result as $value){ foreach($value as $v){ $arr2[]=$v; } } //销毁$arr3 unset($result,$value,$v); echo "<br /s>"; echo "第二种方法:"; echo '<pre>'...
  • 一维数组&三维数组

    千次阅读 2016-07-28 09:28:00
    编写多维数组使用方法的程序如下: package com.liaojianya.chapter1; /** * This program demonstrates the use of multiple array. * @author LIAO JIANYA * 2016年7月20日 */ public class ...
  • 项目中希望把一个RGB图和gray图进行合并,然后进行后续的数据处理,如下方式可实现两图之间的合并 ...new_image = np.zeros([h, w, 3]) new_image_gray = np.zeros([h, w]) img_merge = np.concate.
  • java数组--三维数组格式输出

    千次阅读 2019-09-21 14:11:36
    三维数组格式输出 输入: [ [0,0,0], [0,1,0], [0,0,0] ] public static void main(String[] args) { System.out.println("请输入矩阵"); Scanner sc = new Scanner(System.in); List<Stri...
  • 三维数组的循环遍历

    千次阅读 2019-10-09 06:01:14
    在前边提到过的二维数组的循环与遍历,如今由于项目需求的变化,导致在数据中出现一些三维数组,听着比二维数组多了一维,其实也差不多,相信前边看过我对二维数组操作的看下面的也就不觉得难了,直接上上代码: ...
  • cout输入三维数组高,行,列 : "; cin>>hight>>row >> col ; int *** p3 ; p3 = new int**[hight ] ; for( i = 0 ; i ; i ++ )  p3[i] = new int*[row] ; for( i = 0 ; i ; i ++ )  for( j = 0 ; j ...
  • matlab的三维数组(三维矩阵)

    万次阅读 2019-08-31 21:09:51
    matlab的三维矩阵与其他编程语言不太一样 比如: test4.java public class test4 { public static void main(String[] args) { int[][][] arr = new int[][][] { { {1,2,3}, {4,5,6}, }, ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 105,705
精华内容 42,282
关键字:

new三维数组