Coursera 程式設計實習 / Practice on Programming 筆記(第一週)
001-函式指標
格式:型別名(*指標變數名)(引數型別,引數型別……)
定義例項:int (*pf) (int, char);
使用例項:pf = PrintMin; /* 此處切記,函式僅有名稱,沒有引數列表】*/
pf(x, y); /* 函式指標直接作為函式名使用 */
qsort(base【起始地址】, nelem【元素個數】, width【元素大小】, (*pfcompare)【比較函式指標】)
int cmp(const void* a, const void* b){} 返回值:
(1)負整數:a應該在b前面;(2)零:a,b位置不變;(3)正整數:a應該在b後面。
002-命令列引數
命令列引數:可執行檔名後面的字串,例如 notepad sample.txt 中,sample.txt 就是命令列引數。
需要對命令列引數進行處理,那麼 int main() 函式需要 int main(int argc【引數個數,包含可執行檔名,故至少為 1】, char*argv[]【存放參數,argv[0] 是可執行檔名】)
如果有命令列引數內部有空格,則使用雙引號" "整個括起來輸入,例如:sample para1 para2 s.txt 5 "hello world"
003-位運算
(1)~按位非:唯一的單目位運算子,例如:~21
(2)&按位與:清0操作,或者取出某一位。例如:判斷 n 的第7位是1?n&=0x80
(3)| 按位或:清1操作
(4)^ 按位異或:某些位取反(^1),例如:低8位取反 n^0xff
特殊異或性質:因為a^b=c,則有c^a=b,c^b=a
特殊異或技巧:不允許使用臨時變數,交換 a,b 兩數的值。a = a^b,b=b^a,a=a^b
(5)a << b:左移位,高位丟棄,低位補 0。比乘法快上很多,與2的冪次方相乘
(6)a >> b:右移位,低位丟棄,高位補充與原正負符號位相同的位。結果並不與除法相同,是除以2的冪次方後結果往小取的整數。-1.xx => -2,1.xx => 1
例題:判斷 a 的第 n(0<=n<=31) 位上0?1?答案:(a>>n)&1【注意:第31位上是符號位】
004-引用
int& r = n; // r 的型別是 int&,r 是 n 的別名,本質上是同一個事物
引用必須在定義時初始化,只能引用一次(從一而終)
引用物件只能是變數,不能是表示式、不能是常量:int& a = 8; int& b = n*5;
使用例項:(1)int &r1 = a; int &r2 = r1; r1 = b; 此時 a, r1 , r2 都是同一個事物,變一個其他都改變。此時 r1 = b; 中 r1 仍是 a,此句僅是賦值(從一而終)
(2)交換引數值函式:void swap(int& a, int& b) { int tmp = a; a = b; b = tmp;}
(3)函式返回型別是引用:int n; int& set() {return n;} void main(){set() = 40;} 此處即 n 被賦值 40
常引用不能修改 r = 5 是非法賦值,但是可以修改常引用所引用的變數:const int& r = n; r 不能修改,但是 n 的值可以修改
005-const關鍵字和常量
少用 define,多用 const;可以用於函式的引數型別
不能通過常量指標修改指向的內容,但是可以通過常量指標指向的變數修改,可以修改常量指標的指向:const int* p = &n; *p = 5不行,但是 n=4 可以
不同於引用:常量指標可以修改常量指標的指向(引用中,修改指向視為賦值),p = &m 通過
常量指標 = 非常量指標 可以,非常量指標 = 常量指標 不可以,除非經過強制型別轉換 int* q = (int*) p; 否則利用 q 修改 p
006-動態記憶體分配
C:malloc,C++:new
T* p = new T; T* p = new T[n]; 這兩個 p 都是指標,第一個 p 指向一個數,第二個 p 指向陣列的第一個元素
delete p; // 對應第一個 p
delete[] p; // 對應第二個 p
delete 僅能刪除 new 出的物件,不能刪除陣列
007-行內函數和過載函式
inline行內函數
過載:C++ 中才有,函式引數的個數、型別不同,即引數表不同
函式同名、引數表不同、返回型別相同 / 不同,是過載;函式同名、引數表相同、返回型別不同,是重複定義
008-函式預設引數
void func(int a, int b = 2, int c = 3){},為了函式擴充性(省去每個函式的修改)
使用例項:func(10); func(10, 8);// 此時更改了第二個引數為8,第三個函式還是預設值3,但是隻能預設最右邊的引數
func(10, , 6); // 錯誤