【问题标题】:Pass pointer as reference to array将指针作为对数组的引用传递
【发布时间】:2015-02-08 05:18:26
【问题描述】:

我正在尝试编写一个模板函数,该函数利用数组的长度,只给出引用。我知道以下代码有效

template <unsigned S>
void outputArray(int (&a)[S]) {
    // S = length of array
}

int main() {
    int a[6] = {0};
    outputArray(a);
}

我现在尝试通过使用动态分配的数组来扩展它。我很确定这是不可能的,因为前一种情况下的数组大小是在编译时确定的,但我可能是错的。

void readFile(int*) {
    int a_temp[MAX_DATA]; // MAX_DATA is predefined constant
    int length;

    // a_temp and length assigned from file
    a = new int[length];
    memcpy(a, &a_temp, sizeof(int)*length);
}

template <unsigned S>
void outputArray(int (&a)[S]) {}

int main()  {
    int* a;

    readFile(a);
    outputArray(a); // This is where my problem lies --- Mismatched types
}

当然,不相关的逻辑会被截断。正如您在 readFile 函数中看到的那样,我正在从文件中读取可变长度数组。但是,我不知道如何使用指针将数组作为 int [S] 类型传递给 outputArray 函数。

我仅限于使用数组(没有 C++ 向量),因为这是一项家庭作业。如果我绝对无法将指针作为int [S] 类型传递,那么我将采用简单的方法,让 readFile 函数返回数组长度的值。

【问题讨论】:

    标签: c++ arrays


    【解决方案1】:

    你不能这样做。

    C 风格的数组不携带有关其长度的信息,并且使用 C++ 类型构造并不能让您绕过这个事实。如果您想要一个知道自己长度的数组,则需要创建自己的数据类型,或者更好的是,使用标准容器类之一,例如 std::vector

    【讨论】:

    • 这并不完全正确。模板可以为您提供所有在编译时发生的大小。 stackoverflow.com/questions/3368883/…
    • @EdS.,是的,如果你想获得技术,C 风格的数组在编译时有一个大小,这就是允许“数组大小”函数工作的原因。这个问题是询问在运行时创建的数组,它在编译时没有大小。
    • 对不起,你是对的;我浏览得太快了,在你的回答中看到了“C 风格的数组”,我认为它是指实际的数组。
    猜你喜欢
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多