指针变量作为函数参数问题

今天建哈夫曼树的时候发现指针变量作函数参数的问题,花了两个多小时,深刻反思!


插入元素到从小到大排序的单链表中,并保持链表的有序性,有两种做法:

一种是带头节点的单链表(很简单,不讨论)

另一种是不带头节点的单链表插入:


标准的不带头节点插入方法用返回值返回第一个节点地址):

Link *insert(LNode *node,Link *head){
	LNode *pre,*p;
	pre=p=head;
	while(p!=NULL && p->num<node->num){//确定插入位置
		pre=p;
		p=p->next;
	}
	if(p==head){//插入到第一个节点前
		node->next=head;
		head=node;		
	}else{
		node->next=pre->next;
		pre->next=node;
	}	
	return head;
}


我的错误的不带头节点插入方法没有返回值,妄图通过调用函数来改变实参指针变量的值:第一个节点的地址

void insert(LNode *node,Link *head){
	LNode *pre,*p;
	pre=p=head;
	while(p!=NULL && p->num<node->num){//确定插入位置
		pre=p;
		p=p->next;
	}
	if(p==head){//插入到第一个节点前
		node->next=head;
		head=node;	//***********想通过改变形参指针变量的值来达到实参指针变量的改变是不可能的!!!*************
	}else{
		node->next=pre->next;
		pre->next=node;
	}	
	return head;
}

void main(){
	int a[5]={3,1,2,5,4};
	Link *head=create();//创建单链表
	for(int i=0;i<5;i++){
		LNode *node=createNode();
		insert(node,head);//当node插入到head前的时候,函数结束后的head地址并不是node的地址,还是之前的head的地址!
	}
}


C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。指针变量做函数参数也要遵循这一规则。不可能通过调用函数来改变实参指针变量的值,但可以改变实参指针变量所指变量的值!

用下面的简单例子说明:

//以下函数都是实现值的交换:
void swap1(int *p1,int *p2){//通过交换地址值来实现,不过改变形参的指针变量是没有用的!正确的做法见swap3();
	int *p;
	p=p1;
	p1=p2;
	p2=p;
}

void swap2(int *p1,int *p2){
	int temp;
	temp=*p1;
	*p1=*p2;//改变形参指针变量所指变量的值,正确的做法!!!
	*p2=temp;
}

//如果就是想通过交换地址值来实现怎么办呢?
//使用指向指针的指针来实现
void swap3(int **p1,int **p2){
	int *p;
	p=*p1;
	*p1=*p2;//改变形参指针变量所指变量的值,这里的指针变量所指的值实际就是存放数字的地址值,也是正确的做法!!!
	*p2=p;
}
int main(){
	int a=3;
	int b=4;
	int *p1,*p2;
	p1=&a;
	p2=&b;
	swap1(p1,p2);
	printf("%d,%d\n",*p1,*p2);//3,4
	
	swap2(p1,p2);
	printf("%d,%d\n",*p1,*p2);//4,3
	
	int **p3,**p4;
	p3=&p1;
	p4=&p2;
	swap3(p3,p4);
	printf("%d,%d\n",*p1,*p2);//3,4
}


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值