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

时间:2015-01-16 12:48:09

标签: c arrays pointers

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

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
}

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

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

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

我认为这个问题与指针尺寸&#34;首先取消引用,以便*array[i]*(*array + i)时不会访问预期的内存。使用这第二种表示法会使事情变得更加复杂和容易出错,从而抵消了使用&#34;&amp;&#34;在函数调用中。

有没有人建议如何更好地重写这个,以便在保持三重指针的同时在函数内部使用数组表示法?有没有办法影响&#34;指针维度顺序&#34;?

提前致谢。

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

2 个答案:

答案 0 :(得分:3)

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

*array[i]

不等于

(*array)[i]

但改为

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

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

请注意i == 0这个

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

装置

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

所以首先评估哪个运算符没有实际区别,但是i > 0会有差异。

答案 1 :(得分:1)

解决方案是:

struct MyStruct **arr = *array;

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