如何在C++中使用動態三維數組


1. 使用new和delete來構造
在使用new申請內存時,在使用過后,一定要采用delete來進行釋放內存。
使用該方法創建動態數組時,需要由數組的角標依次向右進行創建;
同時,也需要依照角標,從左到右來進行刪除。

代碼功能為:聲明三維動態數組,將角標和進行相加並添加到mfc的list中,然后釋放內存。
具體代碼如下

//聲明三維數組,長處分別為X_Length,Y_Length,Z_Length

    int X_Length = 5, Y_Length = 6, Z_Length = 7;//長度定義

    double ***DD;//聲明指針
    DD = new double **[X_Length];//定義X的長度

    for (int x = 0;x < X_Length; x++)//在X的內部,定義Y
    {
        DD[x] = new double *[Y_Length];//定義Y的長度

        for (int y = 0; y < Y_Length; y++)//在xy的內部,定義Z
        {
            DD[x][y] = new double [Z_Length];//定義Z的長度
        }
    }

    //數組的聲明完成,可以對數組進行操作
    //比如將數組的角標的和,並顯示在表格中
    int count_number = 0;

    for (int i = 0;i < X_Length; i++)
    {
        for (int j = 0; j < Y_Length; j++)
        {
            for (int k = 0; k < Z_Length; k++)
            {
                DD[i][j][k] =  i + j + k;
                CString temp;
                m_list.InsertItem(count_number,_T(""));
                

                temp.Format(_T("%d"),count_number+1);m_list.SetItemText(count_number,0,temp);
                temp.Format(_T("%d"),i);m_list.SetItemText(count_number,1,temp);
                temp.Format(_T("%d"),j);m_list.SetItemText(count_number,2,temp);
                temp.Format(_T("%d"),k);m_list.SetItemText(count_number,3,temp);
                temp.Format(_T("%f"),DD[i][j][k]);m_list.SetItemText(count_number,4,temp);
                count_number++;
            }
        }
    }

    //用完數組后,用delete將內存釋放
    for (int x = 0; x < X_Length; x++)
    {
        for (int y = 0; y < Y_Length; y++)
        {
            delete [] DD[x][y];//釋放Z這一層
        }
    }
    for (int x = 0; x < X_Length; x++)
    {
        delete [] DD[x];//釋放Y這一層
    }
    delete [] DD;//釋放X這一層
在進行生成數組時,一定要弄清楚x、y、z之間的關系。

2. 使用malloc和free來構造
malloc memory中文叫動態內存分配,用於申請一塊連續的指定大小的內存塊區域以void類型返回分配的內存區域地址,當無法知道內存具體位置的時候,想要綁定真正的內存空間,就需要用到動態的分配內存

使用思路和new相同,都是先申請內存,然后使用,使用結束后釋放內存。

// 用malloc 和 free來生成三維動態數組
    int X_Length = 5, Y_Length = 10, Z_Length = 7;//長度定義

    double ***DD;//聲明指針
    DD = (double***)malloc(sizeof(double**)*X_Length);//X的長度
    for (int x = 0; x < X_Length; x++)
    {
        DD[x] = (double **)malloc(sizeof(double*)*Y_Length);//Y的長度
        for (int y = 0;y < Y_Length;y++)
        {
            DD[x][y] = (double *)malloc(sizeof(double)*Z_Length);//Z的長度
        }
    }

    //數組的聲明完成,可以對數組進行操作
    //比如將數組的角標的和,並顯示在表格中
    int count_number = 0;

    for (int i = 0;i < X_Length; i++)
    {
        for (int j = 0; j < Y_Length; j++)
        {
            for (int k = 0; k < Z_Length; k++)
            {
                DD[i][j][k] =  i + j + k;
                CString temp;
                m_list.InsertItem(count_number,_T(""));


                temp.Format(_T("%d"),count_number+1);m_list.SetItemText(count_number,0,temp);
                temp.Format(_T("%d"),i);m_list.SetItemText(count_number,1,temp);
                temp.Format(_T("%d"),j);m_list.SetItemText(count_number,2,temp);
                temp.Format(_T("%d"),k);m_list.SetItemText(count_number,3,temp);
                temp.Format(_T("%f"),DD[i][j][k]);m_list.SetItemText(count_number,4,temp);
                count_number++;
            }
        }
    }


    //用完數組后,用free將內存釋放
    for (int x = 0; x < X_Length; x++)
    {
        for (int y = 0; y < Y_Length; y++)
        {
            free(DD[x][y]);//釋放Z
        }
    }
    for (int x = 0; x < X_Length; x++)
    {
        free(DD[x]);//釋放Y
    }
    free(DD);//釋放X
3.構造函數來生成數組
從1、2中的例子可以看出,每次使用數組時,需要聲明數組和釋放內存,操作特別繁瑣,因此可以將其寫成子函數的形式,來簡化操作。

3.1 聲明數組函數
double ***CtestdataDlg::Shuzu(int X_Length,int Y_Length,int Z_Length)
{
    double ***DD;//聲明指針
    DD = new double **[X_Length];//定義X的長度

    for (int x = 0;x < X_Length; x++)//在X的內部,定義Y
    {
        DD[x] = new double *[Y_Length];//定義Y的長度

        for (int y = 0; y < Y_Length; y++)//在xy的內部,定義Z
        {
            DD[x][y] = new double [Z_Length];//定義Z的長度
        }
    }
    return DD;
}
3.2 釋放內存函數
void CtestdataDlg::DeleteShuzu(double ***DD,int X_Length,int Y_Length,int Z_Length)
{
    //用完數組后,用delete將內存釋放
    for (int x = 0; x < X_Length; x++)
    {
        for (int y = 0; y < Y_Length; y++)
        {
            delete [] DD[x][y];//釋放Z這一層
        }
    }
    for (int x = 0; x < X_Length; x++)
    {
        delete [] DD[x];//釋放Y這一層
    }
    delete [] DD;//釋放X這一層
}
3.3 應用函數
void CtestdataDlg::OnBnClickedButton3()
{
    
    m_list.DeleteAllItems();

    int X_Length = 5, Y_Length = 4, Z_Length = 3;
    double ***DD = Shuzu(X_Length,Y_Length,Z_Length);//構造數組

    int count_number = 0;

    for (int i = 0;i < X_Length; i++)
    {
        for (int j = 0; j < Y_Length; j++)
        {
            for (int k = 0; k < Z_Length; k++)
            {

                DD[i][j][k] =  i + j + k;
                CString temp;
                m_list.InsertItem(count_number,_T(""));
                temp.Format(_T("%d"),count_number+1);m_list.SetItemText(count_number,0,temp);
                temp.Format(_T("%d"),i);m_list.SetItemText(count_number,1,temp);
                temp.Format(_T("%d"),j);m_list.SetItemText(count_number,2,temp);
                temp.Format(_T("%d"),k);m_list.SetItemText(count_number,3,temp);
                temp.Format(_T("%f"),DD[i][j][k]);m_list.SetItemText(count_number,4,temp);
                count_number++;
            }
        }
    }
    //釋放內存
    DeleteShuzu(DD,X_Length,Y_Length,Z_Length);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM