一、常量與變量
(1)常量:
a. 數值常量(整型常量、實型常量、字符常量);
b. const 聲明的類型;
c. define 宏定義;
d. enum 枚舉類型;
(2)變量:
在程序運行期間,隨時可能產生一些臨時數據,應用程序會將這些數據保存在一些內存單元中,每個內存單元都用一個標識符來標識。這些內存單元我們稱之爲變量,定義的標識符就是變量名,內存單元中存儲的數據就是變量的值。
(3)數據類型:
int 4字節 有符號時取值 -21億 -> +21億
無符號時取值 0 -> 42億9千萬
short 2字節
long 在32位機器下,4字節
在64位機器下,8字節
char 1字節 有符號時 -128 -> +127
無符號時 0 -> 255
long long 一般用不到
float 4字節 用IEEE標準制定
double 8字節 用IEEE標準制定(浮點數時推薦用這個)
二、循環結構
(1)for循環(一般用於循環條件已知的條件下)
for (表達式1; 表達式2; 表達式3){
語句;
}
(2)while循環(條件循環時候使用)
while(條件){
<語句體>;
}
(3)do while循環(保證循環體先執行一次,根據條件來判斷是否執行下一條)
do{
<語句體>
}while(循環條件);
(4)goto循環(不建議使用)
三、選擇結構
(1)
if(判斷條件){
語句塊1
}
else{
語句塊2
}
(2)
switch(表達式){
case 整型數值1: 語句 1;
case 整型數值2: 語句 2;
…
case 整型數值n: 語句 n;
default: 語句 n+1;
}
ps:不建議使用
四、數組
(1)一維數組
定義:類型說明符 數組名[常量表達式];
int a[10];(若不初始化,則要說明其大小,裏面是常量(const不行))
注意:1.數組中的下標是從 0 開始的(而不是 1);
2.不完全初始化時,沒有被初始化的元素自動爲 0;
3.完全不初始化,即只定義“int a[5];”那麼各個元素的值就不是0了,所有元素都是垃圾值;
4.數組下標訪問越界,本質是訪問非法內存(未定義行爲);
(2)二維數組
本質:就是一個一維數組,只不過裏面的元素是個一維數組。
定義:類型說明符 數組名[length1][length2];
length1可以看做是行數,length可以看做是列數。
(3)多維數組
本質:仍是一維數組,只不過嵌套的一位數組。
不建議使用。
五、運算符
(1)算術操作符
算術標識符都有哪些:+、-、*、/、%。
(2)移位操作符。
左移<<(相當於*2)
右移>>(相當於/2)
注意的是移植不能是負值,或者值太大。
(3)位操作符
位操作符包括:&(按位與)、|(按位或)、^(按位異或)、~(取反)。
(4)賦值操作符
賦值操作符:+=、-=、*=、/=、%=、 &=、| =、^=、<<=、>>=、
(5)單目操作符
單目操作符有:!(邏輯反操作、非)、&(取地址符)、sizeof()(求長度)、~(按位取反)、++、––、*、(類型)等。
i++ 相當於{ temp=num;
num += num;
return temp;
}
++I 相當於{
num+=num;
return num;
}
(6)關係操作符
關係操作符:<、>、<=、>=
(7)邏輯操作符
邏輯操作符:&&、||
(8)條件運算符
exp1 ? exp2 : exp3
六、函數
(1)定義:
函數就是一段封裝好的,可以重複使用的代碼,它使得我們的程序更加模塊化,不需要編寫大量重複的代碼。函數可以提前保存起來,並給它起一個獨一無二的名字,只要知道它的名字就能使用這段代碼。函數還可以接收數據,並根據數據的不同做出不同的操作,最後再把處理結果反饋給我們。
(2)形參和實參
形參(形式參數):在函數定義中出現的參數可以看做是一個佔位符,它沒有數據,只能等到函數被調用時接收傳遞進來的數據,所以稱爲形式參數,簡稱形參。
實參(實際參數):函數被調用時給出的參數包含了實實在在的數據,會被函數內部的代碼使用,所以稱爲實際參數,簡稱實參。
形參和實參的功能是傳遞數據,發生函數調用時,實參的值會傳遞給形參。
(3)遞歸函數
一個函數在它的函數體內調用它自身稱爲遞歸調用,這種函數稱爲遞歸函數。執行遞歸函數將反覆調用其自身,每調用一次就進入新的一層,當最內層的函數執行完畢後,再一層一層地由裏到外退出。如菲波那切數列
(4)函數變量的作用域
變量的作用域由變量的定義位置決定,在不同位置定義的變量,它的作用域是不一樣的。分爲局部變量和全局變量。
局部變量定義在函數內部的變量,它的作用域僅限於函數內部, 離開該函數後就是無效的,再使用就會報錯。
全局變量定義在所有函數外部定義的變量,它的作用域默認是整個程序,也就是所有的源文件,包括 .c 和 .h 文件。
開發項目,儘量不要使用全局變量,代碼重構不方便。
七、結構體
(1)定義:
C語言結構體(Struct)從本質上講是一種自定義的數據類型,只不過這種數據類型比較複雜,是由 int、char、float 等基本類型組成的。你可以認爲結構體是一種聚合類型。
struct 結構體名{
結構體所包含的變量或數組
};
(2)結構體成員的訪問
a.使用“.”來訪問
b.使用“->”來訪問
八、指針
(1)定義:
計算機中所有的數據都必須放在內存中,不同類型的數據佔用的字節數不一樣,例如 int 佔用 4 個字節,char 佔用 1 個字節。爲了正確地訪問這些數據,必須爲每個字節都編上號碼,就像門牌號、身份證號一樣,每個字節的編號是唯一的,根據編號可以準確地找到某個字節。
(2)指針變量的運算
指針+,-常數的話,就是加或者減一個指針類型的長度;
(3)指針數組和數組指針
指針數組: 是指一個數組裏面裝着指針,也即指針數組是一個數組;
定義形式:int *a[10];
數組指針:是指一個指向數組的指針,它其實還是一個指針,只不過是指向數組而已;
定義形式:int (p)[10]; 其中,由於[]的優先級高於,所以必須添加(*p).
(4)二級指針
如果一個指針指向的是另外一個指針,我們就稱它爲二級指針,或者指向指針的指針。
形式:int a =100;
int *p1 = &a;
int **p2 = &p1;
(5)空指針null和void指針
空指針:當把一個空指針常量轉換爲指針類型時,所得到的結果就是空指針。空指針常量是一個值爲 0 的整數常量表達式,或者是一個 void* 類型的表達式。在頭文件 stdlib.h、stdio.h 以及其他頭文件中,宏 NULL 被定義爲空指針常量。
void指針:指向 void 的指針,或者簡稱爲 void 指針(void pointer),是類型爲 void* 的指針。因爲沒有對象類型是 void,所以 void* 被稱爲萬能指針類型。換句話說,void 指針可以代表任何對象的地址,但不代表該對象的類型。若想獲取內存中的對象,必須先把 void 指針轉換爲合適的對象指針。