A .基本類型要點:
1. 結構體:c++在處理結構體時,是按照一般的變量進行處理的。結構體可以作為函數參數和返回值。作為函數參數時,也分傳值和傳引用的區(qū)別,而作為返回值時,返回的是結構體的一個拷貝。可以將一個結構賦給另外一個結構。
2. 枚舉: 枚舉量是整型,可以被提升為Int類型,但是int不能自動轉換為枚舉類型; 還有沒有為枚舉定義操作符+; 如果Int值是有效的,可以通過強制類型轉換,把它賦給枚舉變量; 顯示設置枚舉值時,指定的值必須是整數; 枚舉的取值范圍為大于最大值得、最小的2的冪-1。例如enum bigstep{one=1,two=2,third=100}; 則bigstep的取值范圍為0~127。
3. int *p1,p2;將創(chuàng)建一個指針和一個常規(guī)的int變量。
4. c++在創(chuàng)建指針時,計算機將分配用來存儲地址的內存,但不會分配用來存儲指針所指向的數據的內存。
5. 如果要將數字值作為地址來使用,應通過強制類型轉換將數字轉換為適當的地址類型。
6. c++中,值為0的指針為空指針。確保空指針不會指向有效的數據。
7. 不要嘗試釋放已經釋放的內存塊,但是對空指針使用delete是安全的。所以盡量不要創(chuàng)建2個指向同一個內存塊的指針。
8. 不能使用sizeof操作符來確定動態(tài)分配的數組包含的字節(jié)數!!!、
9. 數組和指針的區(qū)別:1.數組名是指針,可以對指針進行+(-)操作,但是數組名不可以; 2.對數組應用sizeof得到的是數組的長度,而對指針應用得到的是指針的長度。
10. 如果給cout提供一個指針,它將打印地址。但如果指針的類型為char *,則cout將顯示指向的字符串。如果要顯示字符串的地址,則必須將這種指針強制轉換為另外一種指針類型,如Int *。
B .循環(huán)和關系表達式:
1. 遞增和遞減操作符在同一個值中使用多次時,因為每個編譯器很可能對于“使用后修改”和“修改后使用”的規(guī)則可能不同,因此可能導致在不同的編譯器下得到不同的結果。
2. c++規(guī)定,在使用遞增或者遞減時,確定一個完整表達式(它是這樣一個表達式,不是另一個更大表達式的子表達式),每個完整表達式完了,在下一個開始之前,都要評估一次。例如:while(guest++<10) printf("%d",guest); 其中的guest++<10是一個完整表達式,一次在第一次printf的之前,要評估一次,這樣打出來的guest已經加一; 再如,y=(4+x++)+(6+x++);,顯然整個句子才是一個完整表達式,c++只保證在執(zhí)行下一條語句之前,x+2,但是沒有規(guī)定是在計算每個子表示式之后將x遞增還是在整個表達式計算完畢之后才將x的值遞增!這個時候跟編譯器有關,所以盡量避免使用這樣的句子。
3. *和++同時作用于指針時,取決于優(yōu)先級。前綴指針和*的優(yōu)先級同,從右到左結合。后綴比*(還有前綴)優(yōu)先級高。
4. c++為類型建立別名的方式有兩種:1.預處理器 #define BYTE char 2.使用typedef typedef char BYTE; 最好使用typedef.
C .分支語句和邏輯操作符:
- switch(integer-expression){} 中的判斷表達式必須為一個結果為整數的表達式。因此switch不能處理浮點測試。都是整數時,如果選項超過2個,switch的效率比if else高。
D .函數
1. 在c++中,void test();與void test(void)是等效的,意味著函數沒有參數。argument--實參 parameter--形參
2. 在c++中,當且僅當用于函數參數時,int *arr和int arr[]的含義是相同的,它們都意味著arr是一個int指針。
3. int age=39; const int *p=&age; 后邊的聲明表示p指向一個const int(這里為39),因此不能使用pt來修改這個值。即*p=31;這個語句是不合法的。我們能通過修改age=23;來改變age的值,但是這個時候*p仍然為39!!也就是const int *p一旦指定一個值后,*p的內容將不改變,即不能通過*p改變值。
4. 將const的地址賦給常規(guī)指針是不可行的。后邊再詳細討論下const+指針的情況。
5. 獲取函數的地址很簡單:只要使用函數名即可,不跟參數。聲明函數指針時應該指定函數的返回類型及函數的參數列表。例如一個函數的原型為 double pam(int); 則其對應的函數指針的聲明為:double (*pPam)(int); pPam就是函數pam的函數指針。則我們現在可以賦值 pf=pPam; 然后就可以使用這個函數指針來調用函數了。例如:double r=(*pPam)(5);或者double r=pPam(5);