如何解决通过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]);
}
如果要更改原始指针对象的值(即,如果要使存储在myArray
中的指针指向指针)即可。调用foo
后,strong>另一个分配了内存块。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。