繁体   English   中英

将二维数组传递给函数

[英]Passing 2-D Array to a Function

以下代码部分起作用。 请帮助找出错误

#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;
}

我只能打印前两个子数组。对于第三个(最后一个)子数组,我会得到垃圾值

其他问题

在上面的代码中-

 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.

2D数组的名称中的“ a”存储“ a [0]”第一子数组地址。

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

题:

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

  2. 为什么我无法检索“ a”和“ a [0]”,“ a [1]”,“ a [2]”,“ a [3]”的地址。 每当&与他们相关联时,我都会得到a [0] [0],a [1] [0],a [2] [0]的地址

错误在这里:

q=q+i;

这首先使q增加0,然后增加1,然后增加2,导致q丢失第三个元素并直接跳到第四个元素(在您的情况下,该索引越过数组的末尾,给出了垃圾值)。

您需要每次q++;加一q++; 并且您需要将其放在循环的末尾。 或者,您可以完全删除此行,而改用它:

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

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

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" ) ;
}

试试这个。 在下面的代码中,有一个简单的指针,并在其中分配一个地址,并根据该地址进行打印,因为此地址保留数组q+i的基地址的地址,然后从该地址开始偏移量。

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");
}
q=q+i;

让我们跟踪循环中每次q发生了什么。

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

  2. i == 1 ,我们将q1

  3. i == 2 (最后一行)时,我们将2加到q 但是,我们已经在上一迭代中添加了1 因此,现在q比开始时多了3,因此指向数组的末尾。 当取消引用该指针时,我们得到不确定的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM