指针变量作为函数参数问题
来源:互联网 发布:化妆品 知乎 编辑:程序博客网 时间:2024/06/03 14:43
今天建哈夫曼树的时候发现指针变量作函数参数的问题,花了两个多小时,深刻反思!
插入元素到从小到大排序的单链表中,并保持链表的有序性,有两种做法:
一种是带头节点的单链表(很简单,不讨论)
另一种是不带头节点的单链表插入:
标准的不带头节点插入方法(用返回值返回第一个节点地址):
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,4swap2(p1,p2);printf("%d,%d\n",*p1,*p2);//4,3int **p3,**p4;p3=&p1;p4=&p2;swap3(p3,p4);printf("%d,%d\n",*p1,*p2);//3,4}
阅读全文
0 0
- 指针变量作为函数参数问题
- 指针变量作为函数参数
- 指针变量作为函数参数
- 指针变量作为函数参数
- 指针变量作为函数参数
- 指针变量作为函数参数
- 指针变量作为函数参数
- 指针变量作为函数参数使用时注意的问题!
- 指针作为函数参数问题
- C语言指针变量作为函数参数
- 结构体变量指针作为函数参数
- C语言指针变量作为函数参数
- C语言指针变量作为函数参数
- 指针变量作为函数参数(1)
- C语言指针变量作为函数参数
- 使用指针变量作为函数参数
- C语言指针变量作为函数参数
- C语言指针变量作为函数参数
- 第三题
- BZOJ 1999 [Noip2007]树网的核(2282 [Sdoi2011]消防)
- g++: command not found的解决 G++没有装或却没有更新 以下方法都可以试试: centos: yum -y update gcc yum -y install gcc+
- 玲珑OJ 1171
- C/C++:从命令行获取参数
- 指针变量作为函数参数问题
- 每日一句
- 远程连接mysql出现10060错误
- JMeter自带的Dashboard Report
- 表单验证之账号密码验证篇,后续追加
- Drawable源码探究
- Mac 下的 Java 版本管理工具 jenv
- 清 · 北 · Ⅱ
- 如何将图片储存在MySQL数据库中