1. 程式人生 > >指針和引用(4)指向指針的指針

指針和引用(4)指向指針的指針

錯誤 可能 中修改 數組 三個參數 參數 argc clas 指向

1.知識點

(1)在程序中可以聲明指向任何數據類型的指針,指針也可以指向指針類型,成為指向指針的指針。下面是一個使用例子

1 int a=10,b=20;
2 int *q=&a;
3 int **p=&q;
4 **p=30;

(2)如果想通過指針在被調函數中修改主調函數的變量,必須將主調函變量(務必確定該變量的類型,有時候可能變量本身就是指針,這時候形參就需要是指針的指針了)的地址作為參數,在被調函數中修改主調函數指向的內容。

2.面試題

2.1指針作為參數的常見錯誤

 1 int find(char *s, char ch, char *sub) {
 2     for
(int i = 0; *(s + i) != \n; i++) { 3 if (*(s + i) == ch) { 4 sub = s + i + 1; 5 return i; 6 } 7 } 8 return 0; 9 } 10 11 int main(int argc, char *argv[]) { 12 char fullName[] = {"Jordan#Michale"}; 13 char *givenName=fullName; 14 15 int
cnt = find(fullName, #, givenName); 16 cout << givenName << "has a" << cnt << "characters ‘family name" << endl; 17 18 getchar(); 19 return 0; 20 }

重點知識點:(1)如果想通過指針在被調函數中修改主調函數的變量,必須將主調函變量的地址作為參數,在被調函數中修改主調函數指向的內容。

(2)通過指針傳遞參數時,最大的忌諱就是以為只要參數是指針就萬事大吉了。實際上,應該首先確定要修改的變量的類型,然後再將其地址作為參數。如果要修改的變量本身就是指針,就應該將該指針的地址作為參數,此時的形參類型是指向指針的指針。

以上第三個參數的指向的改變並不能帶來實參的改變,正確答案如下:

 1 int find(char *s, char ch, char **sub) {
 2     for (int i = 0; *(s + i) != \n; i++) {
 3         if (*(s + i) == ch) {
 4             *sub = s + i + 1;
 5             return i;
 6         }
 7     }
 8     return 0;
 9 }
10 
11 int main(int argc, char *argv[]) {
12 
13     char fullName[] = {"Jordan#Michale"};
14     char *givenName=NULL;
15 
16     int cnt = find(fullName, #, &givenName);
17     cout << givenName << " has a " << cnt << " characters ‘family name" << endl;
18 
19     getchar();
20     return 0;
21 }

2.2指向指針的指針和二維數組的區別

1 int main(){
2   int a[2][3]={{1,2,3},{4,5,6}};
3   int **p=a;
4   cout<<**p<<endl;
5   getchar();
6   return 0;        
7 }

解析:p是指向指針的指針(類型是int **),a<=>&a[0],a[0]是一個一維數組(相當於對一維數組名a[0]取地址,它應該賦值給int *[3])。所以左邊是一個指向指針的指針,右邊是一個指向數組的指針,兩邊類型不同。如果想編譯通過,應該定義一個指向數組的指針,修改如下:

1 int (*p)[3]=a;

小技巧:判斷變量的類型:

變量的類型在聲明之初就已經確定了,在程序中只要將聲明語句中變量名去掉,剩下的部分就是變量的類型。如下:

1 int **p的類型是:int**
2 int a[2][3]的類型是:int[2][3]
3 const int(const *p)[3]的類型是:const int(cosnt *)[3]

指針和引用(4)指向指針的指針