C语言函数传参:如何实现指针参数引用传递

仔细想了一下这个问题,应该是这样的一个逻辑:简单来说,指针传参,指针变量(临时)存储的是某变量的地址,但是只能改变所指向的数据本身,而不能改变其地址(指针)。
如果要改变地址(即指针所指向的那个数据的地址),如代码中的 *pre = *p,自然就需要通过指针的指针作为参数。

下面是以中序遍历线索二叉树构造算法为例,来帮助理解指针传参

typedef struct TreadNode{
    ElemType data;
    struct TreadNode *lchild,*rchild;
    int ltag,rtag;  /*左右线索标志域*/
}ThreadNode,*ThreadTree;

void InTread(ThreadTree *p,ThreadTree *pre){
    /* p,pre存储指针的地址 
     *p:指向当前访问的结点,*pre:指向上一个访问过的结点,用于构建前驱和后继*/
    if(*p!=NULL){
    InTread(&(*p)->lchild,pre);
    if((*p)->lchild==NULL){ /*判断是否存在空指针*/
        (*p)->lchild = *pre;
        (*p)->ltag = 1;
    }
    else if(*pre!=NULL&&(*pre)->rchild==NULL){
        (*pre)->rchild = *p;    /*p所指结点为上一个访问结点的后继*/
        (*pre)->rtag = 1;
    }
    *pre = *p;
    InTread((*p)->rchild,pre);  
    }
}

void CreateInThread(ThreadTree T){
    ThreadTree pre = NULL;
    InTread(&T,&pre);
    pre->rchild = NULL; /*pre存储的是中序遍历序列中最后一个结点的地址*/ 
    pre->rtag = 1;
} 

从CreateInThread函数中的 pre->rchild = NULL 可以看出,pre指针已经被修改,它所保存的地址发生了变化,指向了中序遍历序列最后一个结点,因为该结点没有后继,所有后继为NULL。
指针与指针变量的地址是有区别的,前者一般是某个变量在内存中的地址,后者是系统给指针变量分配的地址,其实就是指针的指针。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值