C++學習筆記(五)
函式、遞迴、函式指標
1.函式的返回值型別不能是陣列,但可以將陣列作為結構或物件的組成部分來返回
2.按值傳遞時,函式使用的使引數的拷貝,而不是原來的資料。
3.當且僅當用於函式頭或函式原型中時,int *arr 與int arr[ ]含義相同。在其他的上下文中,兩者含義並不相同。例如並不能在函式體中使用int tip[ ]來宣告指標。
有兩個恆等式: arr[i]==*(arr+i);
&arr[i]==arr+i;
4.當引數為陣列,傳遞的並不是陣列內容,而是陣列的地址、包含的元素型別及元素數目。傳遞常規變數時,函式將使用變數的拷貝,而傳遞陣列時,函式將使用原來的陣列。
5.對函式外宣告的陣列名呼叫sizeof函式,獲得的陣列長度;但是如果對該陣列在某函式中傳遞的地址名呼叫sizeof,得到的是陣列的指標的長度,因為在函式中傳遞的不是整個陣列值而是陣列的指標(地址)。
6.由於函式在傳遞普通引數時採用值傳遞,函式使用的使資料的拷貝,而傳遞陣列時,接收陣列名的函式將會使用原始資料,為了防止函式無意修改陣列內容的行為,可在宣告形參時使用關鍵字const。
如: void show_array(const double ar[ ],int n); //並不是說ar是常量陣列,而是不允許對ar在函式中進行修改。
同時,由於直接對原始陣列進行修改,因此可以在函式中修改資料,而不必將修改後的資料再次進行返回。
7.const型別與指標:
(1)const int* pt = &age; //age是變數不是常量,但pt是一個常量指標。這意味著,age可以更改,但不能通過更改pt指標去改 變它。
(2)可以將const變數的地址給指向const的指標,但不能將const的地址賦給常規指標。
如const float g_earth = 9.80;
const float *pe=&g_earth; //合法
const float g_moon=1.63;
float *pm =&g_moon; //不合法
(3)涉及到指標之間的const賦值時,僅有一級間接關係可以賦值。如&p1賦給const指標p2,則可以使用P1來修改const資料。
8.二維陣列做函式的引數時,形如int arr[3][4]和arr(*int )[4],是表示這個陣列有三個元素,分別是三個指向四個Int型別的指標。因此在作為函式引數傳遞時,第一個引數可以省略,第二個不可以。即宣告可以為:
int sum(int arr[][4],int size);
9.傳遞C語言風格的字串(以‘\0’結尾的字元陣列)時,由於內建'\0',因此傳參時可以不必傳遞陣列的長度。
10.遞迴:遞迴函式呼叫自己,則被呼叫的函式也將呼叫自己,這將無限迴圈下去,直到程式碼中包含終止呼叫鏈的內容。如:
void recurs(argumentlist) //只要if為true則將一直執行statemetns1呼叫recurs(),而不會執行statements2。
//當if語句為false,當前呼叫將執行statements2.當結束後將返回呼叫recurs執行statements2再結 //束返回給之前的一個呼叫。
{
statements1;
if(test)
recurs(arguments)
statements2
}
如: int main( )
{
countdown(4);
return 0;
}
void countdown(int n)
{
cout<<"counting down..."<<n<<endl;
if(n>0) countdown(n-1);
cout<<n<<":Kaboom!\n";
}
上述程式碼輸出結果將為:
counting down...4
counting down...3
counting down...2
counting down...1
counting down...0
0:Kaboom!
1:Kaboom!
2:Kaboom!
3:Kaboom!
4:Kaboom!
在這個過程當中,當程式達到第5次呼叫時,將會有5個地址不同的獨立的n變數產生。
11.獲取函式的地址: 如process(think);//將函式think的地址作為引數傳入process函式
thought(think());//呼叫函式think,並將它的返回值作為引數傳入thought函式