C99新增內容之變長數組(VLA)


     我們在使用多維數組是有一點,任何情況下只能省略第一維的長度。比如在函數中要傳一個數組時,數組的行可以在函數調用時傳遞,當屬數組的列卻只能在能被預置在函數內部。看下面一個例子:

#define COLS 4
int sum2d(int ar[][COLS],int rows)
{
  int r;
  int c;
  int tot=0;
  for(r=0;r<rows;r++)
     for(c=0;c<COLS;c++)
         tot+=ar[r][c];
  return tot;
}

現在假設定義了如下數組:

int array1[5][4];
int array2[100][4];
int array3[2][4];

可以使用下面的函數調用:

tot=sum2d(array1,5);
tot=sum2d(array2,100);
tot=sum2d(array3,2);

   這是因為行數可以傳遞給參量rows,而rows是一個變量。當時如果要處理6行5列的數組時,則需要創建另一個新的函數,其COLS定義為5.這是由於數組的維數必須是常量;因此不能用一個變量來代替COLS;

   出於上述原因,C99C標准引入了變長數組,它允許使用變量定義數組的各維。例如:

int quarters=4;
int regions=5;
double sales[rregions][quarters];//定義了一個變長數組(VLA)

   正如前面提到的,變長數組有一些限制。變長數組必須是自動存儲類的,也就是說他們必須在函數內部或作為函數的參量聲明,而且聲明時不可以進行初始化。

   用下面一個代碼示范如何聲明一個二維變長數組參數的函數:

int sum2d(int rows,int cols,int ar[rows][cols]);//arS是一個變長數組

  注:前面兩個參量(rows和cols)用作數組參量ar的維數。因為ar中聲明了rows和cols,所以在常量列表中,他們兩個聲明需要早於ar。

   C99C標准規定,可以在函數名稱中的名稱;但是如果省略名稱,則需要用 * 來代替省略的維數。

int sum2d(int,int,int ar[rows][cols]);//ar是一個變長數組,其中省略了維數參量的名稱

  注:函數定義參量列表中的變長數組聲明實際上並沒有創建數組,和以前一樣,變長數組名實際上是一個指針,也就是說具有變長數組參量的函數實際上並沒有創建數組,因此他有能力修改作為參數傳遞進來的數組。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM