任何人都可以解釋什麼是可變修改類型?C語言中的可變修改類型
如果我們有一個數組
a[n]
和n
不是在編譯時已知然後a
是VLA。給定一個數組b[c][d]
其中c
和d
直到運行時纔會知道暗示b
是VLA,對不對?
在我的書中,他們表示,一個可變修改類型包含一個VLA。 就是這樣;而已。
如何創建指向可變修改類型的指針?
任何人都可以解釋什麼是可變修改類型?C語言中的可變修改類型
如果我們有一個數組
a[n]
和n
不是在編譯時已知然後a
是VLA。給定一個數組b[c][d]
其中c
和d
直到運行時纔會知道暗示b
是VLA,對不對?
在我的書中,他們表示,一個可變修改類型包含一個VLA。 就是這樣;而已。
如何創建指向可變修改類型的指針?
可變修改類型是VLA(可變長度陣列)。在具有靈活數組成員的結構中有類似的類型,但我不打算進一步討論靈活的數組成員。
關於VLA的關鍵點是直到運行時才知道數組的維數。通常,在C89和標準之前,在編譯時除第一個數組外的所有維都必須是已知的常量值(並且第一維可以指定爲int a[]
或int b[][SIZE]
或int c[][SIZE1][SIZE2]
,其中大小是常數)。
void some_function(int n)
{
int a[n];
int c = n+1;
int d = n+2;
int b[c][d];
another_function(n, a, c, d, b);
...
}
void another_function(int n, int a[n], int c, int d, int b[c][d])
{
...
}
a
和b
都是可變長度數組。在C99之前,你不能寫這樣的some_function()
;數組的大小必須在編譯時被稱爲編譯時常量。同樣,在C99之前,another_function()
的符號不會合法。
,你可以,而且還可以(向後兼容的原因,如果沒有別的)寫的another_function()
溫和模擬:
enum { FIXED_SIZE = 32 };
void yet_another_function(int a[], int n, int b[][FIXED_SIZE], int c)
{
...
}
這是不是一個完美的模擬,因爲FIXED_SIZE大小是固定的,但純粹的C99 VLA代碼在那裏具有可變維度。因此,舊代碼通常會使用足夠大的FIXED_SIZE來處理最壞的情況。
Inside another_function()
,名稱a
和b
基本上是指向可變更改類型的指針。
否則,你做一樣的一個固定大小的數組:
int z[FIXED_SIZE];
int (*z_pointer)[FIXED_SIZE] = &z;
int v[n];
int (*v_pointer)[n] = &v;
VLA ==可變長度數組
變長數組在C99規範引入允許這樣的事情:
int someArraySize;
int myArray[someArraySize];
Variably Modified type是可變長度數組的類型。因此,可變修改類型包含VLA。在你的例子b [c] [d]的情況下,其中c和d在運行時間之前是未知的,b是可變修改類型,它恰好是一個可變長度多維數組。 b [c] [d]是一個可變長度數組的可變長度數組 - phew,多嘴。
這裏是一個偉大源我發現,描述了這些VLAS和可變類型與實例:
http://gustedt.wordpress.com/2011/01/09/dont-be-afraid-of-variably-modified-types/
具有柔性陣列構件的結構是不是一個可變類型。定義見N1570 6.7.6p3。 –
好的;我沒有選中 - 修改以符合您的評論。謝謝! –