c-通过ref传递数组会导致编译器警告-如何正确使用指针算术


void foo(int **arr)
{
**arr = 5;     // works fine, no warnings and myArray[0] is 5 after call.
*(arr+5) = 5;  //warning - assignment makes pointer from integer without a cast - why?
*(arr)[5] = 5; //No warnig but programm would crash
}   
int main()
{
int *myArray = (int*)calloc(10,sizeof(int));
foo(&myArray); //no warning but myArray[5] would be still 0
foo(myArray);  //warning - passing argument 1 of 'foo' from incompatible pointer type (but works fine)
printf("%d",myArray[5]);
return 0;
}

如何将数组正确地传递给我的函数,并在没有任何警告的情况下访问myArray[5]?

如前所述,索引到arr的正确方法是

(*arr)[5] = 5;

由于arr是指向数组指针的指针,因此您不希望索引到arr,而是希望索引到arr指向的。您需要将*arr显式分组,因为像[]这样的后缀运算符的优先级高于一元*

话虽如此,传递指向myArray的指针的唯一原因是,如果您希望更改myArray本身的值,例如调用realloc。如果这不是目的,那么最好像Antti和Peter所展示的那样编写函数。

由于foo采用指向整数指针的指针,因此在此处调用foo(&myArray)是正确的。但你根本不需要这么做。只需传入myArray并让foo取一个指向int的指针:

void foo(int *arr)
{
arr[5] = 5;
}   
int main()
{
int *myArray = calloc(10, sizeof(int)); // no need to cast here unless compiling with a C++ compiler
foo(myArray);
printf("%d",  myArray[5]); // prints 5
return 0;
}

我知道指针可能会让人困惑,但这里似乎有一个非常根本的误解,所以我建议再次仔细阅读任何好的C教材的指针部分。

像这样:

#include <stdio.h>
#include <stdlib.h>
void foo(int *arr) {
arr[5] = 5;
}   
int main(void) {
int *myArray = calloc(10, sizeof(int));    
foo(myArray);    
printf("%d", myArray[5]);
}

如果您想更改原始指针对象的值(即,如果您想在调用foo后使存储在myArray中的指针指向另一个分配的内存块(,您只需要通过引用传递指针

最新更新