2012-11-29 138 views
1

当将结构传递给函数时,原型/头文件会是什么样子?将结构的成员传递给函数时它们的外观如何?将结构和结构成员传递给函数

例如...

struct a_struct{ 
int a; 
int b; 
}; 

a_struct point; 

void f1(a_struct) 
void f2(a_struct) 

并让说,我想整个结构传递到F1,但只是为了F2成员。我会使用数据类型a_struct作为参数吗?或者f2有一个不同的数据类型,因为我只传递一个int类型的成员。这对于一系列结构会有所不同吗?我已经负责编写的程序应该使用结构数组。我认为这不会有太大的区别,只不过它会自动通过引用传递。

+0

我有一本书,并通过彻底翻阅以及在线搜索。这本书概述了结构的基本用法,它没有任何明确说明它们如何传递给函数的内容。虽然我在网上发现了一些,但我没有发现关于传递结构数组的任何信息。 – user1768079

+0

'struct'是正常类型和正常参数。一旦你了解了基础知识,以及如何使用函数及其参数,你就会找出你的问题的答案。你不能像这样通过这本书。 –

回答

7

当传递对象(不仅仅是标量值)时,您必须关心内存所有权和复制等问题。这意味着您有多个选项可以为您的函数声明接口。例如,您可以通过引用传递或按值传递。

为你可能的声明可能是:

void f1(a_struct& my_struct); 

这将传递给a_struct对象的引用,防止对象的任何拷贝。但是,您的示例结构只包含标量值,因此复制对象的可能性不会引起太多担心。其结果是,这就够了:

void f1(a_struct my_struct); 

至于传递结构的成员成一个函数,该函数将需要被声明为成员的类型。例如,要通过a_struct到一个函数的一员,你会怎么做:

void f1(int val); 

最后,数组做复杂的事情,因为他们会来作为一个函数指针。例如,通过a_struct对象的数组,你会作出这样的声明:

void f1(a_struct* my_struct); 

但是,你可以简单地再正常参考参数。例如:

my_structs[1]; 
+1

我在这里修正了明显的语法错误:'struct'是一个关键字,所以你不能用它作为标识符。 –

0

当你想传递一个结构(或类):当你想通过它的成员之一,让我们说a在这种情况下

return_type fn_name(object_name) 

。除非我错了,否则除非明确指定,否则所有函数参数都默认为按值传递。如果你需要传递数组,那么它将与其他类型的语法相同。

0

如果你想传递只是一个成员函数的值发送它的类型 例如a_struct作为参数的'a'的函数应该是 void func(int a);

但它将工作的价值。如果你想使用呼叫参考使用指针。

3

对于f1采取一种a_struct,如果你希望能够到内f1编辑它依赖。 void f1(a_struct s);将正常工作,并进行复制。 void f1(const a_struct & s);需要参考,但是你不能改变它(反正没有一些麻烦)。我尽量避免使用非const引用。

如果你想f2采取int,你写void f2(int);。它并不关心int来自哪里(即在struct之内或者它自己)。然后把它叫做f2(point.b);

带数组的函数可能很麻烦,这取决于你想用它做什么。最简单的方法是记住数组退化为指针。

void f3 (a_struct * const structArray) 
{ /* Do something */ } 
a_struct myArray[10]; 
f3(myArray); 

还有其他(更好)的方法来做到这一点。

编辑: 如果你想将一个函数应用到数组的每个元素,有(表面上看)两种方法(如果你仔细考虑它,实际上只有一种方法)。在数组上循环,并将每个元素传递给一个函数,该函数接受一个a_struct,或传入整个数组(并带有大小参数),然后在函数内循环。即你会做:

a_struct myArray[10]; 
for (int i = 0; i < 10; ++i) 
{ 
    f1(myArray[i]); 
} 

// Or, better, from <algorithm> 
std::for_each(myArray, myArray+10, f1); 

请注意,这不是一个出界访问。只要它永远不会被解除引用,你肯定会被允许制作一个指针一个离开数组的末尾(正好适用于这些循环的情况)。

当然,这一切都假定你真的想要一个数组,而不是一个std::vector(在这种情况下,环看基本上是相同的,除非你将使用begin()end()成员函数)。

事实上,如果你有c++11访问,您可以使用std::begin()std::end(),这将连续工作vector秒或阵列完全相同。

+0

感谢您的及时回应。这是我的想法。如果我通过一个特定的地方,如可以说我有 ,我想通过一个循环所有的对象1 ... 1使用循环... a_struct对象[5]; f1(object [],i) 或只是像 f1(object [i]) – user1768079