簡體   English   中英

C ++ 2D數組和指針引用

[英]c++ 2d array and pointer references

在下面的代碼中,將arr傳遞給如下的轉置函數並以a [0]的形式檢查a的內容時,它給出的是0x00 ... 001,而不是arr所檢查的原始地址,為什么這樣,是什么?錯了嗎? 我期望a [0]是數組1的地址,而a [0] [1]是數組的第一個元素。 請解釋。

問題:

int arr[][4] = { { 1, 2, 3, 4},{ 5, 6,7,8 },{ 9,10,11,12 } };
    transpose((int **)arr, 3, 4);
    int** transpose(int** a, int m, int n)
    {
        int** output = new int*[n];
        for (int i = 0;i < m;i++)
        {
            output[i] = new int[n];
        }
        for (int i = 0;i < m;i++)
        {
            for (int j = 0;j < n;j++)
            {
                //*((output[j]) + i) = *(a[i] + j);
                //*((output[j]) + i) = a[i][j];
                output[j][i] = a[i][j];
            }
        }
        return output;
    }

引發異常。

工作正常:

 int** output=transpose((int *)arr, 3, 4);
    print(output,3,4);
    int**transpose(int * a, int m, int n)
    {
        int** t = new int*[n];
        for (int i = 0;i < n;i++)
        {
            t[i] = new int[m];
        }
        for (int i = 0;i < m;i++)
        {
            for (int j = 0;j < n;j++)
            {
                t[j][i] = *((a + i*n) + j);
            }
        }
        return t;
    }

    void Matrix::print(int ** a, int m, int n)
    {
        for (int i = 0;i < m;i++)
        {
            for (int j = 0;j < n;j++)
            {
                std::cout << a[i][j] << ",";
            }
            std::cout << "\n";
        }
    }

為了使您的代碼與二維數組一起使用,應修改代碼,如下所示。

int arr[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
transpose(&arr, 3, 4);

int** transpose( int(*a)[3][4], int m, int n)
{
    int** output = new int*[n];
    for (int i = 0; i < m; i++)
    {
        output[i] = new int[n];
    }
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            //*((output[j]) + i) = *(a[i] + j);
            //*((output[j]) + i) = a[i][j];
            if (i < n && j < m )
            {
                output[j][i] = (*a)[i][j];
            }
        }
    }
    return output;

查看參數聲明int(*a)[3][4] 它說變量a是指向大小為[3] [4]的二維數組的指針。 額外檢查if (i < n && j < m )確保數組訪問不會超出范圍。

它將毫無例外地工作!

首先,在您的示例中, m為3, n為4,因此在轉置函數中,您將使用n (4)個指針創建輸出,但隨后您需要從0到m (3)的for循環,因此,此時輸出已未初始化元素(輸出[3])。 它崩潰的原因是您在下一個循環中使用了該未初始化的元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM