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指针的别名指针