变长数组(VLA)的原型写法、声明位置及变长数组的本质

  变长数组(variable-length array)是C语言C99标准中新增加的内容,此处所谓的“变”并非在说该类型的数组在创建后可修改大小,变长数组的大小在创建后也是不能修改的。那为什么此处称为“变长”呢,是因为变长数组的维可以用变量来指定。这一点特性弥补了C99之前的变量维度只能用常量或常量表达式指定的不足。

  变长数组是有一些限制的,变长数组只可在函数内部或作为函数参数声明。并且在声明是不能初始化。

  来看一个例子:

  编写一个程序,初始化一个3x5的二维double数组,并利用一个基于变长数组的函数把该数组复制到另一个二维数组。还要编写一个基于变长数组的函数来显示两个数组的内容。这两个函数应该能够处理任意的NxM数组。

 1 #include <stdio.h>

 2 

 3 void copy(int row,int col, double arr[][col],double tar[row][col]);

 4 void show(int,int,double arr[*][*]);

 5 

 6 int main(void){

 7     

 8     double num[3][5]={

 9         {2.3,1.2,5.2,6.1,1.1},

10         {4.2,3.2,6.2,1.7,7.4},

11         {8.5,6.2,4.7,2.8,2.1}

12     };

13     

14     double rain[5][12]={

15         {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},

16         {8.5,8.2,1.2,1.6,2.4,0.0,5.2,0.9,0.3,0.9,1.4,7.3},

17         {9.1,8.5,6.7,4.3,2.1,0.8,0.2,0.2,1.1,2.3,6.1,8.4},

18         {7.2,9.9,8.4,3.3,1.2,0.8,0.4,0.0,0.6,1.7,4.3,6.2},

19         {7.6,5.6,3.8,2.8,3.8,0.2,0.0,0.0,0.0,1.3,2.6,5.2}

20     };

21     

22     double tar[3][5]={0};

23     double tar2[5][12]={0};

24     

25     copy(3,5,num,tar);

26     show(3,5,tar);

27 

28     copy(5,12,rain,tar2);

29     show(5,12,tar2);

30     

31     return 0;

32 }

33 

34 void copy(int row,int col,double arr[][col],double tar[row][col]){

35     int i,j;

36     for(i=0;i<row;i++){

37         for(j=0;j<col;j++){

38             tar[i][j]=arr[i][j];

39         }

40     }

41 }

42 

43 void show(int row,int col,double arr[row][col]){

44     int i,j;

45     for(i=0;i<row;i++){

46         for(j=0;j<col;j++){

47             printf("%.1f",arr[i][j]);

48             if(j!=col-1)printf(", ");

49         }

50         printf("\n");

51     }

52     printf("--------------------------------------\n\n");

53 }

  在这个例子中,给定两个二维数组,一个3X5数组和一个5X12数组,而例子中这两个数组用同一个函数处理拷贝或用同一个函数显示。

  其中用于显示的函数:

void show(int row,int col,double arr[row][col])

  是一个变长数组的定义方法,将代表维的整数声明在使用该维的变长数组之前。因为在原型中可以省略变量名,所以原型可以写为:

void show(int,int,double arr[*][*])

 

 

 

  未完待续……

你可能感兴趣的:(数组)