【发布时间】:2021-02-13 10:55:24
【问题描述】:
我已经成功尝试将二维数组传递给函数,请参见下面的代码。我不明白:为什么我的“方法 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 ROWS, 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], ROWS, COLUMNS); // method B: Works too.
print_table(&table, ROWS, COLUMNS); // method C: Doesn't work! Why?
return 0;
}
【问题讨论】:
-
编译器的错误信息给你一个非常易读的解释。你不清楚哪一部分?
&table的类型是int (*)[3][2],错误消息对此很有帮助。不能转换为int *。 C++ 不能以这种方式工作。table[0][0]是int(好吧,int &,学究式),所以&table[0][0]是int *。结束。 -
打印表需要一个指向 int 的指针,而
&table是表的地址,它的类型为int[3][2],因此您正在发送一个指向[3][2]int 数组的指针。 -
指向二维整数数组的指针。
-
谢谢你们! @TonyTannius 你的添加让我明白了!
-
阅读en.cppreference.com/w/c/language/array,它说的是数组到指针的转换,以及更多关于同一主题的c++特定部分en.cppreference.com/w/cpp/language/array
标签: c++ arrays pointers multidimensional-array pass-by-reference