函数和二维数组的新认识(参数指定数组第二维和第一维大小)

函数和二维数组的新认识(参数指定数组第二维和第一维大小)
#include < stdio.h >
#define  ROWS 3
#define  COLS 4
void  sum_rows( int  arr[][COLS], int  rows);
int  main( void )
{
    
int  junk[ROWS][COLS] = {{ 1 , 2 , 3 , 4 },{ 5 , 6 , 7 , 8 },{ 9 , 10 , 11 , 12 }};
    
    sum_rows(junk,ROWS);
// 求出每行的数值总和。 
    
    getchar();
    
return   0 ;

void  sum_rows( int  arr[][COLS], int  rows)
{
    
int  r,c,tot;
    
for (r = 0 ;r < rows;r ++ )
    {
        tot
= 0 ;
        
for (c = 0 ;c < COLS;c ++ )
        {
            tot
+= arr[r][c];
        }
        printf(
" row%d,sum=%d\n " ,r,tot);
    }
}

我们都知道上面的代码可以顺利执行, sum_rows()的形参是 int arr[][COLS],没有指定数组的第一维大小。但是设想一下,如果不指定第二维的大小,结果会怎样呢?
我写了以下例子:
#include  < stdio.h >  
int  sum2d( int  arr[][], int  row, int  col); 
int  main( void

    
int  arr[3 ][4 ] = {{ 1 , 2,3,5 },{ 3 , 4,4,5 },{2,3,4,5}}; 
    sum2d(arr,3
,4 ); 
     
    getchar(); 
    
return   0 ;  

int  sum2d( int  arr[][], int  row, int  col) 

    
for ( int  i = 0 ;i  < row;i ++
    { 
        
for ( int  j = 0 ;j  < col;j ++
        { 
            printf(
" %d " ,arr[i][j]);  invalid use of array with unspecified bounds         
        } 
    } 
    
return   0

运行后发现,程序报错了,这是为什么呢?百思不得其解,后来请教了CSDN上老大们。终于稍微弄明白了点儿。我想具体应该从两方面证明为什么上面的程序不可行。
(1)从二维数组的存储方式上:二维数组在内存上是一行一行连续的存储的。如下图:
arr[3][4]
arr[0][0] arr[0][1] arr[0][2] arr[0][3] arr[1][0] arr[1][1] arr[1][2] arr[1][3] ...

因为arr是这个数组的首地址,我们可以知道arr[0][0]的地址。只要我们知道arr[][4]中数组第二维的大小‘4’,我们就可以找到任意行和列的地址。address=arr+(rows-1)*4+cols。但是如果不知道第二维的大小,那么条件就不够了。打一个比方,将若干个学生分成每组11人,并让他们站成一排,这时我们可以定位出第几组的第几个学生。但如果不知道每组11个人,那么我们显然就无法定位了。

(2)从指针的角度上看(这种思路我还是有点迷糊):大家可以参看这个帖子: http://topic.csdn.net/u/20080520/09/2122e210-5cf5-4b75-b31f-c2523b00cf53.html?575319732

恩,现在是越学越迷惑了。呵呵。

你可能感兴趣的:(函数和二维数组的新认识(参数指定数组第二维和第一维大小))