*(ptr)[J ]的替代符号

Alternative notation to *(ptr)[j++]?

本文关键字:符号 ptr      更新时间:2023-10-16

将双重指针传递给函数时,我在功能中使用了符号*ptr[j++],这会导致程序崩溃。我猜想这是由于操作员的优先级而发生的,所以我通过编写(*ptr)[j++]进行了纠正,但我不喜欢这种符号。感觉很长,令人困惑。

我也知道符号ptr[0][j++],但我也不喜欢它。

我的代码:

#include <iostream>
using namespace std;
void mset(int **ptr, size_t size);
void main(void)
{
    const size_t size = 10;
    int *ptr = new int[size];
    mset(&ptr, size);
    for (size_t n = 0; n < size; n++) {
        std::cout << ptr[n] << std::endl;
    }
}
void mset(int **ptr, size_t size)
{
    size_t j = 0;
    while(j < size)
        (*ptr)[j++] = 3;
}

P.S我知道我可以写void mset(int *ptr, size_t size)并调用mset(ptr, size),但是我询问了该特定情况。

简单使用额外的间接水平,类似于:

auto p = *ptr;
for (size_t j = 0; j < size; ++j)
    p[j] = 3;

对于此特定情况,在mset(int **ptr, size_t size)内部,您永远不会使用ptr。但是使用解释(即*ptr)。因此,我建议通过指针参考

mset(ptr, size);
//   ^^^ pass simply     
void mset(int* const &ptr, const size_t size)
{        // ^^^ pointer reference which cannot change (prevents memory leak)
    size_t j = 0;
    while(j < size)
        ptr[j++] = 3;  // No dereferencing required
}

您也可以删除参考,因为您不打算在mset()中更改ptr的值。但是上述通过也可以使用main()的同一ptr

这是演示。
顺便说一句,符合标准的main()总是返回int

将级别的指针(int**不是 int*)称为 const,并且编译器会引起错误:

void mset(int const** ptr, size_t size)
{
    size_t j = 0;
    while (j < size)
        *ptr[j++] = 3; // ERROR
}

您确定基本指针不会更改,并且您不希望功能更改其内容,因此Make是const。但是,多级的指针确实会导致问题,最好使用参考 vectors,模板和其他更好/更新的替代方案。