微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决&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”才是正确的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。