復合型別:指基於其他型別定義的型別。c++有幾種復合型別,其中最為熟悉的兩種就是:引用和指標
引用:為物件起了另外乙個名字:int a=10, int &b=a; b=15;相當於a=15.
這時b完全代表a,引用並不是物件,只是為乙個已經存在的物件起的另外乙個名字。
引用的定義:int &b=a;
int &b=a,&c=a;
指標:與引用不同在於:1.指標本身就是個物件,允許對指標賦值和拷貝,而且可以先後指向幾個不同的物件。
2. 指標無需在定義時賦初值。
int *p1, *p2; //p1和p2都是指向int型物件的指標
指標存放某個物件的位址,要想獲得該位址,需要使用取位址符&
int a=42;
int *p=&a; //p存放a的位址,或者說p是指向變數a的指標
利用指標訪問物件:
如果指標指向了乙個物件,可利用解引用符*來訪問該物件
int a=42;
int *p=&a;
cout<<*p;//由符號*得到指標p所指的物件,輸出42
指標值:
1.指向乙個物件
2.指向緊鄰物件所佔空間的下乙個位置
3.空指標,不指向任何物件
4.無效指標
指標的賦值就是令其存放乙個新的位址,從而指向乙個新的物件
int i =42;
int *p1=0;
int *p2=&i;
int *p3;
p3=p2; //p3和p2指向同乙個物件i
p2=0; //現在p2不指向任何物件了
void* 指標
是一種特殊的指標型別,可用於存放任何物件的位址。
double a=3.14;
void *p=&a;
利用void*指標能做的事比較有限:
1.作為函式的輸入或輸出
2.與其它指標比較
3.賦給另乙個void*指標
注意點:
定義多個指標變數時:
正確做法:int *a, *b;
錯誤做法: int* a, b;
造成錯誤的原因是會誤以為int* 作用於a和b兩個變數。其實恰恰相反。基本資料型別依然是int而非int*,*僅僅修飾了a而已,對其他變數b不起作用。
但是要注意int* a也是合法的,只是容易產生誤導。
指向指標的指標(雙重指標)
一般來說,宣告符中修飾符的個數並沒有限制(比如*),當多個修飾符連寫在一起,按照其邏輯關係解釋即可。比如指標,指標是記憶體中的物件,當然也是有位址的,因此執行將指標的位址再存放到另乙個指標。
int a=10;
int *p1=&a;
int **p2=&p1; //p2指向乙個int的指標
解引指向指標的指標會得到乙個指標,此時為了訪問最原始的物件,需要對指標的指標做兩次解引用:
cout<<**p2
指標引用和引用指標的區別
c 在傳參的過程中,指標 和指標引用 是有區別的。雖然,我們往往可以通過傳指標然後通過間址訪問來修改指標所指向物件的值,同樣,通過引用也可以直接修改物件的值。但是,當傳指標的時候有乙個問題,就是,我們雖然可以通過指標來修改指標所指向物件的值,但是我們沒有不能直接修改指標的內容 也就是指標變數存放的位...
傳指標和傳指標引用的區別 指標和引用的區別(本質)
指標傳遞引數本質上是值傳遞的方式,它所傳遞的是乙個位址值。值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值...
傳指標和傳指標引用的區別 指標和引用的區別(本質)
指標傳遞引數本質上是值傳遞的方式,它所傳遞的是乙個位址值。值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值...