在函数内访问2D数组

时间:2015-09-21 09:53:08

标签: c arrays

我有一个接受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]。

3 个答案:

答案 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。这里ProcesspIn的代理,它需要包含与input一样多的元素,这不是一个非常优雅的解决方案。当您在编译时知道维度

时,传递input的更好方法
input

读取阵列衰减以更好地了解情况。

除了

相关

答案 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)
  • 投射malloc的结果毫无意义。
  • 请务必检查malloc的结果,并记得清理已分配的数据。