有關C語言的struct進階初始化
之前在trace強者學長們寫的C code時,一直對某種struct initialization的方法很感興趣,卻不知道該如何使用。稍微研究一下終於有了小小心得,在此筆記一下。
假設有一個student的結構定義如下:
typedef struct student{
char name[50];
int studentNo;
int age;
}student;
按照一般教科書上的寫法,初始化的方式是先宣告一個struct student的變數,然後再用點(dot)運算子去存取內部成員並賦值,例如:
struct student st1;
st1.name = "Peter";
st1.studentNo = 1234;
st1.age = 18;
但是進階的初始化方法卻是宣告直接再以點(dot)運算子賦值,例如:
student st1={
.name = "Peter",
.age = 18,
.studentNo = 1234
};
原來點運算子就可以等同struct內的成員,多個成員則用(,)來分開,類似陣列(array)的宣告方法,不同的是,他賦值的順序是可以不用按照struct定義內的先後順序的!
說到陣列(array),他的宣告也是有幾種神奇的方法。
例如:
int a[7] = { [4]=29, 33, [2]=15 };
相當於
int a[7] = { 0, 0, 15, 0, 29, 33, 0 };
可以用[index]= value 的方法指定給特定的元素,沒有指派的值就是0這樣。
結合上面struct的用法,也可以一併使用combo連續技,例如:
student st2[5]={
[3]={
.name = "Titus",
.age = 22,
.studentNo = 1041 },
[2]={
.studentNo = 1042
.age = 23,
.name = "Stephen", },
}
[index]= 可以不必按照順序,裡頭的成員也不必按照順序,其餘沒指派的元素會自動初始化為0。
當然也可以將一連串連續的元素…
假設有一個student的結構定義如下:
typedef struct student{
char name[50];
int studentNo;
int age;
}student;
按照一般教科書上的寫法,初始化的方式是先宣告一個struct student的變數,然後再用點(dot)運算子去存取內部成員並賦值,例如:
struct student st1;
st1.name = "Peter";
st1.studentNo = 1234;
st1.age = 18;
但是進階的初始化方法卻是宣告直接再以點(dot)運算子賦值,例如:
student st1={
.name = "Peter",
.age = 18,
.studentNo = 1234
};
原來點運算子就可以等同struct內的成員,多個成員則用(,)來分開,類似陣列(array)的宣告方法,不同的是,他賦值的順序是可以不用按照struct定義內的先後順序的!
說到陣列(array),他的宣告也是有幾種神奇的方法。
例如:
int a[7] = { [4]=29, 33, [2]=15 };
相當於
int a[7] = { 0, 0, 15, 0, 29, 33, 0 };
可以用[index]= value 的方法指定給特定的元素,沒有指派的值就是0這樣。
結合上面struct的用法,也可以一併使用combo連續技,例如:
student st2[5]={
[3]={
.name = "Titus",
.age = 22,
.studentNo = 1041 },
[2]={
.studentNo = 1042
.age = 23,
.name = "Stephen", },
}
[index]= 可以不必按照順序,裡頭的成員也不必按照順序,其餘沒指派的元素會自動初始化為0。
當然也可以將一連串連續的元素…