- 当只修改p指向的对象(对象的内容啥的)
例如:
typedef struct node{
int data;
struct node next;
}Node,List*;//再用List p就相当于Node *p;
List p=(Node*)malloc(sizeof(Node));
List q=(Node*)malloc(sizeof(Node));
指针p和q分别指向了两个不同的Node对象
如果一个函数fun()要改变p的data或next指向的对象,直接传递p即可
void fun(List p)
{
p->data=xx;
p->next=p;//或者NULL,啥别的都行
}
但是要修改p指向q的对象,就得引用了,因为只是指针的话,参数的传递实际上传的是指针变量里那个地址(对象的地址),而如果要改变指向(就是改变指针变量的值),必须是引用指针,就好比传一个int类型,你是没法改变传值进去的那个变量的值的,指针变量也是一个道理,改变不了那个地址,因此要用引用
void fun2(List &p,List q)
{
p=q;
}
下面是C语言的测试(C语言没得引用就用了二级指针)
#include <stdio.h>
#include <stdlib.h>
void fun(int *p)
{
*p=100;
}
void fun2(int **p,int *q)
{
printf("infun2 %p\n",q);
*p=q;
printf("in fun2 *p %p\n",*p);
}
int main()
{
int a=1;
int b=2;
int *p=&a;
int *q=&b;
printf("p: %p\n",p);
printf("&a: %p\n",&a);
printf("&p: %p\n",&p);
printf("q: %p\n",q);
printf("&b: %p\n",&b);
printf("&q: %p\n",&q);
fun(p);
printf("%d\n",*p);
printf("%p\n",p);
fun2(&p,q);
printf("%d\n",*p);
printf("%p\n",p);
printf("Hello world!\n");
return 0;
}
下面是c++的测试,使用了引用
#include <iostream>
using namespace std;
typedef struct node{
int data;
struct node *next;
}Node,*List;
void ChangeData(List l)
{
l->data=100;
}
void NotYingyong(List l,List j)
{
cout<<"In NOtYingyong:"<<endl;
cout<<"l->data=: "<<l->data<<endl;
l=j;
cout<<"After change: "<<l->data<<endl;
cout<<"Finish NotYingyong"<<endl;
}
void Yingyong(List &l,List j)
{
l=j;
}
int main()
{
Node n1,n2,n3;
n1.data=1;
n1.next=&n3;
n2.data=2;
n2.next=&n3;
n3.data=3;
n3.next=NULL;
List l1=&n1;
List l2=&n2;
List l3=&n3;
cout<<"l1: "<<l1<<endl<<"l2: "<<l2<<endl<<"l3: "<<l3<<endl;
ChangeData(l3);
cout<<"l3 change: "<<l3->data<<endl;
NotYingyong(l1,l3);
cout<<"after NotYingyong l1: "<<l1->data<<endl;
Yingyong(l2,l3);
cout<<"after Yingyong l2: "<<l2->data<<endl;
cout<<"after change"<<"l1: "<<l1<<endl<<"l2: "<<l2<<endl<<"l3: "<<l3<<endl;
cout << "Hello world!" << endl;
return 0;
}