C ++范围?将数组传递给函数

时间:2017-05-23 19:25:12

标签: c++ c scope

请考虑以下代码。这会生成以下输出:

Length: 64 Testfn: 8 Length again: 64

我无法理解为什么test - 函数的输出不等于main函数的输出。考虑到test - 函数的输出等于8,我认为这是因为sizeof(arg)得到指针的大小而不是数组本身。

这对我来说似乎都是合乎逻辑的,但为什么sizeof在主函数中没有给出相同的值?我该如何解决?我已经尝试了一些解除引用的东西,但这似乎没有任何区别。

#include <iostream>

void test(int arg[]) {
    std::cout << "Testfn: " << sizeof(arg) << std::endl;
}

int main() {
    int int_arr[16];
    std::cout << "Length: " << sizeof int_arr << std::endl;
    test(int_arr);
    std::cout << "Length again: " << sizeof int_arr << std::endl;
}

2 个答案:

答案 0 :(得分:3)

功能参数

void test(int arg[]) {

调整为指向int类型的指针。这是以下函数声明

void test(int arg[16]);
void test(int arg[]);
void test(int *arg);

是等价的。

因此在函数内部使用sizeof( int * ),取决于使用平台通常等于4或8。

您可以在C ++中声明该函数,如

void test(int ( &arg )[16]) {
    std::cout << "Testfn: " << sizeof(arg) << std::endl;
}

即将参数声明为对数组的引用,在这种情况下,您将获得预期的结果。

答案 1 :(得分:1)

如果您使用C++11或更高版本,则std::array就是您所需要的:

#include <iostream>
#include <array>

template<size_t N>
void test(const std::array<int, N>& arg) {
    std::cout << "Testfn: " << arg.size() << std::endl;
}

int main() {
    std::array<int, 16> int_arr;
    std::cout << "Length: " << int_arr.size() << std::endl;
    test(int_arr);
    std::cout << "Length again: " << int_arr.size() << std::endl;
}