您的位置:首页 > 编程语言 > C语言/C++

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

2017-10-30 00:01 369 查看
今天建哈夫曼树的时候发现指针变量作函数参数的问题,花了两个多小时,深刻反思!

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

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

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

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

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
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息