关于函数的参数是是使用指针,还是指针的引用(指针的指针,二级指针)

  1. 当只修改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语言没得引用就用了二级指针)
dBQiad.png

#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++的测试,使用了引用
dB3uqO.png

#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;
}