指針一直是一個很困惑人的東西,對於指針其本身有一個地址是它本質的地址,而它的值是保存的它所指向變量的地址。通過修改指針就能到達修改變量的值。
例如intm=4;int*p;p=&m;指針P的地址裡保存的值就是m的地址。
對於一級指針intm=4;intn=5int*p;p=&m;int*q;q=p;q與p一樣都指向了變量m,修改P和q的值都可以修改變量m的值,但是q無法改變P的指向,使其指向變量n,要達到這個目的必須使用二級指針。
對於二級指針intm=4;intn=5int*p;p=&m;int**q;q=&p;二級指針不僅可以改變所指向變量的值,還可以改變一級指針的指向。二級指針**q*q保存的是指針p的地址,**q保存的是*p的值既是變量m的地址,這樣通過**q可以改變指針*p所指向變量的m的值。例如int*z;z=&n;通過修改*q=z;來改變指針p的指向,使其不再指向m,而是指向n.就是說二級指針與一級指針相比不僅可以改變所指向變量的值,還可以改變一級指針的指向,使其指向其他變量。
例子如下:
例子1:入參為指向指針的指針
#include<iostream>
usingnamespacestd;
intnum=8;
voidChangePoint(int**p2)//入參類型為指向指針的指針。
{
*p2=#//*p2是p1的地址,則p1指向了num。
}
intmain()
{
inta=5;
int*p1=&a;
ChangePoint(&p1);//通過函數p1指向了num,而a的值仍為5。
cout<<*p1<<''<<a;
}
輸出:
85
例子2:入參為指針
#include<iostream>
usingnamespacestd;
intnum=8;
voidChangePoint(int*p2)//入參類型為指針,則p2和p1是兩個指針,兩個指針指向的地址相同。
{
inti=0;
int*p3=&i;
*p2=num;//改變指針p2指向內容的值即改變了p1指向內容的值,及a的值也變為8。
p2=p3;//指針變量p2的改變,但不會影響到p1的指向。
}
intmain()
{
inta=5;
int*p1=&a;
ChangePoint(p1);//p1仍指向a,但a的值已經變為8。
cout<<*p1<<''<<a;
}
輸出:
88
#include<iostream> using namespace std; #pragma argsused void ModifyPointValue(int *p,int **q,int *z) { int a = 10; //只是改變了Z的指向,不改變K的值 z= &a; //改變p的指向的變量i的值 *p = 10; //二級指針*q為指針q的地址,**q就指向變量j,即可改變所指向的j的值, //也可以改變q的指向使它不在指向變量j **q = a; cout<<"In function value is "<<"P Value is "<<*p<<" q value is"<<**q<<endl; } int main(int argc, char* argv[]) { int i = 4; int j = 5; int k = 6; int *p = NULL; int *q = NULL; int *z; p = &i; q = &j; //z指向q與q一起指向了變量j z = q; cout<<"z is"<<*z<<"q is"<<*q<<endl; cout<<"i is "<<i<<" j is"<<j<<" k is"<<k<<endl; //修改了變量j的值 *z = 8; //Z改變指向,不在指向j,而是指向k z = &k; cout<<"i is "<<i<<" j is"<<j<<" k is"<<k<<endl; cout<<"z is"<<*z<<"q is"<<*q<<endl; cout<<"Befor Function P Value is "<<*p<<" q value is"<<*q<<endl; cout<<"i is "<<i<<" j is"<<j<<" k is"<<k<<endl; ModifyPointValue(p,&q,z); cout<<"After Function P Value is "<<*p<<" q value is"<<*q<<endl; cout<<"i is "<<i<<" j is"<<j<<" k is"<<k<<endl; char c = getchar(); cout<<"Pree any key exit....."<<endl; return 0; } //---------------------------------------------------------------------------