1.指針的定義int *a,a爲指針變量,將int *看作整體(類型)。另外*符號也可看作取值符,即對a指針取其指向地址的值。
eg: int a = 10;
int *b = a; //false
int *b = &a;//true
//將第三句可拆爲 int *b; b = &a; 同上面將int *看作整體結合,即定義了b指針,不能直接將a對象賦給b
2.引用符號& , 與取址符相同,但意義截然不同。
eg: int a =10;
int & b; //false 引用定義需要給出初值
int & b = a;//true
b++;
//最後,得a=b=11;此時 b 爲a對象的引用 ,即相當於a的“別名”,但所指的對象即爲a,對b的更改即對啊也進行。
而同樣的 int *x = &a; 此時 &爲取址符
3.指針與引用在 函數參數傳遞中的實用
(1)值傳遞
void Exchg1(int x , int y){
int temp ;
temp =x ;
x = y ;
y = temp ;
printf ("x=%d,y=%d.\n",x,y); }
main(){
int a =4,b=6;
Exchag1(a,b);
printf("a=%d,b=%d.\n",a,b) }
Output:
x = 6,y = 4 .
a = 4, b = 6 .
原來,在值傳遞中,函數僅將實參a,b的值賦給了形參x,y,所以x,y的改變並不影響實參的值。
(2)地址傳遞
void Exchg2(int *px , int* py){
int temp = *px;
*px = *py;
*py = temp;
printf("*px=%d,*py=%d.\n",*px,*py); }
main(){
int a=4, b =6;
Exchg2(&a,&b);
printf("a=%d,b=%d.\n",a,b); }
Output:
*px = 6,*py = 4 .
a = 6, b = 4 .
函數接口部分 Exchg2(int *px , int *py),其中px,py都是指針,而傳入的實參爲a,b的地址
其實函數進行了隱含的操作 :
px = &a ;
py = &b;
故對*px,*py操作,即對a,b變量進行操作。
(3)引用傳遞
void Exchg3(int &x, int &y){
int temp = x; x = y;
y = temp;
printf ("x=%d,y=%d.\n",x,y); }
main(){
int a =4;
int b =6;
Exchg(a,b);
printf("a=%d,b=%d.\n",a,b); }
Output:
x = 6,y = 4 .
a = 6, b = 4 .
操作引用x,y 即 相當於對 實參 a,b進行操作。
(4)函數參數中*&合用的意義
eg : void InitStack(LNode *&first){
first -> next = null; }
main(){
LNode *p;
InitStack(p);//傳入指針,作爲實參
其中有LNode *&first , 將LNode *看作整體 ,即 &first 表示爲 對實參的引用的定義, 整體即爲LNode型的指針。
故first 爲指針p(實參)的引用 的指針!
對first進行操作,即對p進行操作。能既改變*p指向的內容,又能改變p這個指針
總結四種傳遞方式:
值傳遞,函數調用 function(a),直接傳遞實參a的值,操作並不影響a
引用傳遞,(&p),function(a),使用a的引用p,操作影響a
地址傳遞,(*p),function(&a),傳入a的地址,對*p操作印象a
指針傳遞,(*&p),function(a),此處a爲指針,p爲a指針的別名指針