让我说我有一个指向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我知道有(很多)其他方法可以达到相同的效果,我已经成功地使用了其中的一些。在这里,我有兴趣知道是否可以满足上述条件,同时更多地了解指针。
答案 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
。