#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恩,现在是越学越迷惑了。呵呵。