前言:計算機語言是編譯器和程序員交流的依據和規範,GNU C是GCC特有的功能,在Linux內核中被普遍應用。 html
幫助文檔:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions 程序員
指定初始化項目(Designated Initializers):指的是能夠對數組中的某些元素或結構體變量中的某些成員以任意的順序進行選擇性的初始化。 數組
一、在數組中的應用 app
在數組的初始化列表中使用「[index]= value」這樣的形式便可實現對指定(經過index指定)的某個元素進行初始化。 spa
舉例,如清單1: .net
- #include <stdio.h>
-
- int main(void)
- {
- int i;
- int arr[6] = { [3] = 29, 18, [0] = 12, 33}; //等價於int arr[6] = { [3] = 29, [4] = 18, [0] = 12, [1] = 33};
- //也就是等價於int arr[6] = {12, 33, 0, 29, 18, 0};
-
- for (i = 0; i < 6; i++)
- printf("arr[%d]: %d\n", i, arr[i]);
-
- return 0;
- }
例子輸出結果: 指針
- arr[0]: 12
- arr[1]: 33
- arr[2]: 0
- arr[3]: 29
- arr[4]: 18
- arr[5]: 0
如例子中的第6行,經過[3] = 29把arr[3]初始化爲29,經過[0] = 12把arr[0]初始化爲12。 htm
說明(1):若是在一個指定初始化項目後跟有不止一個值,如例子中的[3] =29, 18,則這些多餘的數值將用來對後續的數組元素進行初始化,即數值18用來初始化arr[4]。 blog
提醒:對C語言數組來講,在初始化一個或多個元素後,其中未經初始化的元素都將被自動地初始化爲0或者NULL(針對指針變量而言)。未通過任何初始化的數組,其全部元素的值都將是不肯定的(針對局部變量而言)。 ip
同一元素被屢次初始化的例子,如清單2:
- #include <stdio.h>
-
- int main(void)
- {
- int i;
- int arr[5] = {23, 3, 45, [1] = 34, 8};
-
- for (i = 0; i < 5; i++)
- printf("arr[%d]: %d\n", i, arr[i]);
-
- return 0;
- }
例子輸出結果:
- arr[0]: 23
- arr[1]: 34
- arr[2]: 8
- arr[3]: 0
- arr[4]: 0
如例子中的第6行,元素arr[1]和arr[2]先被分別初始化爲3和45,後又經過指定初始化項目[1] = 34, 8把arr[1]和arr[2]的值改變爲34和8。
說明(2):若是屢次對同一個元素進行初始化,則最後一次初始化的值有效。這也很好理解,由於數組的每一個元素都是一個變量,不斷對同一變量賦不一樣值,固然這個變量的最終值爲最後賦的值。
指定初始化項目的特性在ISO C99中已經被支持。
GNU C還支持「[first … last] = value」的形式,即一個範圍內的幾個元素被初始化爲同一值,舉例,如清單3:
- #include <stdio.h>
-
- int main(void)
- {
- int i;
- int arr[] = { [0 ... 3] = 1, [4 ... 5] = 2, [6 ... 9] = 3};
-
- for (i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
- printf("arr[%d]: %d\n", i, arr[i]);
-
- return 0;
- }
例子輸出結果:
- arr[0]: 1
- arr[1]: 1
- arr[2]: 1
- arr[3]: 1
- arr[4]: 2
- arr[5]: 2
- arr[6]: 3
- arr[7]: 3
- arr[8]: 3
- arr[9]: 3
二、在結構體變量中的應用
在結構體變量的初始化列表中經過點運算符(.)和成員名的形式(.fieldname= value)來指定初始化其中的某些成員。
舉例,如清單4:
- #include <stdio.h>
-
- struct mystruct {
- int num;
- char ch;
- float fl;
- };
-
- int main(void)
- {
- struct mystruct mystruct = { .ch ='M' };
-
- printf(" num = %d\n ch = %c\n fl = %f\n",
- mystruct.num, mystruct.ch, mystruct.fl);
-
- return 0;
- }
例子輸出結果:
- num = 0
- ch = M
- fl = 0.000000
前面兩個說明中的特色一樣適用於結構體變量。
注意:舊式的GCC 2.5編譯器還使用過如下的形式(成員名加冒號)來初始化指定的結構體成員:
- struct point { int x, y; };
- struct point p = { y: yvalue, x: xvalue };
在聯合體(共用體)中也可使用指定初始化項目的特性,如:
- union foo { int i; double d; };
- union foo f = { .d = 4 };