簡單好用的C語言偏門知識,復合文字,編程小知識值得擁有
本文主要介紹一些C語言的一些偏門知識給大家,在這里簡單談一下C語言復合文字。需要讀者具備一定的C語言基礎。
前言
C99新增了復合文字(compound literal)。文字是非符號常量。例如:5是int類型的文字;82.3是float類型的文字等等。C99標準委員會認為:如果又能夠表示數組和結構內容的復合文字,那么在編寫程序的時候要方便得多。
數組復合文字的定義方式
對于數組來說,復合文字看起來像是在數組的初始化列表前面加上用圓括號括起來的類型名。
- #include <stdio.h>
- int main()
- {
- int iArray[]={10,20}; //普通數組
- int &pArray=(int []){10,20}; //一個復合文字
- //int &pArray=(int [2]){10,20}; 與上文等效
- return 0;
- }
解析:
- 類型名就是前面聲明中去掉iArray后剩余部分,即int[2]。
- 初始化復合文字可省略數組大小,編譯器會自動計算元素數目。
- 復合文字沒名稱,必須創建時通過特定類型表示他們,便于使用。
復合文字充當函數參數
復合文字也可以作為實際參數被傳遞給帶有類型與之匹配的形式參量的函數。如下測試案例:
- #include <stdio.h>
- void print(int array[], int arrayNum)
- {
- for (int i = 0; i < arrayNum; i++)
- {
- printf("%d\t", array[i]);
- }
- }
- int main()
- {
- print((int[]){1,2,3,4,5,6}, 6);
- return 0;
- }
測試截圖如下:

此處第一個參數是包含6個元素的int型數組,同時也是首元素的地址(同數組名一樣)。這種給函數傳遞信息而不必先創建數組的做法,是復合常量的通常使用方法。
二維數組或多維數組中復合文字
這種技巧也可以用在處理二維數組或多維數組的函數中。例如,下面的代碼介紹如何創建一個二維int數組并保存其地址。
- #include <stdio.h>
- int main()
- {
- int(*pArray)[4];//聲明一個數組指針
- pArray = (int[2][4]){ {1,2,3,-9},{4,5,6,-8} };
- return 0;
- }
二維數組或多維數組中復合文字
用如下結構體復合文字用法。
- #include <stdio.h>
- #include <string.h>
- struct MM
- {
- char firstName[20];
- char secondName[20];
- };
- void getName(struct MM mm)
- {
- puts(strcat(mm.firstName, mm.secondName));
- }
- int main()
- {
- getName((struct MM) { "小", "可愛" }); //調用
- return 0;
- }
復合文字也可以取地址
- #include <stdio.h>
- #include <string.h>
- struct MM
- {
- char firstName[20];
- char secondName[20];
- };
- int main()
- {
- struct MM* pMM = &((struct MM) { "小", "可愛" }); //調用
- printf("%s%s\n", pMM->firstName, pMM->secondName);
- return 0;
- }
以上程序運行結果打印:小可愛
總結
- 當一個類似結構的東西需要臨時構造的時候,可以用 (type_name){xx,xx,xx},而type_name就是之前定義的格式,去掉變量名(數組名)即可, 這種使用方法有點像 C++ 的構造函數。
- 復合文字就相當于一個常量,只不過形式較為復雜而已,所有可以用常量的地方均可以用復合文字,例如,宏定義。
- 使用復合文字,在想傳一個“常量”時,就不必先定義,再傳值了,比如傳一個常數坐標(struct point{double x;double y;}),這樣就不用先定義一個結構變量,再傳結構體過去了,代碼更加簡潔。
- 值得注意的是,復合文字具有左值語義。
好了,復合文字就介紹到這里,大家可以先練習一下。