【问题标题】:Array length with pointers带指针的数组长度
【发布时间】:2025-12-02 15:25:02
【问题描述】:

如何在 C++ 中仅使用指针获取数组长度?我知道选项卡名称是指向第一个元素的指针,但接下来呢?

【问题讨论】:

    标签: c++ arrays pointers


    【解决方案1】:

    你做不到。您需要将数组长度与数组指针一起传递,或者您需要使用容器对象,例如std::vector

    【讨论】:

    • 在这一点上,我希望在 C++4x 完成时收集社会保障。
    • 我看不出有什么大不了的:你现在可以使用 boost::array。
    • 没什么大不了的;只是感叹 C++ 标准委员会的 Duke Nukem Forever 式的进步。
    【解决方案2】:

    你不能。指针只是一个内存位置,不包含任何可以确定大小的特殊内容。

    由于这是 C++,您可以通过引用传递数组,如下所示:

    template <typename T, size_t N>
    void handle_array(T (&pX)[N])
    {
        // the size is N
    
        pX[0] = /* blah */;
        // ...
        pX[N - 1] = /* blah */;
    }
    
    // for a specific type:
    template <size_t N>
    void handle_array(int (const &pX)[N]) // const this time, for fun
    {
        // the size is N
    
        int i = pX[0]; // etc
    }
    

    但除此之外,您需要像 Alok 建议的那样传递 start 和 end 并执行减法运算,或者像 Tyler 建议的那样放弃静态数组并使用向量。

    如果您知道要使用的数组的大小,可以创建typedef

    typedef int int_array[10];
    
    void handle_ten_ints(int_array& pX)
    {
        // size must be 10
    }
    

    只是为了尺寸:

    template <typename T, size_t N>
    size_t countof(T (&pX)[N])
    {
        return N;
    }
    
    template <typename T, size_t N>
    T* endof(T (&pX)[N])
    {
        return &pX[0] + N;
    }
    
    // use
    int someArray[] = {1, 2, 6, 2, 8, 1, 3, 3, 7};
    
    size_t count = countof(someArray); // 9
    std::for_each(someArray, endof(someArray), /* ... */);
    

    我不时使用这些实用功能。

    【讨论】:

    • 您最好使用typedef 创建一个数组类型,并接受对它的引用,以消除template,除非这些方法将在头文件中并且数组大小实际上是不同的(但仍然是编译时确定的)。
    • @Potatoswatter:我不知道有一种方法可以制作这样的 typedef。在通过调用实例化之前,函数不知道 N。我将添加一个 typedef 的示例,这是您的意思吗?
    • 是的,您添加的示例 typedef 就是我的意思。 template&lt;size_t&gt; 与自动调整大小的 int ary[] = {…}; 很好,但实例化可能不方便/令人困惑,而且除非数组像这样声明,否则好处很少 AFAIK。或者用户碰巧在使用几个固定尺寸。
    【解决方案3】:

    你的意思是这样的:

    int a[10];
    int *start = a;
    int *end = a + 10;
    size_t n = end - start; /* pointers! :-) */
    

    【讨论】:

    • 不,“end”指针通常是过去的一个(这是合法的),特别是 end - start = length,这样您就可以执行for (int* i = start; i != end; ++i) 之类的操作。
    【解决方案4】:

    你不能,除非你知道结束指针指向什么。在 char 数组的情况下,它是一个 '\0',所以你可以循环直到你读到那个字符来计算长度。

    【讨论】:

    • strings 的情况下,它通常是 \0。并非每个 char 数组都是字符串。