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
中的指针指向另一个分配的内存块(,您只需要通过引用传递指针。