Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以用C+;确定数组的大小/长度吗+;不需要硬编码?_C++_Arrays - Fatal编程技术网

C++ 我可以用C+;确定数组的大小/长度吗+;不需要硬编码?

C++ 我可以用C+;确定数组的大小/长度吗+;不需要硬编码?,c++,arrays,C++,Arrays,我基本上是在寻找某种“动态”方式,将数组的大小/长度传递给函数 我试过: void printArray(int arrayName[]) { for(int i = 0 ; i < sizeof(arrayName); ++i) { cout << arrayName[i] << ' '; } } void打印数组(int-arrayName[] { 对于(int i=0;i类,它还有其他的优点。 TL;DR回答:使用

我基本上是在寻找某种“动态”方式,将数组的大小/长度传递给函数


我试过:

void printArray(int arrayName[])
{
    for(int i = 0 ; i < sizeof(arrayName); ++i)
    {
        cout << arrayName[i] << ' ';
    }
}
void打印数组(int-arrayName[]
{
对于(int i=0;i在C++中,太长了,读不下去了,在运行时不可能知道数组的大小。如果需要,可以考虑使用<代码> STD::vector < /Cuff>类,它还有其他的优点。

TL;DR回答:使用<代码> STD::向量< /代码> .<


但是我意识到它[
sizeof()
]只考虑它的字节大小,而不考虑数组中有多少元素

这本身并不是问题:您仍然可以使用
sizeof(array)/sizeof(array[0])
获得数组的大小,但问题是当传递给函数时,数组会衰减为指向其第一个元素的指针,因此您所能得到的只是
sizeof(t*)
(t是数组中元素的类型)

关于
*arrayName++

这至少把我所有的东西都印出来了,但比我想象的要多

我甚至不明白是什么促使你用这种方式计算数组的大小。这段代码所做的就是增加数组中的第一个对象,直到它为零

运行程序几次后,我意识到我输入的数组最后一个元素后的值始终是:-858993460

这是一个糟糕的假设,它还依赖于未定义的行为。你不能真正确定数组的第一个元素之后内存中有什么,你甚至不应该访问它



基本上,在C++中,如果你想从函数中知道原始数组的大小,那么你必须手动跟踪它(例如,添加一个额外的<代码> sisigt大小< /Cord>参数),因为数组被传递给函数(记住,它们“衰变成指针”)。如果你想要更灵活的东西,考虑从C++标准库中使用<代码> STD::或者向量你想存储的任何类型的对象——它有一个<代码> siz()/<代码>方法,它正好符合你想要的。

< P>当你把数组的长度传递到<代码> PrimaTray< /Cord>,你可以使用<代码> siZeof(数组)/siZeof(数组)[0])
,也就是说,整个数组的字节大小除以单个元素的字节大小,就得到了数组本身的元素大小


<> P>更重要的是,在C++中,你可能会发现学习和更喜欢这些原始数组,这是你的优势,除非你正在做一个家庭作业,要求你学习原始数组。成员函数会给你矢量中的元素数量。

使用-858993460值是非常不可靠的。事实上,不正确


可以通过两种方式传递数组的长度:传递附加参数(例如
size\u t length
),或者在数组的末尾加上一个特殊的值。首选第一种方法,但使用第二种方法,例如,按char*

传递字符串,正如所有其他答案所说,您应该使用
std::vector
,或者像您已经做的那样,将数组的元素数传递给打印函数


另一种方法是将sentinel元素(一个您确信它不会在数组中的值)放在数组的末尾。然后在打印函数中循环遍历元素,找到sentinel后停止打印。

一种可能的解决方案:您可以使用模板推断数组长度:

template <typename T, int N>
int array_length(T (&array)[N]) {
    return N;
}
关键是模板化构造函数不是显式的,因此可以将数组转换为实例,捕获大小,然后衰减为指针

注意:所示的包装器不适合拥有动态大小的数组,只是为了方便地处理静态大小的数组。为了简洁起见,它还缺少各种运算符和默认构造函数。一般来说,对于一般用途,首选
std::vector
std::array



…OP自己的尝试完全在别处解决…

在C/C++中,本机数组一传递到函数,就降级为指针。因此,“length”参数必须作为函数的参数传递

C++提供std::vector集合类。确保在将其传递给函数时,通过引用或指针传递(以避免在传递数组时复制数组)

#包括
#包括
void printary(std::vector和arrayName)
{
size_t length=arrayName.size();
对于(尺寸i=0;isizeof
会得到它的字节大小,然后除以每个元素的字节大小,得到元素的数量。但是现在,由于你有一个指针而不是数组,所以调用
sizeof
只会给出大小指针(通常是4或8个字节)的数组,而不是数组本身,这就是失败的原因

第二次尝试 本例中的while循环假设数组以零结尾,这是非常糟糕的(除非您确实使用了零作为终止符,例如以null结尾的字符串)如果您的数组没有以零结束,则可能访问的不是内存,因此调用未定义的行为。可能发生的另一件事是,您的数组在中间有一个零元素,然后只打印前几个元素。

第三次尝试 你在数组末尾发现的这个特殊值可以随时更改。这个值正好在这里,下次可能会不一样,所以像这样硬编码是非常危险的,因为同样,你可能会访问不属于你的内存

您的最终代码 此代码是正确的,并传递数组的长度al
void printArray(int *arrayName)
{
    while (*arrayName)
    {
        if (*arrayName == -858993460)
        {
            break;
        }
        cout << *arrayName << ' ';
        *arrayName++;
    }
    cout << '\n';
}
include <iostream>
include <conio.h>

using namespace std;

    // functions prototypes
void printArray (int arrayName[], int lengthArray);

    // global variables

    //main
int main ()
{
    int firstArray[] = {5, 10, 15};
    int secondArray[] = {2, 4, 6, 8, 10};
    printArray (firstArray,3);
    printArray (secondArray,5);

    // end of program
    _getch();
    return 0;
}

    // functions definitions
void printArray(int arrayName[], int lengthArray) 
{
    for (int i=0; i<lengthArray; i++)
    {
        cout << arrayName[i] << " ";
    }
    cout << "\n";
}
template <typename T, int N>
int array_length(T (&array)[N]) {
    return N;
}
template <typename T>
struct array {
    T *a_;
    int n_;

    template <int N> array(T (&a)[N]) : a_(a), n_(N) {}
};
void printArray(array<int> a)
{
    for (int i = 0 ; i < a.n_; ++i)
        cout << a.a_[i] << ' ';
}
int firstArray[] = {5, 10, 15};
int secondArray[] = {2, 4, 6, 8, 10};
printArray (firstArray);
printArray (secondArray);
#include <vector>
#include <string>

void printArray(std::vector<std::string> &arrayName)
{
    size_t length = arrayName.size();
    for(size_t i = 0 ; i < length; ++i)
    {
        cout << arrayName[i] << ' ';
    }
}

int main()
{
    std::vector<std::string> arrayOfNames;
    arrayOfNames.push_back(std::string("Stack"));
    arrayOfNames.push_back(std::string("Overflow"));
    printArray(arrayOfNames);

    ...
}
#include <iostream>
#include <vector>
#include <cstddef>

void print_vec(const std::vector<int>& v)
{
    std::size_t len = v.size();

    for (std::size_t i = 0; i < len; ++i)
    {
        std::cout << v[i] << std::endl;
    }
}

int main()
{
    std::vector<int> elements;

    elements.push_back(5);
    elements.push_back(4);
    elements.push_back(3);
    elements.push_back(2);
    elements.push_back(1);

    print_vec(elements);

    return 0;
}