如何通过引用传递结构的参数传递函数?

时间:2020-02-12 04:57:02

标签: c++ function data-structures

我正在编写程序,注意到它没有编译。我想知道为什么不能将结构数组作为引用数组传递。我的代码在下面

#include <iostream>
#include <cstring>
using namespace std;

struct a{
        int name;
};
void input(a & array1[10]){
        for(int i=0;i<10;i++){
                array1[i].name=i+1;
        }
}

void print(a & array1[10]){
        for(int i=0;i<10;i++){
                cout<<array1[i].name<<endl;
        }
}
int main(){ 
        a array1[10];
        input(array1[10]);
        print(array1[10]);
}

2 个答案:

答案 0 :(得分:1)

您通过引用传递数组的语法是错误的。

请参见下面的工作代码。

#include <iostream>
#include <cstring>
using namespace std;

struct a{
        int name;
};
void input(a  (&array1)[10]){
        for(int i=0;i<10;i++){
                array1[i].name=i+1;
        }
}

void print(a (&array1)[10]){
        for(int i=0;i<10;i++){
                cout<<array1[i].name<<endl;
        }
}
int main(){ 
        a array1[10];
        input(array1); // make sure you simply pass the array name
        print(array1);
}

Try it out yourself

由语言括号的语法所强制,必须像(&array1)中那样将array1括起来。如果不使用它们,您只是在传递一个引用数组 而不是对数组的引用

array1[10]是数组的第10个元素(在您的情况下实际上不存在,这只是数组外访问),而您需要传递第一个元素的地址与数组名称相同的数组,即数组名称衰减为指针。

答案 1 :(得分:1)

将数组传递给函数时:

  • <观点> 数组降级为指针。所以您不妨拥有 函数将参数声明为指针"a*",而不是 数组a[]

  • 该函数不知道array参数中有多少个项目。传递数组时,应该养成将“大小”作为参数传递给函数的习惯。

    • 在另一方面,作为指针传递的数组本质上是一个引用参数,而不是值(副本)参数。因此,您隐式地实现了通过引用传递数组和数组中所有项目的目标。

这可能就是您想要的。

#include <iostream>
#include <cstring>
using namespace std;

struct a {
    int name;
};

void input(a* array, size_t count){
    for(int i=0; i<count; i++) {
        array[i].name = i + 1;
    }
}

void print(a* array, size_t count) {
    for(int i=0; i<count; i++) {
        cout<<array[i].name<<endl;
    }
}
int main() { 
    a array1[10] = {};  // zero-init the array of a's
    input(array1, 10);
    print(array1, 10);
}