C åèæå
- C è¯è¨
- C çåå²
- åºæ¬æ¦å¿µ
- 表达å¼
- 声æ
- åå§å
- 彿°
- è¯å¥
- éææè¨
- å符常é
- 彿°å£°æ
- 彿°å®ä¹
- 转ä¹åºå
- ç¿»è¯é¶æ®µ
- æ è¯ç¬¦
- ä½ç¨å
- çåæ
- æ¥æ¾ä¸å½å空é´
- ASCII ç 表
- ç±»å
- éµä»æ§
- ç®æ¯ç±»å
- restrict ç±»åéå®ç¬¦
- ç±»å
- 对象ä¸å¯¹é½
- 䏻彿°
- æªå®ä¹è¡ä¸º
- å 忍¡å
- if è¯å¥
- switch è¯å¥
- for 循ç¯
- while 循ç¯
- do-while 循ç¯
- continueè¯å¥
- break è¯å¥
- gotoè¯å¥
- return è¯å¥
- å¼ç±»å«
- æ±å¼é¡ºåº
- æ´æ°å¸¸é
- æµ®ç¹å¸¸é
- å符串åé¢é
- å¤ååé¢é
- 常é表达å¼
- éå¼è½¬æ¢
- æå访é®è¿ç®ç¬¦
- é»è¾è¿ç®ç¬¦
- æ¯è¾è¿ç®ç¬¦
- ç®æ¯è¿ç®ç¬¦
- èµå¼è¿ç®ç¬¦
- èªå¢/èªåè¿ç®ç¬¦
- å ¶ä»è¿ç®ç¬¦
- sizeof è¿ç®ç¬¦
- _Alignof è¿ç®ç¬¦
- 转åè¿ç®ç¬¦
- C è¿ç®ç¬¦ä¼å 级
- æ³åéæ©
- æ éåå§å
- æ°ç»åå§å
- ç»æä½ä¸èåä½åå§å
- æé声æ
- æ°ç»å£°æ
- æä¸¾
- åå¨ç±»æå®ç¬¦
- const ç±»åéå®ç¬¦
- volatile ç±»åéå®ç¬¦
- ç»æä½å£°æ
- èåä½å£°æ
- ä½å
- _Alignas
- typedef 声æ
- ååç±»å
- å¤é¨åè¯æ¢æ§å®ä¹
- inline 彿°æå®ç¬¦
- _Noreturn 彿°æå®ç¬¦
- åé¿åæ°
- å èæ±ç¼
- å¯åææ§
- æ¿ç¨è¿ç®ç¬¦åè®°å·
- C å ³é®è¯
- é¢å¤çå¨
- C æ ååºå¤´æä»¶
- ç±»åæ¯æ
- ç¨åºæ¯æå·¥å ·
- å忰彿°
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- ç®æ³
- æ°å¼
- æä»¶è¾å ¥/è¾åº
- æ¬å°åæ¯æ
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C æ ååº
- æç¨çèµæº
- 符å·ç´¢å¼
- 注é
ä½ç½®ï¼é¦é¡µ > C åèæå >C è¯è¨ > ç»æä½ä¸èåä½åå§å
ç»æä½ä¸èåä½åå§å
åå§å struct æ union ç±»å对象æ¶ï¼åå§åå¨å¿ é¡»æ¯æååå§åå¨çé空ãè±æ¬å·ç¯ç»ãéå·åéçå表ï¼
= { expression , ... }
|
(C99 å) | ||||||||
= { designator(å¯é) expression , ... }
|
(C99 èµ·) | ||||||||
å
¶ä¸ designator æ¯ä¸åºåï¼ç©ºç½ç¬¦åéæç¸é»çï¼ . member å½¢å¼çåç¬æåæä»£å¨ï¼å [ index ] å½¢å¼çæ°ç»æä»£å¨ã
以ä¸åå§åæ¥æéæå卿ç对象ç¸åçæ¹å¼ï¼éå¼å°åå§åæææªæ¾å¼åå§åçæåã
è§£é
åå§å union æ¶ï¼åå§åå¨åè¡¨å¿ é¡»åªæä¸ä¸ªæåï¼å®åå§åèåä½çé¦ä¸ªæåï¼é¤éä½¿ç¨æä»£åå§åå¨ (C99 èµ·)ã
union { int x; char c[4]; } u = {1}, // 令 u.x æ´»è·ï¼æ¥æå¼ 1 u2 = { .c={'\1'} }; // 令 u2.c æ´»è·ï¼æ¥æå¼ {'\1','\0','\0','\0'}
åå§å struct æ¶ï¼å表ä¸çé¦ä¸ªåå§åå¨åå§åé¦ä¸ªè¢«å£°ææåï¼é¤éæå®äºæä»£å¨ï¼ (C99 èµ·)ï¼èææåç»§çæ æä»£å¨ (C99 èµ·)åå§åå¨ï¼åå§åå åè¡¨è¾¾å¼æåå§åè ä¹åçç»æä½æåã
struct point {double x,y,z;} p = {1.2, 1.3}; // p.x=1.2, p.y=1.3, p.z=0.0 div_t answer = {.quot = 2, .rem = -1 }; // div_t ä¸çæå顺åºå¯ä»¥ä¸å
|
æä»£å¨å¯¼è´åéçåå§åå¨åå§å该æä»£å¨ææè¿°çç»æä½æåãç¶ååå§åç»§ç»æå£°æé¡ºåºååï¼ä»æä»£å¨ææè¿°æåçä¸ä¸ªæåå¼å§ã struct {int sec,min,hour,day,mon,year;} z = {.day=31,12,2014,.sec=30,15,17}; // åå§å z 为 {30,15,17,31,12,2014} |
(C99 èµ·) |
æä¾å¤äºæåçåå§å卿¯é误ã
åµå¥åå§å
è¥ç»æä½æèåä½çæåæ¯æ°ç»ãç»æä½æèåä½ï¼ååå§åå¨çè±æ¬å·ç¯ç»å表ä¸ç对åºåå§åå¨ï¼æ¯å¯¹è¿äºæååæ³çä»»ä½åå§åå¨ï¼é¤äºå¯ä»¥ä»¥ä¸åæ¹å¼çç¥å ¶æ¬å·ï¼
è¥åµå¥åå§åå¨ä»¥å·¦è±æ¬å·å¼å§ï¼åç´å°å ¶å³è±æ¬å·ä¸ºæ¢çæ´ä¸ªåµå¥åå§åå¨ï¼åå§å对åºçæåå¯¹è±¡ãæ¯ä¸ªå·¦å¼è±æ¬å·å»ºç«ä¸ä¸ªæ°çå½å对象ãå½å对象çæåä»¥å ¶èªç¶é¡ºåºåå§åï¼é¤éä½¿ç¨æä»£å¨ (C99 èµ·)ï¼æ°ç»ä»¥ä¸æ 顺åºãç»æä½æå以声æé¡ºåºãä» åå§åä»»ä½èåä½çé¦ä¸ªè¢«å£°ææåãéå¼å°åå§åå½åå¯¹è±¡å æªç±å³è±æ¬å·æ¾å¼åå§åçå对象ã
struct example { struct addr_t { uint32_t port; } addr; union { uint8_t a8[4]; uint16_t a16[2]; } in_u; }; struct example ex = { // struct example çåå§åå¨å表å¼å§ { // ex.addr çåå§åå¨å表å¼å§ 80 // åå§å struct addr_t çå¯ä¸æå }, // ex.addr çåå§åå¨åè¡¨ç»æ { // ex.in_u çåå§åå¨å表å¼å§ {127,0,0,1} // åå§å union in_u çé¦ä¸ªæå } };
è¥åµå¥åå§åå¨ä¸ä»¥å·¦è±æ¬å·å¼å§ï¼åä» ä»å表éç¨è¶³å¤çåå§åå¨ï¼ä»¥ç¨äºè¯¥æåæ°ç»ãç»æä½æèåä½çå ç´ ææåï¼ä»»ä½å©ä¸çåå§åå¨çå¾ åå§åä¸ä¸ªç»æä½æåï¼
struct example ex = {80, 127, 0, 0, 1}; // 80 åå§å ex.addr.port // 127 åå§å ex.in_u.a8[0] // 0 åå§å ex.in_u.a8[1] // 0 åå§å ex.in_u.a8[2] // 1 åå§å ex.in_u.a8[3]
|
åµå¥æä»£å¨æ¶ï¼æåçæä»£å¨åéå¤å´ç»æä½/èåä½/æ°ç»çæä»£å¨ãå¨ä»»ä½åµå¥çæ¹æ¬å·åå§åå¨å表ä¸ï¼æå¤å±æä»£å¨æä»£å½å对象ï¼èä¸åªå¨å½å对象ä¸éæ©è¦åå§åçå对象ã struct example ex2 = { // å½å对象为 ex2 ï¼æä»£å¨å±äº struct example çæå .in_u.a8[0]=127, 0, 0, 1, .addr=80}; struct example ex3 = {80, .in_u={ // æ´æ¹å½å对象为èåä½ ex.in_u 127, .a8[2]=1 // æ¤æä»£å¨æä»£ union in_u çæå } }; è¥æ¾å¼åå§åä»»ä½åå¯¹è±¡äºæ¬¡ï¼å¨ä½¿ç¨æä»£å¨æ¶å¯è½åçï¼ï¼å使ç¨çåå§åå¨ï¼æ¯è¾ååºç°äºå表ä¸çåå§åå¨ï¼å¯è½ä¸æ±å¼è¾æ©çåå§åå¨ï¼ï¼ å°½ç®¡ä»»ä½æªåå§åçå对象é½è¢«éå¼åå§åï¼è¥åå¯¹è±¡çæ¾å¼åå§åå¨åå§åå¨å表ä¸åºç°è¾æ©ï¼ååä¸å对象çéå¼åå§åå³ä¸ä¼è¦çæ¾å¼åå§åï¼ è¿è¡æ¤ä»£ç #include <stdio.h> typedef struct { int k; int l; int a[2]; } T; typedef struct { int i; T t; } S; T x = {.l = 43, .k = 42, .a[1] = 19, .a[0] = 18 }; // åå§å x 为 {42, 43, {18, 19} } int main(void) { S l = { 1, // åå§å l.i 为 1 .t = x, // åå§å l.t 为 {42, 43, {18, 19} } .t.l = 41, // æ´æ¹ l.t 为 {42, 41, {18, 19} } .t.a[1] = 17 // æ´æ¹ l.t 为 {42, 41, {18, 17} } }; printf("l.t.k is %d\n", l.t.k); // .t = x æ¾å¼è®¾ç½® l.t.k 为 42 // .t.l = 42 ä¼é弿¸ é¶ l.t.k } è¾åºï¼ l.t.k is 42 ç¶èï¼å½åå§åå¨ä»¥å·¦å¼è±æ¬å·å¼å§æ¶ï¼ä¼å®å ¨éåå§åå ¶å½å对象ï¼å¹¶å¿½ç¥å ¶ä»»ä½å对象çå åçæ¾å¼åå§åå¨ï¼ struct fred { char s[4]; int n; }; struct fred x[ ] = { { { "abc" }, 1 }, // åå§å x[0] 为 { {'a','b','c','\0'}, 1 } [0].s[0] = 'q' // æ´æ¹ x[0] 为 { {'q','b','c','\0'}, 1 } }; struct fred y[ ] = { { { "abc" }, 1 }, // åå§å y[0] 为 { {'a','b','c','\0'}, 1 } [0] = { // å½å对象ç°å¨æ¯æ´ä¸ª y[0] 对象 .s[0] = 'q' } // 以 { {'q','\0','\0','\0'}, 0 } æ¿æ¢ y[0] }; |
(C99 èµ·) |
注æ
åå§åå¨åè¡¨å¯æ¥æå°¾éçéå·ï¼å®è¢«å¿½ç¥ã
struct {double x,y;} p = {1.0, 2.0, // å°¾ééå· OK };
C ä¸ï¼åå§åå¨çè±æ¬å·å表ä¸è½ä¸ºç©ºï¼æ³¨æ C++ å 许空å表ï¼å¹¶ä¸æ³¨æ C ä¸ç»æä½ä¸è½ä¸ºç©ºï¼ï¼
struct {int n;} s = {0}; // OK struct {int n;} s = {}; // é误ï¼åå§åå¨å表ä¸è½ä¸ºç©º struct {} s = {}; // é误ï¼ç»æä½ä¸è½ä¸ºç©ºï¼åå§åå¨å表ä¸è½ä¸ºç©º
|
å¨åå§åä»»ä½å卿çèå使¶ï¼åå§åå¨å表ä¸çæ¯ä¸ªè¡¨è¾¾å¼å¿ 须齿¯å¸¸é表达å¼ã |
(C99 å) |
|
åææå ¶ä»åå§åï¼å¨åå§åéææçº¿ç¨å±å (C11 èµ·)å卿çèå使¶ï¼åå§åå¨å表ä¸çæ¯ä¸ªè¡¨è¾¾å¼å¿ 须为常é表达å¼ï¼ static struct {char* p} s = {malloc(1)}; // é误 ä»»ä½åå§åå¨ä¸çåè¡¨è¾¾å¼æ±å¼é¡ºåºä¸ºéç¡®å®é¡ºåºï¼ int n = 1; struct {int x,y;} p = {n++, n++}; // æªæå®ï¼ä½æ¯è¯å®ä¹çè¡ä¸ºï¼ // n 以任æé¡ºåºèªå¢äºæ¬¡ // p çäº {1,2} å {2,1} 齿¯åæ³ç |
(C99 èµ·) |
示ä¾
| æ¬èæªå®æ åå ï¼æ´å¤å®ç¨ç示ä¾ï¼æå¥½åå§åæäºæ¥å¤´ç»æä½ |
#include <stdio.h> #include <time.h>  int main(void) { char buff[70]; // æä»£åå§åå¨ç®åæåé¡ºåºæªæå®çç»æä½çä½¿ç¨ struct tm my_time = { .tm_year=112, .tm_mon=9, .tm_mday=9, .tm_hour=8, .tm_min=10, .tm_sec=20 }; strftime(buff, sizeof buff, "%A %c", &my_time); puts(buff); }
å¯è½çè¾åºï¼
Sunday Sun Oct 9 08:10:20 2012
å¼ç¨
- C11 standard (ISO/IEC 9899:2011):
- 6.7.9/12-38 Initialization (p: 140-144)
- C99 standard (ISO/IEC 9899:1999):
- 6.7.8/12-38 Initialization (p: 126-130)
- C89/C90 standard (ISO/IEC 9899:1990):
- 3.5.7/9- Initialization