Register關鍵字
Register 聲明寄存器變量【盡可能將變量存在CPU內部寄存器,不是絕對哦】
CPU讀取數據:內存——寄存器——CPU
雖然寄存器的速度非常快,但也有限制:register變量必須是能被CPU寄存器接受的類型,意味著register變量必須是一個單個的值,並且其長度應小於或等於整型的長度。而且register變量可能不存放在內存中,所以不能用取址運算符&來獲取register變量的地址。
Volatile 說明變量在程序執行中可被隱含的改變
Sizeof 計算對象所占內存空間的大小,這個是關鍵字(⊙o⊙)哦~
[cpp]
int i = 0;
A)sizeof(i) B)sizeof(int) C)sizeof i D)sizeof int
int i = 0;
A)sizeof(i) B)sizeof(int) C)sizeof i D)sizeof int上面,ABC都是對的,D不對。
【注意】sizeof在計算變量所占空間大小時,括號可以省略;而計算類型大小時,不能省略。
看看下面的練習:
注意,sizeof(a)的值,我們再看:
【總結】Sizeof計算大小時,其實傳入的是類型,與變量具體的值無關。&a、&a[0]、&a[0][0]都是地址,所以大小都為4;a的類型是char[10][10],所以是100,同理,a[0]、a[1][1]的類型分別是char[10]和char,所以大小分別是10和1。
此處傳入的是指針char*,所以大小是4.若b為int[100],則傳遞的是int *。
【總結】函數參數為數組時,傳遞的不是整個數組,而是數組地址,即指針。
Sizeof與strlen的區別:
再來一個更勁爆的:
Sizeof計算結構體大小:
成員對齊規則是:每個成員按其類型的對齊參數(通常是這個類型的大小)和指定的對齊參數中較小的一個對齊,即min(sizeof(item), n)。並且結構的長度必須為所用過的所有對齊參數的整數倍,不夠就補空字節。
s1的大小為3,而s2的大小為5,說明s1的最大對齊參數是1,即s1的數據成員的最大對齊參數,而不是將s1的大小作為一個對齊參數。
Unsigned關鍵字
看一個例子:
Const關鍵字 == readonly
Const修飾的只讀變量必須在定義的同時初始化。
注意,case語句後面不可以是const變量。
Const與define
Const修飾變量和數組時,可以放在類型的前面和後面:
修飾指針的時候:
Const修飾函數的參數,不希望參數值在函數體內意外改變。
Typedef關鍵字
Typedef與define的區別:
Define是宏定義,在預編譯的時候起作用,只是做簡單的替換;
Typedef是為類型新建一個別名,在編譯的時候起作用。
#define int32 static int
Define是用第一個字符串int32替換第二個空格後面的所有內容。
Typedef static int int32;
編譯報錯,多個類型聲明。
Volatile關鍵字
Volatile告訴編譯器,變量是隨時可能發生變化的,每次使用它的時候必須從內存中取出i的值。
const volatile int i = 3; 是只讀變量。
Union關鍵字
[plain]
//返回1表示是小端模式;返回0,表示是大端模式
int checkSystem()
{
union check
{
int i;
char ch;
} c;
c.i = 1;
return(c.ch == 1);
}
//返回1表示是小端模式;返回0,表示是大端模式
int checkSystem()
{
union check
{
int i;
char ch;
} c;
c.i = 1;
return(c.ch == 1);
}
static關鍵字
修飾變量
靜態全局變量,作用域僅限於變量被定義的文件中,其他文件即使用extern聲明也沒法使用它。准確的說是從定義之處開始,到文件結尾處結束,在定義之處前面的代碼也不能使用。
靜態局部變量在函數體內定義,只能在函數內使用,但生命周期與文件相同。
【注意】靜態變量只在定義時初始化一次。如下代碼:
每次調用f1時,i的值都會遞增,不會再重新定義;每次調用f2時,j的值都會被重新復制,所以,j只遞增一次。
修飾函數
靜態函數的作用域僅限於本文件(又稱內部函數)。
綜上,關鍵字static有倆含義:退出一個塊後仍然存在的局部變量;不能被其他文件訪問的全局變量和函數。
靜態變量的內存分配在堆棧,因為它們的大小在編譯的時候就是確定的。