gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:25:12 25 4
gpt4 key购买 nike

假设我在 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
}

我认为问题与首先取消引用哪个“指针维度”有关,因此 *array[i]*(*array + i ) 确实如此。使用第二种表示法会使事情变得更加复杂和容易出错,抵消了在函数调用中使用“&”的(假定的)优势。

有没有人建议如何更好地重写它,以便在函数内部使用数组符号,同时保留三重指针?有没有办法影响“指针维度顺序”?

提前致谢。

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

最佳答案

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

*array[i]

不等于

(*array)[i]

而是为了

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

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

注意对于 i == 0 这个

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

表示

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

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

关于c - 使用数组表示法访问函数内的三重指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27984341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com