C語言的一些坑

變量的聲明有兩種情況:

1、一種是需要建立存儲空間的。例如:int a 在聲明的時候就已經(jīng)建立了存儲空間。
2、另一種是不需要建立存儲空間的,通過使用extern關(guān)鍵字聲明變量名而不定義它。 例如:extern int a 其中變量 a 可以在別的文件中定義的。
除非有extern關(guān)鍵字,否則都是變量的定義。

左值(lvalue):指向內(nèi)存位置的表達式被稱為左值(lvalue)表達式;
右值(rvalue):術(shù)語右值(rvalue)指的是存儲在內(nèi)存中某些地址的數(shù)值。

3、存儲類定義 C 程序中變量/函數(shù)的范圍(可見性)和生命周期。這些說明符放置在它們所修飾的類型之前。下面列出 C 程序中可用的存儲類:auto 只能用在函數(shù)內(nèi),即 auto 只能修飾局部變量。register 存儲類用于定義存儲在寄存器中而不是 RAM 中的局部變量;static 存儲類指示編譯器在程序的生命周期內(nèi)保持局部變量的存在,而不需要在每次它進入和離開作用域時進行創(chuàng)建和銷毀。因此,使用 static 修飾局部變量可以在函數(shù)調(diào)用之間保持局部變量的值。
4、extern 存儲類用于提供一個全局變量的引用,全局變量對所有的程序文件都是可見的。extern 修飾符通常用于當有兩個或多個文件共享相同的全局變量或函數(shù)的時候。
5、傳值調(diào)用,該方法把參數(shù)的實際值復制給函數(shù)的形式參數(shù)。在這種情況下,修改函數(shù)內(nèi)的形式參數(shù)不會影響實際參數(shù)。引用調(diào)用,通過指針傳遞方式,形參為指向?qū)崊⒌刂返闹羔槪攲π螀⒌闹赶虿僮鲿r,就相當于對實參本身進行的操作。默認情況下,C 使用傳值調(diào)用來傳遞參數(shù)。一般來說,這意味著函數(shù)內(nèi)的代碼不能改變用于調(diào)用函數(shù)的實際參數(shù)。
6、/* 函數(shù)聲明 *///作用是可以將函數(shù)的實現(xiàn)放到main后面定義,嚴格遵守先聲明再使用的規(guī)則
7、全局變量與局部變量在內(nèi)存中的區(qū)別:全局變量保存在內(nèi)存的全局存儲區(qū)中,占用靜態(tài)的存儲單元;
局部變量保存在棧中,只有在所在函數(shù)被調(diào)用時才動態(tài)地為變量分配存儲單元。當局部變量被定義時,系統(tǒng)不會對其初始化,您必須自行對其初始化。定義全局變量時,系統(tǒng)會自動對其初始化

8、另外,C 不支持在函數(shù)外返回局部變量的地址,除非定義局部變量為 static 變量。
9、所有指針的值的實際數(shù)據(jù)類型,不管是整型、浮點型、字符型,還是其他的數(shù)據(jù)類型,都是一樣的,都是一個代表內(nèi)存地址的長的十六進制數(shù)。不同數(shù)據(jù)類型的指針之間唯一的不同是,指針所指向的變量或常量的數(shù)據(jù)類型不同。為指針變量賦一個 NULL 值是一個良好的編程習慣。賦為 NULL 值的指針被稱為空指針。NULL 指針是一個定義在標準庫中的值為零的常量,這個運算會在不影響內(nèi)存位置中實際值的情況下,移動指針到下一個內(nèi)存位置
10、我們想要讓數(shù)組存儲指向 int 或 char 或其他數(shù)據(jù)類型的指針。下面是一個指向整數(shù)的指針數(shù)組的聲明:int *ptr[MAX];
數(shù)組指針:意思是說這個指針存放著一個數(shù)組的首地址,或者說這個指針指向一個數(shù)組的首地址。
指針數(shù)組:意思是說這個數(shù)組的所有元素都是指針類型。
11、指向指針的指針是一種多級間接尋址的形式,int **var;能接受指針作為參數(shù)的函數(shù),也能接受數(shù)組作為參數(shù);C 語言不支持在調(diào)用函數(shù)時返回局部變量的地址,除非定義局部變量為 static 變量。
12、函數(shù)指針變量的聲明:
typedef int (*fun_ptr)(int,int); // 聲明一個指向同樣參數(shù)、返回值的函數(shù)指針類型,fun_ptrshi指針函數(shù)
13、在 C 語言中,字符串實際上是使用 null 字符 '\0' 終止的一維字符數(shù)組。
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
依據(jù)數(shù)組初始化規(guī)則,您可以把上面的語句寫成以下語句:
char greeting[] = "Hello";在使用不定長數(shù)組初始化字符串時默認結(jié)尾為 \0

14、struct 語句定義了一個包含多個成員的新的數(shù)據(jù)類型,struct 語句的格式如下:

    member-list
    member-list 
    member-list  
    ...
} variable-list ;

為了訪問結(jié)構(gòu)的成員,我們使用成員訪問運算符(.)
定義指向結(jié)構(gòu)的指針,方式與定義指向其他類型變量的指針相似,
struct Books *struct_pointer;struct_pointer = &Book1;
為了使用指向該結(jié)構(gòu)的指針訪問結(jié)構(gòu)的成員,您必須使用 -> 運算符,
struct_pointer->title;

15、,C 語言又提供了一種數(shù)據(jù)結(jié)構(gòu),稱為"位域"或"位段"。
所謂"位域"是把一個字節(jié)中的二進位劃分為幾個不同的區(qū)域,并說明每個區(qū)域的位數(shù)。每個域有一個域名,允許在程序中按域名進行操作。

{

 位域列表

};
struct bs{
    int a:8;
    int b:2;
    int c:6;
}data;

位域的使用和結(jié)構(gòu)成員的使用相同,其一般形式為:
位域變量名.位域名
位域變量指針->位域名

16、共用體是一種特殊的數(shù)據(jù)類型,允許您在相同的內(nèi)存位置存儲不同的數(shù)據(jù)類型。您可以定義一個帶有多成員的共用體,但是任何時候只能有一個成員帶有值。共用體提供了一種使用相同的內(nèi)存位置的有效方式。

{
   member definition;
   member definition;
   ...
   member definition;
} [one or more union variables];

17、C 語言提供了 typedef 關(guān)鍵字,您可以使用它來為類型取一個新的名字;

typedef unsigned char BYTE;

define 是 C 指令,用于為各種數(shù)據(jù)類型定義別名,與 typedef 類似,但是它們有以下幾點不同:

typedef 僅限于為類型定義符號名稱,#define 不僅可以為類型定義別名,也能為數(shù)值定義別名,比如您可以定義 1 為 ONE。
typedef 是由編譯器執(zhí)行解釋的,#define 語句是由預編譯器進行處理的。

18、C 語言把所有的設備都當作文件。所以設備(比如顯示器)被處理的方式與文件相同。以下三個文件會在程序執(zhí)行時自動打開,以便訪問鍵盤和屏幕。stdin、stdout、stderr(文件指針);char getchar(void) & putchar() 函數(shù)char * gets(char *s) & puts() 函數(shù);int scanf(const char *format) 和 printf() 函數(shù)

19、C 預處理器不是編譯器的組成部分,但是它是編譯過程中一個單獨的步驟。簡言之,C 預處理器只不過是一個文本替換工具而已,它們會指示編譯器在實際編譯之前完成所需的預處理,所有的預處理器命令都是以井號(#)開頭,別忘了#endif;宏延續(xù)運算符(\)一個宏通常寫在一個單行上。但是如果宏太長,一個單行容納不下,則使用宏延續(xù)運算符(\);字符串常量化運算符(#)
在宏定義中,當需要把一個宏的參數(shù)轉(zhuǎn)換為字符串常量時,則使用字符串常量化運算符(#)

#define  message_for(a, b)  \
    printf(#a " and " #b ": We love you!\n");

標記粘貼運算符(##)宏定義內(nèi)的標記粘貼運算符(##)會合并兩個參數(shù)。它允許在宏定義中兩個獨立的標記被合并為一個標記
20、引用頭文件相當于復制頭文件的內(nèi)容,#include <file>這種形式用于引用系統(tǒng)頭文件。它在系統(tǒng)目錄的標準列表中搜索名為 file 的文件;
如果一個頭文件被引用兩次,編譯器會處理兩次頭文件的內(nèi)容,這將產(chǎn)生錯誤。為了防止這種情況,標準的做法是把文件的整個內(nèi)容放在條件編譯語句中,如下:

ifndef HEADER_FILE

define HEADER_FILE

the entire header file file

endif

include "file"這種形式用于引用用戶頭文件。它在包含當前文件的目錄中搜索名為 file 的文件。

21、強制類型轉(zhuǎn)換是把變量從一種類型轉(zhuǎn)換為另一種數(shù)據(jù)類型。(type_name) expression,注意的是強制類型轉(zhuǎn)換運算符的優(yōu)先級大于除法;常用的算術(shù)轉(zhuǎn)換是隱式地把值強制轉(zhuǎn)換為相同的類型
22、C 語言不提供對錯誤處理的直接支持,但是作為一種系統(tǒng)編程語言,它以返回值的形式允許您訪問底層數(shù)據(jù)。在發(fā)生錯誤時,大多數(shù)的 C 或 UNIX 函數(shù)調(diào)用返回 1 或 NULL,同時會設置一個錯誤代碼 errno,該錯誤代碼是全局變量,表示在函數(shù)調(diào)用期間發(fā)生了錯誤。程序成功執(zhí)行完一個操作正常退出的時候會帶有值 EXIT_SUCCESS。在這里,EXIT_SUCCESS 是宏,它被定義為 0。
如果程序中存在一種錯誤情況,當您退出程序時,會帶有狀態(tài)值 EXIT_FAILURE,被定義為 -1
23、可變參數(shù),函數(shù) int func(int, ... ) 最后一個參數(shù)寫成省略號,即三個點號(...),省略號之前的那個參數(shù)是 int,代表了要傳遞的可變參數(shù)的總數(shù)。為了使用這個功能,您需要使用 stdarg.h 頭文件,該文件提供了實現(xiàn)可變參數(shù)功能的函數(shù)和宏。int demo(char msg, ... ) ,char 類型的可變參數(shù)。
24、C 語言為內(nèi)存的分配和管理提供了幾個函數(shù)。這些函數(shù)可以在 <stdlib.h> 頭文件中找到;
void *calloc(int num, int size); 返回void *指針,可以轉(zhuǎn)換為任何類型的指針。
void free(void *address);
24、命令行參數(shù),可以從命令行傳值給 C 程序。這些值被稱為命令行參數(shù);命令行參數(shù)是使用 main() 函數(shù)參數(shù)來處理的,其中,argc 是指傳入?yún)?shù)的個數(shù),argv[] 是一個指針數(shù)組,指向傳遞給程序的每個參數(shù)。
int main( int argc, char argv[] ) argv[] 是一個指針數(shù)組,指向傳遞給程序的每個參數(shù)
argv[0] 存儲程序的名稱,argv[1] 是一個指向第一個命令行參數(shù)的指針,
argv[n] 是最后一個參數(shù)。如果沒有提供任何參數(shù),argc 將為 1,否則,如果傳遞了一個參數(shù),argc 將被設置為 2。

*****字符串常量的本質(zhì)表現(xiàn)是代表它的第一個字符的地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,695評論 2 370

推薦閱讀更多精彩內(nèi)容

  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運用指針編程是C語言最主要的風格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,460評論 3 44
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,803評論 2 9
  • 1.語言中變量的實質(zhì) 要理解C指針,我認為一定要理解C中“變量”的存儲實質(zhì), 所以我就從“變量”這個東西開始講起吧...
    金巴多閱讀 1,799評論 0 9
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,529評論 1 51
  • 第十章 指針 1. 地址指針的基本概念: 在計算機中,所有的數(shù)據(jù)都是存放在存儲器中的。一般把存儲器中的一個字節(jié)稱為...
    堅持到底v2閱讀 1,079評論 2 3