传递给函数的数组对象的大小
Size of array object passed to function
我正在c++中运行以下代码:
class Tile {
//class definition
};
bool myFunction(Tile* Tiles) {
sizeof(Tiles);
sizeof(Tiles[0]);
//other code
}
int main () {
Tile tiles [16];
//other stuff
myFunction(tiles);
return 0;
}
当我像上面描述的那样使用sizeof方法时,它只给我指针的大小,而不是实际对象的大小。我试着找出这个物体的大小。我的问题是,我如何获取给定指针的对象的大小? 数组自然会衰变成指针,当它们这样做时,所有的大小信息都丢失了。最常见的解决方案是将数组中的元素数量作为参数传递。也可以使用模板来推断数组的大小。
或者
使用std::array
(或std::vector
,视情况而定)代替,这是我推荐的解决方案。
最简单的c语言方式是将数组的大小作为参数传递。
bool myFunction_ver1(Tile* Tiles, std::size_t size)
{
//...
}
但是c++提供了更多。由于数组大小包含在数组的数据类型中,因此模板可以提供帮助。数组应该通过引用传递,以防止数组被调整为指针。
template <std::size_t N>
bool myFunction_ver2(const Tile (&Tiles)[N])
{
// N is the array size
}
但我们更倾向于使用std::array
或std::vector
而不是原始数组。
template <std::size_t N>
bool myFunction_ver3(const std::array<Tile, N>& Tiles)
{
// You may use N or Tiles.size()
}
bool myFunction_ver4(const std::vector<Tile>& Tiles)
{
// use Tiles.size()
}
原始数组作为函数参数衰减为指针,因此与类型相关的任何长度信息都将在不使用模板的情况下被擦除。因此,使用原始数组,您可以将数组的大小作为参数传递。
bool myFunction(std::size_t n, Tile tiles[n]) {
std::size_t z = n * sizeof(Tile);
// etc...
}
使用std::vector
或std::array
通常是更好的解决方案。
回答我自己的问题:
为什么我张贴这个答案
我当时是c++的新手,其他问题都被标记为这个问题的副本。因此,我猜其他类似的问题都是c++新手提出的。这个答案是为了那些新手的利益。
我的答案
与Python或JAVA等高级语言不同,数组的长度是而不是与数组内容一起存储的,因此无法访问它。
因此,必须作为单独的参数传递。它在高级语言中可能没有多大意义,但在C和c++中都是必要的。
另外,与Python和JAVA不同,数组是而不是对象。要完全理解C/c++数组,首先必须理解指针。
相关文章:
- 将对象数组的引用传递给函数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 类对象数组的问题会导致崩溃
- Arduino C++在构造函数中用参数声明对象数组
- 使用对象数组对 SFML 进行动画处理
- C++ 对象数组堆栈溢出
- 如何将对象数组作为参数传递给模板
- 使用向量初始化参数化构造函数的对象数组
- 如何初始化对象数组?
- C++创建对象数组
- 在对象数组中搜索字符串并返回相应值的函数
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 如何在运行时在对象数组中动态追加新对象C++并打印它们
- 为什么我在声明对象数组时不能使用 -> 运算符?
- 编译时生成应在构造函数中创建的非 constexpr 对象数组
- 使用 C++ 创建对象数组
- 对象数组打印空白字符串
- 重载运算符 [] 用于从对象数组中给出特定索引
- 如何在 C++ 中使用提升属性树从 JSON 文件中读取对象数组