刘加加在成长(C++语言学习中)

学习、工作、生活,这是三个问题。

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  38 随笔 :: 0 文章 :: 24 评论 :: 0 Trackbacks
#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

恩,现在是越学越迷惑了。呵呵。
posted on 2008-05-20 22:31 刘加加 阅读(855) 评论(0)  编辑 收藏 引用 所属分类: 学习C语言

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理