如果我有这样的结构:
struct S
{
int arr[10];
int x;
}
Run Code Online (Sandbox Code Playgroud)
如果我有一个功能
void some_fun( struct S myS );
Run Code Online (Sandbox Code Playgroud)
当我将struct S传递给该函数时,是否会正确复制数组,或者我必须将函数更改为:
void some_fun( struct S * myS ); ?
Run Code Online (Sandbox Code Playgroud)
我已经测试了这个(它没有指针就可以工作)但我对C/C++有点不安全,有时即使它是错误的也有效.
当我将struct S传递给该函数时,是否会正确复制数组
是的,它将被复制.
我是否必须将功能更改为:
void some_fun( struct S * myS )
您可能希望这样做有三个原因:
some_fun - 指针允许你这样做; 通过值不会编辑:由于这是C++,您可以选择传递struct引用:
void some_fun( S& myS ) // struct keyword is optional in C++
Run Code Online (Sandbox Code Playgroud)
要么
void some_fun( const S& myS ) // Do this if you do not plan on modifying myS
Run Code Online (Sandbox Code Playgroud)
通过引用传递避免以类似于通过指针传递的方式进行复制.与通过指针传递不同,通过引用传递指示读者struct传入引用内存中的某个位置,而指针则为您提供传递a的选项NULL.
如果您按值传递(就像您当前所做的那样),您的数组将由默认的复制构造函数复制(请参见此处:How are C++ arraymemberhandled in copy control functions?)。
如果您决定通过指针传递,则只会将指向同一结构的指针传递给它 - 因此您的数组将不会被复制,您对数组(或结构的任何其他成员)所做的任何更改都会反映回您在函数外部访问的对象。
最终,可以归结为以下几点来决定选择哪种方法: