&table [0] [0]和&table有什么区别?

问题描述

我已经成功尝试将2D数组传递给函数,请参见下面的代码。我没有得到什么:为什么我的“方法C”(请参见下面的代码)不起作用?

&table[0][0]&table有什么区别?他们两个都指向相同的内存地址。前者作为传递给我函数的参数,后者则不,错误消息:

"no kNown conversion from 'int (*)[3][2]' to 'int *' for 1st argument void print_table(int *table,const int ROWS,const int COLUMNS)

提前谢谢!亚历克斯

#include <iostream>
void print_table(int *table,const int COLUMNS)
{
    for (int i = 0; i < ROWS; i++)
    {
        for (int j = 0; j < COLUMNS; j++)
        {
            std::cout << table[i * COLUMNS + j] << "\t";
        }
        std::cout << "\n";
    }
}

int main()
{
    const int ROWS = 3;
    const int COLUMNS = 2;
    int table[ROWS][COLUMNS] = {{1,2},{3,4},{5,6}};

    std::cout << (int*)table << "\n";     // these 3 couts all deliver the same memory address      
    std::cout << &table[0][0] << "\n";    // these 3 couts all deliver the same memory address
    std::cout << &table << "\n";          // these 3 couts all deliver the same memory address

    print_table((int*)table,ROWS,COLUMNS);   // method A: Works.
    print_table(&table[0][0],COLUMNS);  // method B: Works too.
    print_table(&table,COLUMNS);        // method C: Doesn't work! Why?
    
    return 0;
}

解决方法

主要区别:实际指向的内容及其类型。

表达式&table指向数组table本身,其类型为int(*)[3][2]

表达式&table[0][0]是指向子数组table[0]中单个元素的指针,其类型为int*

“方法A”起作用的原因(即使它是错误的)是因为两个指针恰好都指向相同的位置。

如果我们绘制您的数组,那么它将看起来像这样(添加了“指针”):

+-------------+-------------+-------------+-------------+-------------+-------------+
| table[0][0] | table[0][1] | table[1][0] | table[1][1] | table[2][0] | table[2][1] |
+-------------+-------------+-------------+-------------+-------------+-------------+
^
|
&table
|
&table[0]
|
&table[0][0]

我添加了&table[0],因为这就是平原table衰减。它将具有类型int(*)[2]。这是您作为“方法A”传递的指针。如果不强制转换为int*,该方法也会失败。

通常来说:每当您需要进行C风格的转换(例如“方法A”)时,都应将其视为做错了事的迹象。

简而言之:只有“方法B”才是正确的。