C ++按值传递struct数组

时间:2014-07-17 20:04:55

标签: c++ arrays struct pass-by-reference pass-by-value

我无法理解为什么要将包含元素的数组传递给 一个函数,导致我的数组不再包含函数内的元素。

在传入包含3个对象的数组之前,我的项目是sturct,大小为 数组是72(每个对象24)。一旦进入函数,我的数组的大小 是24,我假设是我的数组中第一个元素的大小。但是,这个 事实并非如此。

我的问题是,为什么我的数组在函数中与函数之外的相同?

标题文件:

#include <iostream>
using namespace std;

// header file for shop items
struct items
{
    string name;
    int price;
    string examine;
};

主文件:

#include "shop_items.h"
#include <iostream>

using namespace std;

int getLongestName(items &shop)
{   
    /*Iterates over each element in array
     if int longest < length of element's name, longest = length of element's name.*/

    int longest = 0;

    // shop size is 24, the size of a single element.
    cout << "sizeof(shop) right inside of function:" << sizeof(shop) << endl; 

    return longest;
}

void test1()
{   
    // initialize shop items
    items sword;
    items bow;
    items shield;

    // set the name, price, and examine variables for each item.
    sword.name = "sword";   sword.price = 200;  sword.examine = "A sharp blade.";
    bow.name = "bow";       bow.price = 50;     bow.examine = "A sturdy bow.";
    shield.name = "sheild"; shield.price = 100; shield.examine = "A hefty shield.";

    // create an array for iterating over the each element in item shop.
    items shop[] = {sword, bow, shield};

    //sizeOfShop = 72, 24 for each element (the sword, bow and shield).    
    cout << "sizeof(shop) right outside function: " <<  sizeof(shop) << endl; 


    int longest = getLongestName(*shop);

}

int main()
{
    test1();
    cout << "\n\nPress the enter key to exit." << endl;
    cin.get();
}

What is useful about a reference-to-array parameter?

上述问题的答案帮助我更好地理解了我试图做的事情。但是,在尝试通过引用传递数组时,我遇到了不同的错误。

1 个答案:

答案 0 :(得分:1)

您没有传递数组。您只传递数组的第一个元素。

int longest = getLongestName(*shop);

表达式*shop等同于shop[0]因此,在函数内部,您可以获得items类型的一个对象的大小。

此外,您将函数getLongestName声明为具有类型为item的对象的类型引用参数。

int getLongestName(items &shop);

如果你想通过引用传递整个数组,那么你应该将它声明为

int getLongestName( items ( &shop )[3] );

并且必须将该函数调用为

int longest = getLongestName(shop);

或作为

int getLongestName(items *shop, size_t n);

其中第二个参数指定数组中元素的数量。

该函数必须被称为

int longest = getLongestName(shop, 3 );