碼神營地-C語言深度剖析

C語言中共有32個關鍵字,具體的就不說了
更多關於C語言學習視頻教程請進碼神營地官網:www.icodegod.com

聲明和定義

  • 聲明的含義:
    告訴編譯器,該名字已經匹配到一塊內存上了,後面代碼中用到的變量或對象是在別的地方定義的。
    告訴編譯器,這個名字已經被預定了,別的地方不能把它拿來作爲變量名或者是對象名(函數的聲明)

  • 聲明和定義的區別:
    定義創建了對象併爲這個對象分配了內存,而聲明沒有分配內存。
    同一個函數或者變量,聲明可以多次,但是定義只有一次。

關鍵字

  • 最寬宏大量的關鍵字------》auto
    編譯器默認情況下所有變量都是auto的

  • 最快的關鍵字------》register
    位於CPU和內存之間,起一個傳遞作用
    他所修飾的變量必須是被CPU接受的類型,這就意味着該register變量必須是單個的值,且長度必須小於整型或者等於整型的長度,register變量可能不放在內存中,所以不能用‘&’來取地址。

  • 最名不副實的關鍵字------》static
    在局部變量中,static局部變量的值總在內存區,所以局部函數結束,該變量的值仍然在,可以下次繼續使用。
    修飾函數不能被其他文件訪問。

  • 最冤枉的關鍵字------》sizeof
    它是一個關鍵字,不是函數

  • 最易變的關鍵字------》volatile
    防止編譯器對代碼的過度優化,從而可以提供對特殊地址的穩定訪問。
    Volatile表示“易變的”,即在運行期對象可能在當前程序上下文的控制流以外被修改(例如多線程中被其它線程修改;對象所在的存儲器可能被多個硬件設備隨機修改等情況):被volatile修飾的對象,編譯器不會對這個對象的操作進行優化。
    一個對象可以同時被const和volatile修飾,表明這個對象體現常量語義,但同時可能被當前對象所在程序上下文意外的情況修改。

    注 :被volatile這個關鍵字修飾的變量在每次訪問的時候都要去相應內存地址去找,因爲隨時可能被修改。被const修飾只能說明這個i不能被程序員修改,但可能被系統所修改

綜上

Void fun(const volatile int a)
Void fun(const volatile int *a)
Void fun(volatile int a)
均沒有錯誤
  • 最會戴帽子的關鍵字------>extern

  • 命名規則中:所有的宏定義,枚舉常量,只讀變量全用大小寫字母命名,用下劃線分割單詞。

  • 編譯器在缺省默認情況下數據類型爲unsigned類型的。

  • float變量和零值比較時:
    float ftestValue= 0.0;
    If((ftestValue>=-EPSINON) && (ftestValue<=EPSINON))
    //其中EPSINON爲編譯器定義好的精度
    也不要在很大的浮點數和很小的浮點數之間進行運算,結果可能很驚奇。
    case關鍵字後面的值有什麼要求:
    switch後面跟的表達式也只能是整型(包括字符型)
    case後面的只能是整型或者字符型的常量或常量表達式(想想字符型數據在內存中怎麼存的)。Case 的先後順序和default的先後順序沒有關係,可以隨便排,但一般還是按照順序把default放在最後面。

  • void的作用:
    對函數返回的限定。
    對函數參數的限定。
    如果函數沒有沒有返回值應該用void,而不是不寫,因爲編譯器默認的返回值類型是整型。
    如果函數不接受參數,一定要寫爲void。如果不寫,則在C語言中編譯可以通過,且可以給它傳送任何類型的參數,但是在C++中則編譯不通過。
    不能對void的指針進行操作(包括++,–,&操作),GNU除外。
    return語句不可以返回指向“棧內存”中的“指針”,因爲函數結束,指針就被銷燬了。

  • const在C中的用法和在C++中的用法不太一樣
    Const int Max = 100;
    在C語言中,const修飾的只讀變量不能用來作爲定義數組的維數,
    也不能放在 c as e 關鍵字後面。
    Int Array[Max];//在C中不可以,在C++中可以
    Case Max: 在C++中是可以的。
    C++中const的變量通常編譯器不會爲它開闢內存,而是將它存在符號表裏。
    const修飾指針時候的用法:

[柔性數組]:結構體中最後一個元素允許是一個未知大小的數組,這就叫做柔性數組,但是在柔性數組成員前面必須有至少一個其他成員。並且sizeof結構體大小時候,不包含柔性數組的大小,包含柔性數組的結構體用malloc開闢內存且開闢的內存大小應該大於結構體大小,以適應柔性數組預期的大小。
不論程序在後面爲柔性數組開闢了多大的內存空間,再次計算該結構體大小時,依然不變,柔性數組還是不佔結構體的大小,因爲它從本質上來說與結構體是兩個不相關的東西,跟結構體無關。
大小端模式對union類型數據的影響:
大小端的概念:

  • 用union檢驗大小端模式。
    枚舉和#define的宏區別:

  • 注意 #define a int[10]和typedef int a[10]區別(這裏有些沒太理解)

符號

  • 註釋
    編譯器會把註釋剔除掉,並不是簡單的剔除,而是用空格代替掉,所以註釋也不是簡單的刪除。
    雙引號引起來的都是字符串常量,當然雙斜槓也不例外。
    段註釋的嵌套使用是不合法的,即/* …//…*/是錯誤的。
    註釋的幾條規則:
    • 對於全局數據(全局變量,常量定義)必須要加註釋
  • .註釋必須要用英文。
  • .代碼較長時,應該把註釋放在程序結束處,便於閱讀。
  • .註釋代碼時應當注重why(爲什麼)而不是How(怎麼做)。
  • .數值的單位,變量的範圍,對於函數的入口出口數據都必須給出註釋。

邏輯運算符:&&,||
當他們出現在條件語句中時:

           int  i = 0;
           int  j = 0;
           if((++i)||(++j))
            {
                printf(“%d\n%d\n”,i,j);
            }

打印結果是:i= 1,J= 0;因爲||,&&運算符都是從左向右判斷的,所以當左邊第一個成立了,那麼後面的將不再進行判斷。
位運算符
左移和右移:左移和右移的位數不能超過數據的長度,不能小於0。
逗號表達式中的++.–以最後一個表達式爲最終結果。
a++b這中類型的,從左向右依次看最變量大的合法運算符結合,即a++ +b,也就是說一個符號要求包含儘可能多的字符,這就是C語言中的“貪心法”。

預處理

用#define來定義註釋符號?
都是不可以的,因爲註釋先於預處理指令被處理
用#define定義宏表達式時,不要吝嗇括號,一定要加上。
Eg:
宏定義中不要加空格,否則意思改變

  • 預編譯#pragma
    pragma hdrstop表示預編譯頭文件到此爲止,後面的頭文件不進行預編譯
    pragma warning
    pragma comment

  • pragma pack 表示內存對齊
    我們可以利用 #pragma pack()來改變編譯器的默認對齊方式(當然一般編譯器也提供了一些改變對齊方式的選項)

指針和數組

  • 關於NULL的操作

  • 數組
    單純的數組名代表的是數組這個部分,當數組作爲左值時a = 10;這是錯誤的表達,a[2] = 10;是可以的。
    數組和指針的區別和聯繫
    定義成數組,聲明爲指針。
    定義成指針,聲明爲數組。
    指針數組和數組指針。
    地址的強制轉換。
    多維數組和多級指針。
    C語言中,當一位數組作爲函數的參數時,編譯器總是會把它解析成指向首元素首地址的指針。
    函數本身是沒有類型的,只有函數的返回值纔有類型。
    二維數組參數和二維指針參數的等效關係

  • 函數指針的應用及好處
    使用函數指針的好處在於,可以將實現同一功能的多個模塊統一起來標識,這樣一來更
    容易後期的維護,系統結構更加清晰。或者歸納爲:便於分層設計、利於系統抽象、降低耦
    合度以及使接口與實現分開。

(*(void(*) ()) 0)()------這是什麼?
( * ( c ha r ** ( * ) ( c h ar * * ,c h ar * * ) ) 0 ) ( c h ar * * ,c ha r * *) ;

這又是什麼??
函數指針數組 char *(*pf[3])(char *p)
函數指針數組是一個指針數組,它是一個數組中存儲了3 個指向函數的指針。
函數指針數組的指針 char * ( *(*pf )[3])( char * p );

內存管理
常見的內存錯誤及其對策
指針沒有指向一塊合法的內存
結構體指針成員未初始化
沒有爲結構體指針分配足夠內存
函數的入口校驗
爲指針分配的內存太小
內存分配成功但是並未初始化
內存越界
內存泄露
用Malloc申請0字節大小的內存
開闢會成功,返回一個正常的地址,但是你無法使用這塊內存
如果一個NULL指針被多次free會有什麼情況發生??可以編譯通過,但是會有警告。

文件結構
注意文件頭部的書寫規範,包括頭文件和源文件的頭部書寫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章