C語言筆記-結構體的初始化
一般程式常看到這種結構的初始化方式:
direction_s upright={NULL,0,1,1,0};
這種填充式的結構初始化很糟糕,因為必須要記住所有的結構成員順序,這種方式很不人性化
初始化應該使用上標籤:
不用帶標籤的初始化方式是恐怖的:
這種初始化也要改成
這樣才是應該提倡的
---------------------------------------------------------------------
要預設結構體的原素自動設為0,可以透過賦予一個全空ˇ空白值來達成:
輸出出來看值都為0。
固定長度的陣列也是這樣聲明就可以將陣列值設為0,但是在可變長度的陣列就只能使用memset()來達成目的了。
direction_s upright={NULL,0,1,1,0};
direction_s upright={NULL,0,1,1,0};
這種填充式的結構初始化很糟糕,因為必須要記住所有的結構成員順序,這種方式很不人性化
初始化應該使用上標籤:
#include <stdio.h> #include <stdlib.h> typedef struct{ int one; double two,three,four; }n_str;
n_str d={ 100, .four=10, .two=30, };
int main(void) { printf("%d %g %g %g",d.one,d.two,d.three, d.four); }
- 從上面的程式碼中可以看到初始化結構成員,順序不用與聲明的一致,編譯器也是可以成功編譯
- 未聲明的原素初始化為0,沒有初始過的都是設為0
- 可以混和聲明
在"21 century c"中有這個範例可以參考:
#include <stdio.h> #include <stdlib.h> typedef struct{ char *name; int left,right,up,down; }direction_s; void this_row(direction_s d); void draw_box(direction_s d); int main(void) { direction_s D={.name="left",.left=1}; draw_box(D); D=(direction_s){"upper right",.up=1,.right=1}; draw_box(D); draw_box((direction_s){}); return 0; } void this_row(direction_s d){ printf(d.left?"*..\n" : d.right?"..*\n" : ".*.\n" ); } void draw_box(direction_s d){ printf("%s:\n",(d.name?d.name:"a box")); d.up ?this_row(d):printf("...\n"); (!d.up && !d.down) ?this_row(d):printf("...\n"); d.down ?this_row(d):printf("...\n"); printf("\n"); }
不用帶標籤的初始化方式是恐怖的:
D.left=1; D.right=0; D.up=1;
這種初始化也要改成
Direction_s D={.left=1,.up=1};<br />
---------------------------------------------------------------------
要預設結構體的原素自動設為0,可以透過賦予一個全空ˇ空白值來達成:
n_str d={};
輸出出來看值都為0。
固定長度的陣列也是這樣聲明就可以將陣列值設為0,但是在可變長度的陣列就只能使用memset()來達成目的了。
留言
張貼留言