1. 程式人生 > >C語言關於簡單語法的復習整理

C語言關於簡單語法的復習整理

long 修改 span void 迷糊 相同 默認 數據類型 main函數

1,什麽是C語言;

  1.1面向過程編程的高級語言;既可以像高級語言那樣使用邏輯算法來編程,也具備低級語言面向計算機硬件編程;

  1.2使用的編譯系統有GCC,VisualC++等;編譯後生成.exe可執行文件;

2,數據類型;

  2.1基本類型:整型,浮點型,字符型;

    int:32位編譯器4字節,64位編譯器8字節;

    short int :比int的短;2字節;

    long int :比int的長;8字節;

    float : 4字節;

    double : 8字節;

    char :一個字節;

  2.2構造類型:數組類型,結構體類型(struct),共用體類型(union),枚舉類型(enum);

  2.3指針類型:變量即地址,使用*指向符來指向變量中的內容;

  2.4空類型(void):主要用於對函數返回值的限制;

3,預處理命令:#

  3.1作為宏定義使用:#define 大寫宏名 (宏定義不是C語句,所以不需要用分號結束語句;)

    3.1.1字符串中的宏名不進行替換;

    3.1.2宏定義只作為字符串替換,不分配內存空間;

    3.1.3宏定義可以使用表達式替換,但是表達式參數最好帶括號保護運算的優先級;

    3.1.4宏名的定義放在文件的開始,或者獨立的文件中;

    3.1.5宏名使用#undef結束宏名的作用域;

  3.2作為文件包含指令使用:#include

    3.2.1#include<file.h> : 告訴編譯器在頭文件庫中尋找需要包含的文件;

    3.2.2#include"file.h" : 優先在當前目錄下尋找需要包含的文件;

  3.3作為條件編譯使用:#if #elif #endif

    #ifndef 宏名 #endif:這種用法可以用來阻止編譯器函數被多次包含,而多次編譯,導致的編譯器報錯函數已經存在;

  3.4#line 行號["file_name"]命令:說是用於調試用途;不太理解什麽作用;

  3.5#pragma :比上面的3.4還迷糊;這兩個命令不太理解,說不來;

4,函數聲明:int func(int a,int b);

  4.1目的 : 讓編譯器知道函數的返回值類型,名稱,參數等信息;(是C語句有分號)放在哪裏沒有關系;

    4.1.1 聲明類型auto:平時變量的聲明默認為auto,可以省略;要使用時由系統自動分配內存,調用完成後釋放內存存儲空間;

    4.1.2 聲明類型static : 變量的初始化只在第一次起作用,之後的初始化不起作用,變量有時序記憶性;

    4.1.3 聲明類型extern : 聲明外部變量可供同工程源文件調用;

    4.1.4 聲明類型Register : 變量的值放在硬件寄存器中,調用時不必占用內存;

        ps:硬件寄存器的地址是無法通過內存獲得的;寄存器的使用不占用內存地址;

5,函數定義

  5.1函數定義的作用:讓編譯器知道函數的功能 eg: int func(int a,int b){ ...; }

    5.1.1在一個函數體內不能嵌套定義新的函數,但是可以調用其他的函數;(編譯的時候可能要考慮前面提到的函數被多次包含的編譯錯誤);

6,

  6.1 case語句中如果某個case後面沒有break;則就會順序執行下一個語句,直到遇見break;這種模式可以用來作為多路開關;

  6.2if else語句加上他們後面的代碼段才是完整的C語句,用大括號將代碼段括起來代表一個整體的小模塊;

  6.3 ? :是C語言中唯一的一個三目運算符; eg: (表達式判斷)?(為真返回此處值):(為假返回此處值)

  6.4 do{ ... }while(); 註意這個判斷語句的分號是在括號邊上的;其他的判斷語句的括號邊上都沒有分號;

  6.5 void main( int argc,int * argv[ ] ) 是main函數的固定參數;

    6.5.1 argc 參數記錄命令行的命令和參數個數;

    6.5.2 argv 參數記錄命令行的命令和參數個數的內容;

7,數組

  7.1:數組定義: eg: int array[10]; 數組類型 數組名[ 成員個數 ];(數組個數為常數,是定值)

  7.2:數組類型:整型數組,浮點型數組,字符型數組,指針數組;

  7.3:C語言中數組的引用只能逐個引用;數組的下標從0開始引用;註意數組定義的時候用的不是下標而是個數;

  7.4: 當數組作為實參傳遞給函數的時候:

    7.4.1:沒有括號的數組等同於該數組第一個元素的地址;實參中傳遞的就是首地址;

    7.4.2 : 數組在主調函數和被調函數中應該分別定義名字;

8,指針

  8.1:為什麽要使用指針; 因為函數調用過程中數據的傳遞是實參到形參的單向傳遞,改變後的形參沒有辦法返回給形參;

     所以我們使用指針作為函數形參,參數傳遞是對地址裏的內容進行修改,修改後的內容就可以保持;

  8.2 : 指針變量定義:指針變量中存放的是地址,用*指向符來指向地址取出內容;未經賦值的指針不能使用;

           可以使用取地址符&將一個變量的地址取出,然後賦值給指針進行操作;

           int a;

           int * p=& a;

  8.3:

    8.3.1:不允許將數值賦值給指針變量;

    8.3.2:*與&的優先級相同,自右向左運算;

    8.3.3:指針的自加加加的是一個上一個數據類型的長度以供下一個數據類型使用;

    8.3.4:數組的名字就是數組在內存的首地址; p=&a[0] (p=a) ; (p+i)可用循壞遍歷數組地址, *(p+i)可用循壞遍歷數組內容;

  8.4 : 指針數組:數組中的元素均為指針變量的數組;指針數組占用的空間要小於字符串數組;

         eg: char * arrayname[數組長度];

         遍歷指針數組需要使用指向指針的變量;指向指針的變量在定義時為 eg:(char * *p; ) 但是使用起來和只有一個*的指針變量是一樣的;

         兩個*為什麽呢?因為指針數組裏是地址嘛,所以被用來賦值的指針內容也應該是地址;

  8.5:指針二維數組;

    &a[m][n]表示的是數組第m行第n列元素的地址;

    a[m]+n 表示的是二維數組第m行第n列元素的地址;

    *(a+m)+n表示的是二維數組第m行第n列的地址;

    哪哪,這裏的二維數組怎麽表示都是地址,真是神奇,先記住怎麽用,等會有點事,急著做完,我下次再好好想想這個問題和一維數組的表示差別;

  8.6:指針函數;返回的數據類型是指針類型的函數;

    eg: int fun *(int a, int b); 表示此函數是指針類型的函數,返回的值是一個指向整型的指針變量;

  8.7:指向函數的指針;

    數據類型 (*指針名字)(函數參數列表); 指針名字=函數名字;

    eg: int fun(int a,int b){....} //定義一個函數;

       int (*p)(int,int); //在主函數中定義一個函數指針,帶上它的參量;

       p=fun; //為函數指針定義指向什麽函數;

       c=(*p)(x,y); //將函數指針的返回值存入c中;

C語言關於簡單語法的復習整理