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