1. 程式人生 > >C++學習筆記(五)

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函式