1.1 C旅程的起點

2020-08-12 18:52:08

做了三年的FPGA了,感慨良多。最大的失誤是沒有做好一個系統的記錄。我的C旅程即將開始,一定要做一個系統的記錄。學了兩週的c,寫了一個簡單學習總結

C程式主要包含5部分
    預處理指令(通過#標識)
    函數
    變數
    語句&表達式
    註釋(//,或/*  */)

基本型別佔用空間:
    char   : 1個位元組 
    int    : 4個位元組
    float  : 4個位元組
    double : 8個位元組

關鍵字(變數)
    int      :整形變數或函數
    float    : 單精度浮點
    double   : 雙精度浮點
    char     : 字元變數或函數返回型別
    #define  : 使用前處理器定義常數
    const    : 定義常數
    auto     : 自動變數(只能用在函數內,只能修飾區域性變數)
    extern   : 變數或函數是在其他檔案或本檔案其他文章定義(參照一個全域性變數時,用它做宣告,多用於多個檔案共用相同的全域性變數或函數)
    register : 暫存器變數
    sizeof   : 計算數據型別長度
    static   : 靜態變數(同一個檔案內,值不變)
    typedef  : 使用該關鍵字可以爲型別取一個新的名字;包括結構體,可以重新給新的命名

字元常數
    \\    : \字元 
    \'    : '字元
    \"    : "字元
    \?    : ?字元
    \b    : 退格
    \n    : 換行
    \r    :回車
    \t    : 水平製表符
    \v    : 垂直製表符
    \ooo  : 一到三位八進制數
    \xhh  :一個或多個十六進制數

運算子
    算術運算子 : + - * / % ++ --
    關係運算符 : == != > < >= <=
    邏輯運算子 : && || !
    位運算子   : & | ^
    賦值運算子 : = += -= *= /= %= <<= >>= &= ^= |=
    其餘       : &(返回地址); *(返回一個數); sizeof()(返回變數帶大小); ?:(條件表達式)

判斷語句
    if語句
    if...else 語句
    if巢狀語句
    switch語句:
        {
            case 1 : 語句 break;
            ...
            default : break;
        }
    switch巢狀語句

回圈語句
    while回圈  (先判斷後回圈,爲真進入回圈);
    for回圈    (初值,回圈條件,執行條件);
    do...while (先回圈,後判斷,爲真繼續回圈);
    break      (終止回圈,繼續執行下一條語句);
    continus   (對回圈體有效,停止本次回圈,重新開始);
    goto       (無條件轉移);

陣列
    1,定義多維陣列;
    2,傳遞陣列到函數三種方法:通過指針,通過陣列名包含數位大小,不包含陣列大小;
    3,從函數返回陣列,只能通過返回指針的方式返回,函數定義爲指針函數; 返回的是不帶索引的陣列名(int r[10];  return r;);
    4,指向陣列的指針,通過不帶索引的陣列名來指向陣列中的一個元素的指針(int b[10]; int *p; p=b;(實際就等於*p=b[0]; *(p+1)實際對於b[1];))

列舉
    定義1: enum 列舉型別 {元素1,元素2,... }; (不定義列舉變數,後面使用的時候再定義)  enum 列舉型別 列舉變數;
    定義2: enum 列舉型別 {元素1,元素2,... } 列舉變數;
    定義3: enum {元素1,元素2,...} 列舉變數;  (省略列舉型別)

指針
    1,指針定義(*p(指向地址p的數據用*p表示));
    2,指針的算術運算
        {
            int d[6]; 
            int *p;  //定義陣列
            for(p=d;p<&d[6];p++) //將指針指向陣列的最後一個地址,指針遞增; 
             printf("addr=%p,data=%d",p,*p);
        }
    3,指針陣列
        {
            int d[3]; 
            int *p[3];//定義的指針陣列 
            int i=0; 
            for(i=0;i<3;i++)
            {
                p[i]=&d[i];//將指針指向陣列d;
                printf("i=%d,*p=%d"i,p[i]);
            }
        }
    4,指向指針的指針(int d; int *p; int **pr; pr=&p;p=&d);
    5,傳遞指針給函數,只需宣告函數的形參爲指針型別就可以;傳入函數的時候穿地址;
    6,從函數返回指針,宣告函數爲指針函數;如上函數返回陣列相同;

字串
    1,字串定義:char str[6]字串最後一個地址預設放到是'\0',不可改變;
    2,字串相關函數
        (1) strcpy(s1,s2) : 將字串s2複製到s1;
        (2) strcat(s1,s2) : 將字串s2接到s1末尾;
        (3) strlen(s1)    : 返回字串長度;
        (4) strcmp(s1,s2) : 字串比較,相同爲0,s1大返回大於0,s1小返回小於0

結構體
    1,結構體主要包括四部分:struct 標籤{ 變數定義列表... }結構變數;
    2,定義一個結構體:struct, 標籤, 結構變數最少出現兩部分;
    3,也可以用typedef建立新型別結構體;
    4,存取結構體可用 存取運算子(.): 結構變數.變數1;
    5,結構體作爲函數參數傳遞,將結構變數傳遞給參數即可;
    6,指向結構的指針,需要用->;

共用體i
    1,定義: 與結構體類似,定義了一個新的數據型別;主要包括四部分;
    2,存取共用體的方式與結構圖類似;

輸入或輸出
    1,標準輸入輸出爲:stdin-鍵盤,stdout-螢幕;
    2,getchar()和putchar();分別爲從鍵盤取一個字元或輸出一個字元到螢幕;
    3,gets()和puts;分別爲從鍵盤取一個字串,輸出一個字串到螢幕;
    4,scanf()和printf();輸入,輸出;

檔案讀寫
    開啓檔案: FILE *fopen("filename","mode(r,w,a,r+,w+,a+)");
    關閉檔案: fclose(fp);
    寫入檔案: fputc(c,fp)寫一個字元c;fputs(s,fp)寫一個字串s;
    讀取檔案: fgetc(fp)讀一個字元;fgets(s,n,fp)讀一個字串到s;