使用数组表示法访问函数内的三重指针

Accessing a triple pointer inside a function with array notation

假设我在 main 中有一个指向结构的双指针(即指向结构的指针数组),我想将它传递给一个函数,它将被填充。假设我想将每个 "output" 传递给前面带有“&”的函数,以便清楚哪些参数是输出。这意味着在函数中我必须处理三重指针。

void fillarray(int elements, struct MyStruct *** array, int * output) {
    // fill the array
        // (see below)
    // return output
    *output = ...
}

int main() {
    // some code
    // ...

    int elements_count = 10;
    int some_int_output;

    struct MyStruct ** = malloc(elements_count * sizeof(struct MyStruct *));
    for (i = 0; i < elements_count; i++) {
        array_of_pointers[i] = malloc(sizeof(struct MyStruct));

    fillarray(elements_count, &array_of_pointers, &some_int_output);

    // some code
    // ...
    }

现在我想使用数组表示法访问(并填充)函数内的数组:

for (i = 0; i < elements; i++) {
    *array[i] = ... // ONLY WORKS FOR i=0 THEN SEGFAULT
}

类似于我如何 return 整数输出 (*output = ...)。

相反,我发现访问它的唯一(?)方式是:

for (i = 0; i < elements; i++) {
    *(*array + i) = ... // WORKS FOR ALL ELEMENTS
}

我认为问题与 "pointer dimension" 首先被解除引用有关,因此 *array[i] 不会访问预期的内存,而 *(*array + i) 会访问。使用第二种表示法会使事情变得更加复杂和容易出错,抵消了在函数调用中使用“&”的(假定的)优势。

有没有人建议如何更好地重写它,以便在函数内部使用数组符号,同时保留三重指针?有没有办法影响 "pointer dimension order"?

提前致谢。

PS 我知道有(许多)其他方法可以达到相同的结果,我已经成功地使用了其中的一些。在这里我有兴趣知道是否可以满足上述条件,同时进一步了解指针。

不跟运算符优先级有关,这个

*array[i]

不等同于

(*array)[i]

而是

*(array[i]) => *(*(array + i))

因为数组下标运算符的优先级高于间接运算符,所以加括号使第一个表达式生效。

注意 i == 0 这个

*(array[i]) => *(*(array + i))

表示

*(array[0]) => *(*(array + 0)) => *(*array) == *(*array + 0)

所以首先评估哪个运算符并没有真正的区别,但是 i > 0 会有区别。

一个解决方案是:

struct MyStruct **arr = *array;

现在您可以像普通双指针一样使用arr