[英]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]地址,依此类推。
题:
创建2D数组时,会为这些'a','a [0]','a [1]','a [2]','a [3]'分配空间吗? 除了分配给a [0] [0],a [0] [1],a [1] [0] ... a [3] [4]的空间
为什么我无法检索“ 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
发生了什么。
当i == 0
, q
具有原始值。
当i == 1
,我们将q
加1
。
当i == 2
(最后一行)时,我们将2
加到q
。 但是,我们已经在上一迭代中添加了1
。 因此,现在q
比开始时多了3,因此指向数组的末尾。 当取消引用该指针时,我们得到不确定的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.