1、環境linux
環境c++
linux yum install gcc-c++ mac 改成 brew install gcc 若是mac麼有安裝brew須要用ruby安裝 $ gcc hello.c $ ./a.out Hello, World!
請確保您的路徑中已包含 gcc 編譯器,並確保在包含源文件 hello.c 的目錄中運行它。數組
若是是多個 c 代碼的源碼文件,編譯方法以下:ruby
$ gcc test1.c test2.c -o main.out $ ./main.out test1.c 與 test2.c 是兩個源代碼文件。dom
回調函數函數
函數指針做爲某個函數的參數指針
函數指針變量能夠做爲某個函數的參數來使用的,回調函數就是一個經過函數指針調用的函數。code
如下是來自知乎做者常溪玲的解說:事件
你到一個商店買東西,恰好你要的東西沒有貨,因而你在店員那裏留下了你的電話,過了幾天店裏有貨了,店員就打了你的電話,而後你接到電話後就到店裏去取了貨。在這個例子裏,你的電話號碼就叫回調函數,你把電話留給店員就叫登記回調函數,店裏後來有貨了叫作觸發了回調關聯的事件,店員給你打電話叫作調用回調函數,你到店裏去取貨叫作響應回調事件。get
實例
實例中 populate_array 函數定義了三個參數,其中第三個參數是函數的指針,經過該函數來設置數組的值。
實例中咱們定義了回調函數 getNextRandomValue,它返回一個隨機值,它做爲一個函數指針傳遞給 populate_array 函數。
populate_array 將調用 10 次回調函數,並將回調函數的返回值賦值給數組。
實例
#include <stdlib.h> #include <stdio.h> // 回調函數 void populate_array(int *array, size_t arraySize, int (*getNextValue)(void)) { for (size_t i=0; i<arraySize; i++) array[i] = getNextValue(); } // 獲取隨機值 int getNextRandomValue(void) { return rand(); } int main(void) { int myarray[10]; populate_array(myarray, 10, getNextRandomValue); for(int i = 0; i < 10; i++) { printf("%d ", myarray[i]); } printf("\n"); return 0; }
編譯執行,輸出結果以下:
16807 282475249 1622650073 984943658 1144108930 470211272 101027544 1457850878 1458777923 2007237709
結構體
struct 標識
按位運算 101010 101010 101010 & 011100 | 011100 ^ 011100 --------- ---------- ---------- 001000 111110 110110
位域
位域聲明 在結構內聲明位域的形式以下:
struct { type [member_name] : width ; };
下面是有關位域中變量元素的描述:
元素 | 描述 |
---|---|
type | 整數類型,決定了如何解釋位域的值。類型能夠是整型、有符號整 型、無符號整型。 |
member_name | 位域的名稱。 |
width | 位域中位的數量。寬度必須小於或等於指定類型的位寬度 |
下面的結構定義指示 C 編譯器,age 變量將只使用 3 位來存儲這個值,若是您試圖使用超過 3 位,則沒法完成。讓咱們來看下面的實例:
#include <stdio.h> #include <string.h> struct { unsigned int age : 3; } Age; int main( ) { Age.age = 4; printf( "Sizeof( Age ) : %d\n", sizeof(Age) ); printf( "Age.age : %d\n", Age.age ); Age.age = 7; printf( "Age.age : %d\n", Age.age ); Age.age = 8; // 二進制表示爲 1000 有四位,超出 printf( "Age.age : %d\n", Age.age ); return 0; } 當上面的代碼被編譯時,它會帶有警告,當上面的代碼被執行時,它會產生下列結果: Sizeof( Age ) : 4 Age.age : 4 Age.age : 7 Age.age : 0
typedef vs #define
#define 是 C 指令,用於爲各類數據類型定義別名,與 typedef 相似,可是它們有如下幾點不一樣: typedef 僅限於爲類型定義符號名稱,#define 不只能夠爲類型定義別名,也能爲數值定義別名,好比您能夠定義 1 爲 ONE。 typedef 是由編譯器執行解釋的,#define 語句是由預編譯器進行處理的。