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

2021-09-20 08:22:05 字數 1797 閱讀 1198

(1)在程式中可以宣告指向任何資料型別的指標,指標也可以指向指標型別,成為指向指標的指標。下面是乙個使用例子

1

int a=10,b=20;2

int *q=&a;

3int **p=&q;

4 **p=30;

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

1

int find(char *s, char ch, char *sub) 7}

8return0;

9}1011

int main(int argc, char *ar**) ;

13char *givenname=fullname;

1415

int cnt = find(fullname, '#'

, givenname);

16 cout << givenname << "

has a

"<< cnt << "

characters 'family name

"<1718

getchar();

19return0;

20 }

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

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

1

int find(char *s, char ch, char **sub) 7}

8return0;

9}1011

int main(int argc, char *ar**) ;

14char *givenname=null;

1516

int cnt = find(fullname, '

#', &givenname);

17 cout << givenname << "

has a

"<< cnt << "

characters 'family name

"<1819

getchar();

20return0;

21 }

1

intmain(),};

3int **p=a;

4 cout<<**p<5getchar();

6return

0;

7 }

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

1

int (*p)[3]=a;

小技巧:判斷變數的型別:

變數的型別在宣告之初就已經確定了,在程式中只要將宣告語句中變數名去掉,剩下的部分就是變數的型別。如下:

1

int **p的型別是:int**

2int a[2][3]的型別是:int[2][3]3

const

int(const *p)[3]的型別是:const

int(cosnt *)[3]

C 指標2 指向陣列的指標和指標陣列

7.4指向陣列元素的指標 宣告與賦值 例 int a 10 pa pa a 0 或 pa a p1 通過指標引用陣列元素,經過上述宣告及賦值後 pa就是a 0 pa 1 就是a 1 pa i 就是a i a i pa i a i pa i 都是等效的。不能寫 a 不能給陣列名賦值或者試圖改變其值,因...

C 指標的引用和指向引用的指標

引用僅是變數的別名,而不是實實在在地定義了乙個變數,因此引用本身並不占用記憶體,而是和目標變數共同指向目標變數的記憶體位址 表示式中的取位址符 不再是取變數的位址,而是用來表示該變數是引用型別的變數。定義乙個引用時,必須對其初始化。引用本身不是物件,因此不能定義指向引用的指標。但指標是物件,所以存在...

指標的型別 指標所指向 指向指標的引用

從語法的角度看,你只要把指標宣告語句裡的指標名字去掉,剩下的部 分就是這個指標的型別。這是指標本身所具有的型別。讓我們看看例一中各 個指標的型別 int ptr 指標的型別是int char ptr 指標的型別是char int ptr 指標的型別是int int ptr 3 指標的型別是int 3...