1. 程式人生 > >Coursera 程式設計實習 / Practice on Programming 筆記(第一週)

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); // 錯誤