(1)在程式中可以宣告指向任何資料型別的指標,指標也可以指向指標型別,成為指向指標的指標。下面是乙個使用例子
1int a=10,b=20;2
int *q=&a;
3int **p=&q;
4 **p=30;
(2)如果想通過指標在被調函式中修改主調函式的變數,必須將主調函變數(務必確定該變數的型別,有時候可能變數本身就是指標,這時候形參就需要是指標的指標了)的位址作為引數,在被調函式中修改主調函式指向的內容。
1int 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)通過指標傳遞引數時,最大的忌諱就是以為只要引數是指標就萬事大吉了。實際上,應該首先確定要修改的變數的型別,然後再將其位址作為引數。如果要修改的變數本身就是指標,就應該將該指標的位址作為引數,此時的形參型別是指向指標的指標。
以上第三個引數的指向的改變並不能帶來實參的改變,正確答案如下:
1int 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 }
1intmain(),};
3int **p=a;
4 cout<<**p<5getchar();
6return
0;
7 }
解析:p是指向指標的指標(型別是int **),a<=>&a[0],a[0]是乙個一維陣列(相當於對一維陣列名a[0]取位址,它應該賦值給int *[3])。所以左邊是乙個指向指標的指標,右邊是乙個指向陣列的指標,兩邊型別不同。如果想編譯通過,應該定義乙個指向陣列的指標,修改如下:
1int (*p)[3]=a;
小技巧:判斷變數的型別:
變數的型別在宣告之初就已經確定了,在程式中只要將宣告語句中變數名去掉,剩下的部分就是變數的型別。如下:
1int **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...