1. 程式人生 > >c++ PrimerPlus 第六版 第七章學習筆記

c++ PrimerPlus 第六版 第七章學習筆記

  1. 防止地址傳遞時更改實參地址內容:當地址作為形參時,在定義形參時使用const關鍵字,可以防止錯誤的改變形參所傳遞的地址記憶體儲的內容;且並不要求實參地址中的資料為常量 。
  2. 需要陣列作為函式形參時,形參的兩種定義方式:a)定義兩個形參,一個用於陣列名/地址的 傳遞,一個用於陣列元素個數;b)定義兩個指標型別的形參,一個用於傳遞陣列首元素地址,一個用於傳遞陣列尾元素地址(指向的是陣列最後一個元素後面的指標,而不是指向陣列的最後一個元素)。
  3. Const位置與指標

   Const表示將該關鍵字後面所定義的設為常量,不允許修改該常量的值,當const的位置不同時,其表示也不相同。

例:a、const int *pt=&ages;表示*pt是一個常量,不能通過改變*pt的值來修改ages的值,但可以對pt進行賦值即可以將另一個地址重新賦給pt;

    b、int * const pt=&ages;表示pt是一個常量,不能將其重新賦值,只能指向ages,但可以通過*pt來修改ages的值。

    C、const int * const pt=&ages;表示*pt和pt都是常量,pt只能指向ages且不能通過*pt來修改ages的值。

 4、遞迴

      如果函式有涉及到變數,每次呼叫都會建立一個新的變數,即使變數名字相同,但是不是同一個變數,地址不同,但是同一次呼叫使用的是同一個變數(第二次呼叫前後第二次呼叫結束返回第一次呼叫時)

5、指標型別:

1)指向普通資料型別的指標:(或指向數值元素) int *p p=&a(a為普通變數);

2)指向一維普通資料型別陣列的指標: int (*p)[m] ;

3)指向普通資料的指標陣列:所指向的資料的型別 *p[ 陣列長度],p是陣列名,用於存放指標;

4)指向返回值為普通資料的函式的指標變數: int(*p)(int,int…) ,將函式原型中的函式名改為*指標名即可,此時p=函式名,呼叫:p(實參列表)等價於 函式名(實參列表);

5)返回指標值的函式:返回指標所指得資料型別 *函式名(形參列表),呼叫時返回的指標型別要與主調函式保持一致;

6)指向返回指標的函式的指標:返回指標所指得資料型別 *(*p)(形參列表),將函式原型中的函式名變為*指標名即可,p與函式名等價;

7)指向返回值為函式的指標陣列:返回指標所指得資料型別 *(*ary[n]))(形參列表);注意:①、6)中的p為一級指標其與函式名等價,而7)中的ary實際為二級指標陣列名為地址(代表其中的一級指標),而其又存放了指標值,總共就為二級指標。即有:

const double *(**pd)(double* ar, int n)=p;(錯誤的 ,定義的二級指標,p為一級)

const double *(**pd)(double* ar, int n)=ary;(正確,ary為二級指標,此時pd等價於ary,也即可用pd[0]代表ary中的第一個元素,即可用pd[0](形參列表)呼叫ary[0]代表的函式)

  ②、[ ]的優先順序高於*,即有:

const double *(*pd[3])(double* ar, int n):表示pd是一個元素個數為3的指標陣列,pd先與[]結合表示為一個數組,在與*結合表示為一個指標陣列

const double *((*pd)[3])(double* ar, int n);表示pd是一個指向元素個數為3的陣列的指標。