變量的聲明有兩種情況:
1记劝、一種是需要建立存儲(chǔ)空間的婿禽。例如:int a 在聲明的時(shí)候就已經(jīng)建立了存儲(chǔ)空間寺渗。
2、另一種是不需要建立存儲(chǔ)空間的疼进,通過(guò)使用extern關(guān)鍵字聲明變量名而不定義它薪缆。 例如:extern int a 其中變量 a 可以在別的文件中定義的。
除非有extern關(guān)鍵字伞广,否則都是變量的定義拣帽。
左值(lvalue):指向內(nèi)存位置的表達(dá)式被稱為左值(lvalue)表達(dá)式;
右值(rvalue):術(shù)語(yǔ)右值(rvalue)指的是存儲(chǔ)在內(nèi)存中某些地址的數(shù)值嚼锄。
3减拭、存儲(chǔ)類(lèi)定義 C 程序中變量/函數(shù)的范圍(可見(jiàn)性)和生命周期。這些說(shuō)明符放置在它們所修飾的類(lèi)型之前区丑。下面列出 C 程序中可用的存儲(chǔ)類(lèi):auto 只能用在函數(shù)內(nèi)拧粪,即 auto 只能修飾局部變量。register 存儲(chǔ)類(lèi)用于定義存儲(chǔ)在寄存器中而不是 RAM 中的局部變量沧侥;static 存儲(chǔ)類(lèi)指示編譯器在程序的生命周期內(nèi)保持局部變量的存在可霎,而不需要在每次它進(jìn)入和離開(kāi)作用域時(shí)進(jìn)行創(chuàng)建和銷(xiāo)毀。因此宴杀,使用 static 修飾局部變量可以在函數(shù)調(diào)用之間保持局部變量的值癣朗。
4、extern 存儲(chǔ)類(lèi)用于提供一個(gè)全局變量的引用旺罢,全局變量對(duì)所有的程序文件都是可見(jiàn)的旷余。extern 修飾符通常用于當(dāng)有兩個(gè)或多個(gè)文件共享相同的全局變量或函數(shù)的時(shí)候。
5扁达、傳值調(diào)用正卧,該方法把參數(shù)的實(shí)際值復(fù)制給函數(shù)的形式參數(shù)。在這種情況下罩驻,修改函數(shù)內(nèi)的形式參數(shù)不會(huì)影響實(shí)際參數(shù)穗酥。引用調(diào)用,通過(guò)指針傳遞方式惠遏,形參為指向?qū)崊⒌刂返闹羔樌荆?dāng)對(duì)形參的指向操作時(shí),就相當(dāng)于對(duì)實(shí)參本身進(jìn)行的操作节吮。默認(rèn)情況下抽高,C 使用傳值調(diào)用來(lái)傳遞參數(shù)。一般來(lái)說(shuō)透绩,這意味著函數(shù)內(nèi)的代碼不能改變用于調(diào)用函數(shù)的實(shí)際參數(shù)翘骂。
6壁熄、/* 函數(shù)聲明 *///作用是可以將函數(shù)的實(shí)現(xiàn)放到main后面定義,嚴(yán)格遵守先聲明再使用的規(guī)則
7碳竟、全局變量與局部變量在內(nèi)存中的區(qū)別:全局變量保存在內(nèi)存的全局存儲(chǔ)區(qū)中草丧,占用靜態(tài)的存儲(chǔ)單元;
局部變量保存在棧中莹桅,只有在所在函數(shù)被調(diào)用時(shí)才動(dòng)態(tài)地為變量分配存儲(chǔ)單元昌执。當(dāng)局部變量被定義時(shí),系統(tǒng)不會(huì)對(duì)其初始化诈泼,您必須自行對(duì)其初始化懂拾。定義全局變量時(shí),系統(tǒng)會(huì)自動(dòng)對(duì)其初始化
8铐达、另外岖赋,C 不支持在函數(shù)外返回局部變量的地址,除非定義局部變量為 static 變量瓮孙。
9唐断、所有指針的值的實(shí)際數(shù)據(jù)類(lèi)型,不管是整型衷畦、浮點(diǎn)型栗涂、字符型,還是其他的數(shù)據(jù)類(lèi)型祈争,都是一樣的斤程,都是一個(gè)代表內(nèi)存地址的長(zhǎng)的十六進(jìn)制數(shù)。不同數(shù)據(jù)類(lèi)型的指針之間唯一的不同是菩混,指針?biāo)赶虻淖兞炕虺A康臄?shù)據(jù)類(lèi)型不同忿墅。為指針變量賦一個(gè) NULL 值是一個(gè)良好的編程習(xí)慣。賦為 NULL 值的指針被稱為空指針沮峡。NULL 指針是一個(gè)定義在標(biāo)準(zhǔn)庫(kù)中的值為零的常量疚脐,這個(gè)運(yùn)算會(huì)在不影響內(nèi)存位置中實(shí)際值的情況下,移動(dòng)指針到下一個(gè)內(nèi)存位置
10邢疙、我們想要讓數(shù)組存儲(chǔ)指向 int 或 char 或其他數(shù)據(jù)類(lèi)型的指針棍弄。下面是一個(gè)指向整數(shù)的指針數(shù)組的聲明:int *ptr[MAX];
數(shù)組指針:意思是說(shuō)這個(gè)指針存放著一個(gè)數(shù)組的首地址,或者說(shuō)這個(gè)指針指向一個(gè)數(shù)組的首地址疟游。
指針數(shù)組:意思是說(shuō)這個(gè)數(shù)組的所有元素都是指針類(lèi)型呼畸。
11、指向指針的指針是一種多級(jí)間接尋址的形式颁虐,int **var;能接受指針作為參數(shù)的函數(shù)蛮原,也能接受數(shù)組作為參數(shù);C 語(yǔ)言不支持在調(diào)用函數(shù)時(shí)返回局部變量的地址另绩,除非定義局部變量為 static 變量儒陨。
12花嘶、函數(shù)指針變量的聲明:
typedef int (*fun_ptr)(int,int);
// 聲明一個(gè)指向同樣參數(shù)、返回值的函數(shù)指針類(lèi)型蹦漠,fun_ptrshi指針函數(shù)
13椭员、在 C 語(yǔ)言中,字符串實(shí)際上是使用 null 字符 '\0' 終止的一維字符數(shù)組笛园。
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
依據(jù)數(shù)組初始化規(guī)則拆撼,您可以把上面的語(yǔ)句寫(xiě)成以下語(yǔ)句:
char greeting[] = "Hello";
在使用不定長(zhǎng)數(shù)組初始化字符串時(shí)默認(rèn)結(jié)尾為 \0
14、struct 語(yǔ)句定義了一個(gè)包含多個(gè)成員的新的數(shù)據(jù)類(lèi)型喘沿,struct 語(yǔ)句的格式如下:
member-list
member-list
member-list
...
} variable-list ;
為了訪問(wèn)結(jié)構(gòu)的成員,我們使用成員訪問(wèn)運(yùn)算符(.)
定義指向結(jié)構(gòu)的指針竭贩,方式與定義指向其他類(lèi)型變量的指針相似蚜印,
struct Books *struct_pointer;struct_pointer = &Book1;
為了使用指向該結(jié)構(gòu)的指針訪問(wèn)結(jié)構(gòu)的成員,您必須使用 -> 運(yùn)算符留量,
struct_pointer->title;
15窄赋、,C 語(yǔ)言又提供了一種數(shù)據(jù)結(jié)構(gòu)楼熄,稱為"位域"或"位段"忆绰。
所謂"位域"是把一個(gè)字節(jié)中的二進(jìn)位劃分為幾個(gè)不同的區(qū)域,并說(shuō)明每個(gè)區(qū)域的位數(shù)可岂。每個(gè)域有一個(gè)域名错敢,允許在程序中按域名進(jìn)行操作。
{
位域列表
};
struct bs{
int a:8;
int b:2;
int c:6;
}data;
位域的使用和結(jié)構(gòu)成員的使用相同缕粹,其一般形式為:
位域變量名.位域名
位域變量指針->位域名
16稚茅、共用體是一種特殊的數(shù)據(jù)類(lèi)型,允許您在相同的內(nèi)存位置存儲(chǔ)不同的數(shù)據(jù)類(lèi)型平斩。您可以定義一個(gè)帶有多成員的共用體亚享,但是任何時(shí)候只能有一個(gè)成員帶有值。共用體提供了一種使用相同的內(nèi)存位置的有效方式绘面。
{
member definition;
member definition;
...
member definition;
} [one or more union variables];
17欺税、C 語(yǔ)言提供了 typedef 關(guān)鍵字,您可以使用它來(lái)為類(lèi)型取一個(gè)新的名字揭璃;
typedef unsigned char BYTE;
define 是 C 指令晚凿,用于為各種數(shù)據(jù)類(lèi)型定義別名,與 typedef 類(lèi)似塘辅,但是它們有以下幾點(diǎn)不同:
typedef 僅限于為類(lèi)型定義符號(hào)名稱晃虫,#define 不僅可以為類(lèi)型定義別名,也能為數(shù)值定義別名扣墩,比如您可以定義 1 為 ONE哲银。
typedef 是由編譯器執(zhí)行解釋的扛吞,#define 語(yǔ)句是由預(yù)編譯器進(jìn)行處理的。
18荆责、C 語(yǔ)言把所有的設(shè)備都當(dāng)作文件滥比。所以設(shè)備(比如顯示器)被處理的方式與文件相同。以下三個(gè)文件會(huì)在程序執(zhí)行時(shí)自動(dòng)打開(kāi)做院,以便訪問(wèn)鍵盤(pán)和屏幕盲泛。stdin、stdout键耕、stderr(文件指針)寺滚;char getchar(void) & putchar() 函數(shù)char * gets(char *s) & puts() 函數(shù);int scanf(const char *format) 和 printf() 函數(shù)
19屈雄、C 預(yù)處理器不是編譯器的組成部分村视,但是它是編譯過(guò)程中一個(gè)單獨(dú)的步驟。簡(jiǎn)言之酒奶,C 預(yù)處理器只不過(guò)是一個(gè)文本替換工具而已蚁孔,它們會(huì)指示編譯器在實(shí)際編譯之前完成所需的預(yù)處理,所有的預(yù)處理器命令都是以井號(hào)(#)開(kāi)頭惋嚎,別忘了#endif杠氢;宏延續(xù)運(yùn)算符(\)一個(gè)宏通常寫(xiě)在一個(gè)單行上。但是如果宏太長(zhǎng)另伍,一個(gè)單行容納不下鼻百,則使用宏延續(xù)運(yùn)算符(\);字符串常量化運(yùn)算符(#)
在宏定義中质况,當(dāng)需要把一個(gè)宏的參數(shù)轉(zhuǎn)換為字符串常量時(shí)愕宋,則使用字符串常量化運(yùn)算符(#)
#define message_for(a, b) \
printf(#a " and " #b ": We love you!\n");
標(biāo)記粘貼運(yùn)算符(##)宏定義內(nèi)的標(biāo)記粘貼運(yùn)算符(##)會(huì)合并兩個(gè)參數(shù)结榄。它允許在宏定義中兩個(gè)獨(dú)立的標(biāo)記被合并為一個(gè)標(biāo)記
20中贝、引用頭文件相當(dāng)于復(fù)制頭文件的內(nèi)容,#include <file>這種形式用于引用系統(tǒng)頭文件臼朗。它在系統(tǒng)目錄的標(biāo)準(zhǔn)列表中搜索名為 file 的文件邻寿;
如果一個(gè)頭文件被引用兩次,編譯器會(huì)處理兩次頭文件的內(nèi)容视哑,這將產(chǎn)生錯(cuò)誤绣否。為了防止這種情況,標(biāo)準(zhǔn)的做法是把文件的整個(gè)內(nèi)容放在條件編譯語(yǔ)句中挡毅,如下:
ifndef HEADER_FILE
define HEADER_FILE
the entire header file file
endif
include "file"這種形式用于引用用戶頭文件蒜撮。它在包含當(dāng)前文件的目錄中搜索名為 file 的文件。
21、強(qiáng)制類(lèi)型轉(zhuǎn)換是把變量從一種類(lèi)型轉(zhuǎn)換為另一種數(shù)據(jù)類(lèi)型段磨。(type_name) expression取逾,注意的是強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符的優(yōu)先級(jí)大于除法;常用的算術(shù)轉(zhuǎn)換是隱式地把值強(qiáng)制轉(zhuǎn)換為相同的類(lèi)型
22苹支、C 語(yǔ)言不提供對(duì)錯(cuò)誤處理的直接支持砾隅,但是作為一種系統(tǒng)編程語(yǔ)言,它以返回值的形式允許您訪問(wèn)底層數(shù)據(jù)债蜜。在發(fā)生錯(cuò)誤時(shí)晴埂,大多數(shù)的 C 或 UNIX 函數(shù)調(diào)用返回 1 或 NULL,同時(shí)會(huì)設(shè)置一個(gè)錯(cuò)誤代碼 errno寻定,該錯(cuò)誤代碼是全局變量儒洛,表示在函數(shù)調(diào)用期間發(fā)生了錯(cuò)誤。程序成功執(zhí)行完一個(gè)操作正常退出的時(shí)候會(huì)帶有值 EXIT_SUCCESS狼速。在這里晶丘,EXIT_SUCCESS 是宏,它被定義為 0唐含。
如果程序中存在一種錯(cuò)誤情況,當(dāng)您退出程序時(shí)沫浆,會(huì)帶有狀態(tài)值 EXIT_FAILURE捷枯,被定義為 -1
23、可變參數(shù)专执,函數(shù) int func(int, ... ) 最后一個(gè)參數(shù)寫(xiě)成省略號(hào)淮捆,即三個(gè)點(diǎn)號(hào)(...),省略號(hào)之前的那個(gè)參數(shù)是 int本股,代表了要傳遞的可變參數(shù)的總數(shù)攀痊。為了使用這個(gè)功能,您需要使用 stdarg.h 頭文件拄显,該文件提供了實(shí)現(xiàn)可變參數(shù)功能的函數(shù)和宏苟径。int demo(char msg, ... ) ,char 類(lèi)型的可變參數(shù)躬审。
24棘街、C 語(yǔ)言為內(nèi)存的分配和管理提供了幾個(gè)函數(shù)。這些函數(shù)可以在 <stdlib.h> 頭文件中找到承边;
void *calloc(int num, int size); 返回void *指針遭殉,可以轉(zhuǎn)換為任何類(lèi)型的指針。
void free(void *address);
24博助、命令行參數(shù)险污,可以從命令行傳值給 C 程序。這些值被稱為命令行參數(shù)富岳;命令行參數(shù)是使用 main() 函數(shù)參數(shù)來(lái)處理的蛔糯,其中拯腮,argc 是指?jìng)魅雲(yún)?shù)的個(gè)數(shù),argv[] 是一個(gè)指針數(shù)組渤闷,指向傳遞給程序的每個(gè)參數(shù)疾瓮。
int main( int argc, char argv[] ) argv[] 是一個(gè)指針數(shù)組,指向傳遞給程序的每個(gè)參數(shù)
argv[0] 存儲(chǔ)程序的名稱飒箭,argv[1] 是一個(gè)指向第一個(gè)命令行參數(shù)的指針狼电,argv[n] 是最后一個(gè)參數(shù)。如果沒(méi)有提供任何參數(shù)弦蹂,argc 將為 1肩碟,否則,如果傳遞了一個(gè)參數(shù)凸椿,argc 將被設(shè)置為 2削祈。
*****字符串常量的本質(zhì)表現(xiàn)是代表它的第一個(gè)字符的地址