将指针数组作为参数传递给C中的函数

时间:2017-07-29 16:23:14

标签: c arrays pointers

我已经编写了一段代码,但我不确定它是如何工作的。 我想创建一个指针数组并将其作为参数传递给函数,如下所示:

int main()
{

    int *array[10] = {0};

    for(int i = 0; i < 3; i++)
    {
        array[i] = (int *)malloc(3*sizeof(int *));
    }

    testFunction(array); 

    for(int i = 0; i < 3; i++)
    {
        free(array[i]);
    }

    return 0;
}
void testFunction(int *array[3])
{
     //do something

    return;
}

我不明白以下内容。我将array声明为指针数组,使用malloc为其分配内存,然后继续调用testFunction。我想通过引用传递数组,并且我理解当我使用testFunction(array)调用该函数时,数组会衰减到指向其第一个元素的指针(也将是一个指针)。但为什么在参数列表中我必须用(int *array[3])编写*而不只是(int array[3])

3 个答案:

答案 0 :(得分:1)

type *的参数可以接受type []的参数,但不能接受type中的任何参数。

如果你写void testFunction(int arg[3])它很好,但你无法访问array[1]array[2]等等,只有前3个元素array[0]指向的地方。还需要修改(使用testFunction((int*)array);调用。

作为一种好的做法,必须使函数参数与作为参数传递的内容一致。因此int *array[10]可以传递给f(int **arg)f(int *arg[]),但 f(int *arg) f(int arg[])

答案 1 :(得分:0)

void testFunction(int **array, int int_arr_size, int size_of_array_of_pointers) 
{
    for(int j = 0; j < size_of_array_of_pointers; j++)
    {
         int *arrptr = array[j];   // this pointer only to understand the idea. 
         for(int i = 0; i < int_arr_size; i++)
         {
             arrptr[i] = i + 1;
         }
    }
}

int main()
{    

    int *array[10];

    for(int i = 0; i < sizeof(array) / sizeof(int *); i++)
    {
        array[i] = malloc(3*sizeof(int));
    }

    testFunction(array, 3, sizeof(array) / sizeof(int *)); 

    for(int i = 0; i < sizeof(array) / sizeof(int *); i++)
    {
        free(array[i]);
    }

    return 0;
}

答案 2 :(得分:-1)

Evering取决于warning: ISO C++ forbids zero-size array 'cstr' [-Wpedantic] 在您的情况下的含义。

让我们从简单开始:也许,你只需要整数数组

如果您的函数仅更改数组中的值但不更改大小,则可以将其作为// do somethingint *array传递。

int array[3]只允许使用大小为int *array[3]的数组,但如果您可以使用3选项int的任何数组,则需要额外的参数int *array

int size

下一步:如果需要指针数组

参数应为void testFunction(int *array, int arr_size) { int i; for(i = 0; i < arr_size; i++) { array[i] = i + 1; } return; } 或更好int *array[3](指针指针)。

查看初始化循环(我将int **array更改为sizeof(int *)

sizeof(int)

我想你需要二维数组,所以你可以传递for(int i = 0; i < 3; i++) { array[i] = (int *)malloc(3*sizeof(int)); } 但是大小为二维或一个大小的矩形(高度等于宽度):

int **array

最后:2D阵列的内存分配

考虑void testFunction(int **array, int wSize, int hSize) { int row, col; for(row = 0; row < hSize; row++) { for(col = 0; col < wSize; col++) { array[row][col] = row * col; } } } 的以下变体:

main

请注意,int main() { int **array; // allocate memory for 3 pointers int* array = (int *)malloc(3*sizeof(int *)); if(array == NULL) return 1; // stop the program // then init these 3 pointers with addreses for 3 int for(int i = 0; i < 3; i++) { array[i] = (int *)malloc(3*sizeof(int)); if(array[i] == NULL) return 1; } testFunction(array, 3, 3); // First, free memory allocated for int for(int i = 0; i < 3; i++) { free(array[i]); } // then free memory allocated for pointers free(array); return 0; } 返回的值应在使用前检查(NULL表示未分配内存)。

出于同样的原因,可以在函数内添加检查:

malloc