如果我有这样的结构:
struct S
{
int arr[10];
int x;
}
如果我有一个功能
void some_fun( struct S myS );
当我将 struct S 传递给该函数时,数组是否会被正确复制,或者我是否必须将函数更改为:
void some_fun( struct S * myS ); ?
我已经对此进行了测试(并且它在没有指针的情况下工作)但是我对 C/C++ 有点不安全,有时即使它是错误的它也可以工作。
当我将结构 S 传递给该函数时,数组是否会被正确复制
是的,它会被复制。
我是否必须将功能更改为:
void some_fun( struct S * myS )
您可能出于以下三个原因想要这样做:
some_fun
- 指针可以让您这样做;按值传递不编辑:由于这是 C++,您可以选择struct
通过引用传递:
void some_fun( S& myS ) // struct keyword is optional in C++
或者
void some_fun( const S& myS ) // Do this if you do not plan on modifying myS
通过引用传递避免了以类似于通过指针传递的方式进行复制。与通过指针传递不同,通过引用传递向读者表明struct
传入的引用引用了内存中的某个位置,而指针为您提供了传递 a 的选项NULL
。
如果您按值传递,就像您目前所做的那样,您的数组将被默认的复制构造函数复制(参见例如:如何在复制控制函数中处理 C++ 数组成员?)。
如果您决定通过指针传递,则只会将指向同一结构的指针传递给它 - 因此您的数组不会被复制,您对数组(或结构的任何其他成员)所做的任何更改都将反映回您在函数之外访问的对象。
最终,归结为这些事情来决定选择哪种方法:
它将传递您的数据结构的副本。这很好,除非你想some_fun
改变你传入的实际数据结构,然后你需要一个指针或引用。
当您放置一个具有 const 边界的数组时,不再决定运行时结构的大小。所以在你的情况下,数组是结构的一部分,而不是存储在不同的地方。很简单:是的,它将被解析为函数!
您有 3 个选项:
本地复制版本:
void some_fun( struct S myS );
指针版本:
void some_fun( struct S* myS );
参考版本:
void some_fun( struct S& myS );
在后两者中,对 myS 所做的更改将是持久的(影响原始实例)。在第一种情况下,您将拥有一个本地副本。