以下代码部分有效。请帮助弄清楚错误
#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]地址,依此类推。
问题:
当创建我的2D数组时,会为这些'a','a [0]','a [1]','a [2]','a [3]'Isn'分配空间它?除了分配给[0] [0]的空间,a [0] [1],a [1] [0] ...... a [3] [4]
为什么我无法检索'a'和'a [0]','a [1]','a [2]','a [3]'的地址。每当&amp;与它们相关联我得到[0] [0],[1] [0],[2] [0]
答案 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
会发生什么。
当i == 0
时,q
具有原始值。
在i == 1
时,我们会将1
添加到q
。
当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");
}