使用C

时间:2016-01-20 23:57:19

标签: c arrays pointers multidimensional-array

我的主要是

  int mat[ROW][COL];
  int *p = &mat[0][0];
  minput(p, ROW, COL);

我一直坚持如何制作minput,因为我应该使用set number初始化2d数组,但我只是不明白我应该如何分配数字,

我得到指针中的m [0] [0]为*(*(m+0)+0),但它不允许我做*(*(m+0)+0)=0;之类的内容,

因为它会出现invalid type argument of unary ‘*’ (have ‘int’)错误。

所以基本上我只是想知道如何使用指针为一个二维数组分配一个数字,如果我们不必使用指针这将很容易用m [2] [2] = 5而且除了我我不知道如何用指针做这个。

我的教授提供了一个minput函数的一行示例,它只是*(m+0) = 8;,这对我来说没有意义,是不是我们用于1d数组?如果这是做到这一点的方式,那么这意味着我应该做像

这样的事情
*(m+0) = 8;
*(m+1) = 1;
*(m+2) = 6;
*(m+3) = 3;
*(m+4) = 5;
*(m+5) = 7;
*(m+6) = 4;
*(m+7) = 9;
*(m+8) = 2;

对于3x3阵列?这对我来说似乎不对,如果有人可以帮我解决这个问题会很棒,指针对我来说很困惑。

编辑:所以我看到显然正确的方法就是我上面列出的方式 *(*(m+0)+0) = val

但是当我在我的代码中执行此操作时,我收到此错误:

error: invalid type argument of unary ‘*’ (have ‘int’)
  *(*(m+0)+2)=6;
  ^

为什么会这样?分配错了吗?

3 个答案:

答案 0 :(得分:1)

那是对的。你可以使用

*(m + (rowNumber*COL) + colNumber) = val

访问它。基本上,二维数组中的元素连续存储在存储器中,m指向它的开头。因此,您可以通过这种方式将其作为一维数组来实现。这就是为什么我们不使用像**这样的东西,因为它不是"指向指针的指针",即使它是一个二维数组。

答案 1 :(得分:1)

初始化*((p+0) + 0) = 1;的方式会使mat[0][0] = 1;

*((p+0) + 1) = 2; would be mat[0][1] = 2;
*((p+1) + 0) = 3; would be mat[1][0] = 3;

等。

答案 2 :(得分:1)

假设您将2D数组声明为arr[rows][cols]。然后:

  • arr指向第一个子阵列
  • arr + 1指向第二个子阵列
  • *(*(arr+2)+3)相当于arr [2] [3]

因此,如果您想将val分配给第二行的第一个元素,例如:

*(*(mat+1) + 0) = val;