變量的聲明有兩種情況:
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)是代表它的第一個字符的地址