将二维数组传递给函数

时间:2011-12-30 10:01:46

标签: c arrays pointers multidimensional-array

以下代码部分有效。请帮助弄清楚错误

#include<stdio.h>
#include<stdlib.h>
void show ( int ( *q )[4], int row, int col )
{
  int i, j ;
  for ( i = 0 ; i < row ; i++ )
  {
    q=q+i;
    for ( j = 0 ; j < col ; j++ )
        printf ( "%d ", * ( *q + j ) ) ;
    printf ( "\n" ) ;
  }
  printf ( "\n" ) ;
}

int main( )
{
 int a[3][4] = {
                {1, 2, 3, 4},
                {5, 6, 7, 8},
                {9, 0, 1, 6}
              } ;
 show ( a, 3, 4 ) ;
 return 0;
}

我只能打印前两个子阵列。对于第3个(最后一个)子阵列,我得到垃圾值

额外问题

在上面的代码中 -

 show ( a, 3, 4 ) ; Through this statement I am passing 'a'. In this case 'a' contains the address of first subarray a[0]. This a[0] address in stored in (*q)[4].

 In show() since q contains a[0] address i am looping through and printing all elements in first sub array (i.e) 1,2,3,4

 In show() again using statement q++, the value of q is changed to point to a[1] (i.e) second sub-array. Then through looping all the elements in 2nd subarray are printed. This process continues.

这里'a'二维数组的名称存储'a [0]'第一个子数组地址。

a [0]第一个子数组存储第一个元素a [0] [0]地址,依此类推。

问题:

  1. 当创建我的2D数组时,会为这些'a','a [0]','a [1]','a [2]','a [3]'Isn'分配空间它?除了分配给[0] [0]的空间,a [0] [1],a [1] [0] ...... a [3] [4]

  2. 为什么我无法检索'a'和'a [0]','a [1]','a [2]','a [3]'的地址。每当&amp;与它们相关联我得到[0] [0],[1] [0],[2] [0]

  3. 的地址

4 个答案:

答案 0 :(得分:4)

错误在于:

q=q+i;

首先将q增加零,然后增加1,然后增加2,使其错过第三个元素并直接跳到第四个元素(在你的情况下,这个索引超过数组的末尾,给出垃圾值)

每次q++;都需要加1,你需要将它放在循环的末尾。或者,您可以完全删除此行并使用此行:

for (j = 0; j < col; j++) {
    printf("%d ", q[i][j]);
}

答案 1 :(得分:2)

为什么不使用简单的东西:

void show ( int q[][4], int row )
{
  int i, j ;
  for ( i = 0 ; i < row ; i++ )
  {
    /* We already know there are four "columns", no need for a parameter */
    for ( j = 0 ; j < 4 ; j++ )
      printf ( "%d ", q[i][j] ) ;
    printf ( "\n" ) ;
  }
  printf ( "\n" ) ;
}

答案 2 :(得分:0)

q=q+i;

让我们跟踪每次循环时q会发生什么。

  1. i == 0时,q具有原始值。

  2. i == 1时,我们会将1添加到q

  3. i == 2(最后一行)时,我们会将2添加到q。但是,我们已在上一次迭代中添加了1。所以现在q比开始时多3个,因此指向刚好超过数组的末尾。当我们取消引用此指针时,我们会得到未定义的行为。

答案 3 :(得分:0)

试试这个。在下面的代码中,有一个简单的取指针并在其中分配地址,并根据该打印。因为该地址保存数组q+i的基地址的地址,然后从那里增加offset。 / p>

int i, j;
int *p;
for (i = 0; i < row; i++) {
    p = q + i;
    for (j = 0; j < col; j++) {
        printf("%d ", *(p + j));
    }
    printf("\n");
}