问题描述
我已经成功尝试将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”才是正确的。