1.使用指標最好初始化,這樣方式使用未初始化的指標導致系統崩潰 例如 int *p = 0; 或者 int val = 10;int *p = &val;
2.只能把0或者常量0賦值給指標 例如 int zero = 0; int *pi=zero;為錯誤的 宣告應該為const int zero = 0;
3.c++提供了一種特殊懶得指標型別void *,它可以儲存任何型別物件的位址
4.指標與引用的區別:1.引用必須初始化2.引用已經初始化,就始終指向同乙個特定物件
1.函式指標與指標函式定義區別:
指標函式 int *foo_bar{}
函式指標 typedef bool (*cmpfcn)(const string &,const string &);意思是cmpfcn是一種指向函式的指標型別的名字,它指向返回bool型別並帶有const string引用形參的函式的指標
在要使用這種函式指標型別時,值需要直接使用pf即可,不必把整個型別宣告全部寫出來。
bool lengthcompare(const string &,const string &)等價於 bool (*)(const string &,const string &)
所以cmpfcn pf1 = lengthcompare 與cmpfcn = &lengthcompare等價(直接引用函式名等效於在函式名上應用取位址操作符)
指向函式的指標可用於呼叫它所指向的函式,可以不需要使用解引用操作符,直接通過指標呼叫函式
cmpfcn pf = lengthcompare;
lengthcompare("hi","bye");
pf("hi","bye");
(*pf)("hi,"bye");
例如此例項
typedef int (*comfcn)(int &a);
int add(int &a)
int main()
函式的形參可以是指向函式的指標
void usebigger(const string &,const string *,bool(const string &,const string &))等價於 void use bigger(const string&,const string &,bool(*)(const string &,const string &)); 例子
int usebigger(const int &aa,const int &bb,int a(int &))
typedef int (*comfcn)(int &a);
int add(int &a)
int main()
返回指向函式的指標 int (*ff(int))(int *,int); 含義是ff返回 int (*)(int *,int *);
等價於 typedef int (*pf)(int *,int);
pf ff(int);
指向過載函式的指標
extern void ff(unsigned int);
void (*pf1)(unsigned int) = &ff;
void (*pf1)(int) = &ff; //錯誤,沒有精確匹配的函式,將導致編譯錯誤。
2.注意使用引用時,函式不能隱式轉換
例如
void add(int &a)
int main()
3.函式通過引用傳遞陣列 例如
void printvalues(int (&arr)[10]);//因為操作符優先順序高,所以必須加()
int main() ;
printvalues(k);
return 0; }
引用形參限制了可以傳遞的實參陣列,只能使用長度匹配的實參陣列來呼叫函式。當函式需要處理陣列且函式體不依賴與陣列的長度時應使用指標形參,其他情況下應該使用引用形參
4.sizeof()是c/c++的乙個操作符,返回型別為size_t一般定義為typedef unsigned int size_t
5.兩種方式在main函式中傳遞實參(1).主函式形式為int main(){} 在命令列中prog - d -o ofile data0,相當於int main(int argc,char *argc){}
(2).直接這樣定義主函式int main(int argc,char **argv())
6.atoi(const char *nptr)把乙個字串轉換成整數 在標頭檔案stdlib.h中
atof:轉換成雙精度浮點 atol轉換成長整形
ascⅱ中數字字元值 數字0為48 a為65 a為97
7.return返回時候(1).千萬不要返回區域性物件的引用,因為函式執行完畢,區域性變數占用的儲存空間被釋放
(2).千萬不要返回指向區域性物件的指標,一
旦函式結束,返回的指標就變成了指向不再存在的物件的懸垂指標
(3).返回引用的函式返回乙個左值
8.定義函式體只能一次,但宣告可以多次
9.函式也可以提供預設實參 例如string screeninit(int a = 5) 當提供了實參例如 string screen = screeninit(6),則不使用;當沒定義如string screen = screeninit()則使用
,在形參表中,具有預設實參的形參應出現在形參表的末尾
10.static區域性物件的作用域在函式內,但是生命期卻跨越了這個函式的多次呼叫(注意作用域和生命期的區別 ,作用域指該名字的程式文字區,生命期指程式執行過程中物件存在的時間)
11.內聯函式可以避免函式呼叫的開銷,編譯時自動將**複製。
定義:即在函式前面加inline,內聯函式跟一般函式不同,定義必須在標頭檔案中可見,
12.const成員函式(常量成員函式) 例如bool sales_item::same_isbn(const sales_item *const this,const sales_item &rhs)const
const改變了隱含的this形參的型別。 隱含的this形參將是乙個指向total物件的const sales_item*型別的指標,由於this是指向const物件的指標,const成員函式不能修改呼叫該函式的物件,用this時候應該用->不能用.,因為this是指標
14.一般建構函式是放在public部分的,如果為private,這樣的類就沒有什麼用了
15.建構函式的初始化列表例如sales_item():units_sold(0),revenue(0.0){}在冒號和花括號之間,為類的乙個或多個資料成員指定初值
16.一般寫c++程式時,將自定義的類放在標頭檔案中,類中成員函式的實現放在.cpp檔案中
17.函式過載要求函式宣告的返回型別和形參表完全不同,不能僅僅基於不同的返回型別而實現過載
過載確定的三個步驟 例如
void f();
void f(int);
void f(int,int);
void f(double,double = 3.14);
f(5.6);
(1)確定該呼叫所考慮的過載函式集合,要求:與呼叫該函式同名,此4個都符合
(2)選擇可行函式要求:函式形參個數與呼叫實參個數相同;每個實參的型別必須與對應形參的型別匹配(可隱式轉換)
(3)尋找最佳匹配
含有多個形參的過載確定
例如上面的例子
如果呼叫f(42,2.56)則出現二義性,解決方法為呼叫顯示的強制型別轉換強制函式匹配
f(static_cast(42),2.56)或者f(42,static_cast(2.56))
18.區域性函式的宣告會遮蔽全域性函式,有時導致呼叫錯誤 例如
void print(const string &);
void foobar(int ival)
陣列指標和指標陣列 函式指標和指標函式
一 陣列指標與指標陣列 1,指標陣列 所謂指標陣列,就是指標組成的陣列,即陣列的元素為指標 int pa size size為元素數目,元素的值為int型別的指標 2,陣列指標 所謂陣列指標,就是指向陣列的指標,即其是乙個指標,指向陣列。int pa size size為陣列的元素數目,pa指向乙個...
函式指標和指標函式 陣列指標和指標陣列
函式指標 在程式執行中,函式 是程式的演算法指令部分,它們和陣列一樣也占用儲存空間,都有相應的位址。可以使用指標變數指向陣列的首位址,也可以使用指標變數指向函式 的首位址,指向函式 首位址的指標變數稱為函式指標。1 函式指標定義 函式型別 指標變數名 形參列表 函式型別 說明函式的返回型別,由於 的...
陣列 陣列指標和函式指標
陣列中每個元素都是物件,即占有特定型別的記憶體空間。陣列名可以轉化為這個陣列物件的首個元素的位址。這裡我們不去討論一維陣列,直接從二維說起。所謂二維陣列也是陣列,只不過它的元素也是乙個陣列。首先我們寫乙個二維陣列留作使用 include using namespace std int a 10 vo...