指针变量作为函数参数问题
2017-10-30 00:01
369 查看
今天建哈夫曼树的时候发现指针变量作函数参数的问题,花了两个多小时,深刻反思!
插入元素到从小到大排序的单链表中,并保持链表的有序性,有两种做法:
一种是带头节点的单链表(很简单,不讨论)
另一种是不带头节点的单链表插入:
标准的不带头节点插入方法(用返回值返回第一个节点地址):
我的错误的不带头节点插入方法(没有返回值,妄图通过调用函数来改变实参指针变量的值:第一个节点的地址)
C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。指针变量做函数参数也要遵循这一规则。不可能通过调用函数来改变实参指针变量的值,但可以改变实参指针变量所指变量的值!
用下面的简单例子说明:
插入元素到从小到大排序的单链表中,并保持链表的有序性,有两种做法:
一种是带头节点的单链表(很简单,不讨论)
另一种是不带头节点的单链表插入:
标准的不带头节点插入方法(用返回值返回第一个节点地址):
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 }
相关文章推荐
- C++用指针变量作为函数的参数接受数组的值的问题的总结
- 指针变量作为函数参数使用时注意的问题!
- C++用指针变量作为函数的参数接受数组的值的问题详细总结
- C++用指针变量作为函数的参数接受数组的值的问题的总结
- 指针变量作为函数参数实现对输入的两个整数按大小顺序输出
- JavaScript中函数作为参数进行传递时的括号问题
- c++之指针作为函数参数传递的问题
- 11.19C语言----指针变量作为函数参数
- c++之指针作为函数参数传递的问题
- 指针作为函数参数的问题
- 二维矩阵的旋转问题(二维数组作为函数参数)
- QT 信号槽connect中解决自定义数据类型或数组作为函数参数的问题——QT qRegisterMetaType 注册MetaType——关键:注册自定义数据类型或QMap等容器类
- Django model作为函数参数的问题
- 指针变量作为函数参数
- C/C++面试题--数组作为函数参数的几个问题
- 指针作为函数参数传递时需要注意的问题
- 使用指针作为函数返回值和参数的问题总结
- 函数的指针参数传递问题--理解指针变量
- python中的含有 *args 和**kwargs的用法 作为参数的函数,参数输入问题
- 数组作为函数参数时的传递问题