我有一个接受int * pInput []作为参数的函数。
void Process(int* pInput[], unsigned int num);
我必须通过2种方法调用此函数
main()
{
int *pIn[2];
int input[2][100] = {0};
pIn[0] = ( int* )malloc( 100 * sizeof( int) );
pIn[1] = ( int* )malloc( 100 * sizeof( int) );
Process( pIn, 2 );
Process( ( int** )input, 2 );
}
然后如何访问函数内的pInput的每个值'过程'?我无法直接访问pIn [0] [0]。
答案 0 :(得分:3)
如何在函数'Process'中访问pInput的每个值?我不能直接以pIn [0] [0]的形式访问它。
没有!您可以完全按照这种方式访问它:pInput[0][0]
如果您传递的输入是pIn
。这是因为pIn
是一个int*
的数组。它的类型为int *[n]
,每个元素指向一个int
的数组。它会衰变为int**
。
但是,如果你想传递input
,一个int
的二维数组,你需要做更多的事情,因为一个二维数组不会衰变成一个双指针,{{1}但是指向数组的指针T**
。这是因为数组衰减不是递归的,它只发生在第一级。或者,您可以执行此操作(Live example)
T (*) [n]
现在将pIn[0] = input[0];
pIn[1] = input[1];
传递给pIn
。这里Process
是pIn
的代理,它需要包含与input
一样多的元素,这不是一个非常优雅的解决方案。当您在编译时知道维度
input
的更好方法
input
读取阵列衰减以更好地了解情况。
void Process(int (*pInput)[100], size_t rows) { }
void Process(int input [2][100], size_t rows) { }
/* These two are the same; the compiler never sees the `2`. input's type is int(*)[100] */
的返回值。malloc
的返回类型应为main
。答案 1 :(得分:1)
在您的process()函数中,您只需要像任何2d数组一样正常访问它,如下所示。两种方式都是一样的。
void Process( int * pInput[], unsigned int num)
{
printf(" %d", pInput[0][0]); //printing value of pInput[0]
printf(" %d", pInput[1][0]); //printing value of pInput[1]
pInput[0][0] = 8054; // changing its value.
pInput[1][0] = 8055; // changing its value.
}
int main()
{
int *pIn[2];
int input[2][100] = {0};
pIn[0] = ( int* )malloc( 100 * sizeof( int) );
pIn[1] = ( int* )malloc( 100 * sizeof( int) );
// assigning value to array.
pIn[0][0] = 23;
pIn[0][1] = 2;
pIn[1][0] = 5689;
pIn[1][1] = 5643;
Process( pIn, 2 ); //calling process funtion
printf(" %d", pIn[1][0]); //printing the changed value by process funtion.
}
答案 2 :(得分:0)
你会感到困惑,因为你在不需要的时候会使用不同的类型。数组遵循与任何其他类型相同的间接规则。如果要动态分配普通int
,则应编写int* x = malloc(sizeof(*x));
。在阵列方面,简单地做同样的事情。不要混淆“#s;阵列衰变到指针"规则。
所以我们有int input[2][100]
,非常简单,它是一个普通的2D数组。现在,如果你想动态分配它,你需要一个指向这样一个数组的指针:
int (*pIn)[2][100]; // pointer to an array of int [2][100].
pIn = malloc(sizeof(*pIn));
整个程序将是:
#include <stdlib.h>
void Process (size_t num, int pInput[num][100])
{
}
int main (void)
{
int (*pIn)[2][100];
int input[2][100] = {0};
pIn = malloc(sizeof(*pIn));
if(pIn == NULL)
{
// error handling
return 0;
}
Process(2, *pIn);
Process(2, input);
free(pIn);
return 0;
}
评论:
size_t
是用于数组大小的最正确类型,因为它是sizeof
运算符返回的类型。所以它只是一个带有花哨名称的无符号整数。int pInput[num][100]
实际上会衰减为指向100 int数组的数组指针。您不需要知道要使用它,只需使用pInput[x][y]
并假装它是一个2D数组。这里重要的是要理解数组不是按值传递的。int main (void)
。