c 學習

1、環境linux

  1. 環境c++

    linux yum install gcc-c++
     mac 改成 brew install gcc 若是mac麼有安裝brew須要用ruby安裝
    
     $ gcc hello.c
     $ ./a.out
     Hello, World!
  2. 請確保您的路徑中已包含 gcc 編譯器,並確保在包含源文件 hello.c 的目錄中運行它。數組

  3. 若是是多個 c 代碼的源碼文件,編譯方法以下:ruby

    $ gcc test1.c test2.c -o main.out $ ./main.out test1.c 與 test2.c 是兩個源代碼文件。dom

  4. 回調函數函數

    函數指針做爲某個函數的參數指針

    函數指針變量能夠做爲某個函數的參數來使用的,回調函數就是一個經過函數指針調用的函數。code

    簡單講:回調函數是由別人的函數執行時調用你實現的函數。

    如下是來自知乎做者常溪玲的解說:事件

    你到一個商店買東西,恰好你要的東西沒有貨,因而你在店員那裏留下了你的電話,過了幾天店裏有貨了,店員就打了你的電話,而後你接到電話後就到店裏去取了貨。在這個例子裏,你的電話號碼就叫回調函數,你把電話留給店員就叫登記回調函數,店裏後來有貨了叫作觸發了回調關聯的事件,店員給你打電話叫作調用回調函數,你到店裏去取貨叫作響應回調事件。get

    1. 實例

      實例中 populate_array 函數定義了三個參數,其中第三個參數是函數的指針,經過該函數來設置數組的值。

      實例中咱們定義了回調函數 getNextRandomValue,它返回一個隨機值,它做爲一個函數指針傳遞給 populate_array 函數。

      populate_array 將調用 10 次回調函數,並將回調函數的返回值賦值給數組。

    2. 實例

      #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

  5. 結構體

    struct 標識
  6. 按位運算 101010 101010 101010 & 011100 | 011100 ^ 011100 --------- ---------- ---------- 001000 111110 110110

  7. 位域

    位域聲明 在結構內聲明位域的形式以下:

    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
  8. typedef vs #define

    #define 是 C 指令,用於爲各類數據類型定義別名,與 typedef 相似,可是它們有如下幾點不一樣:
    
     typedef 僅限於爲類型定義符號名稱,#define 不只能夠爲類型定義別名,也能爲數值定義別名,好比您能夠定義 1 爲 ONE。
     typedef 是由編譯器執行解釋的,#define 語句是由預編譯器進行處理的。
相關文章
相關標籤/搜索