通过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>另一个分配了内存块。