如何解决&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 举报,一经查实,本站将立刻删除。