标题:有关指针变量作为函数参数的问题求解
只看楼主
kaneliuwei
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-7-19
 问题点数:0 回复次数:11 
有关指针变量作为函数参数的问题求解
有两个程序,同样是以指针变量作参数,为什么结果会不一样?

第一个程序
#include <stdio.h>
void main()
{
 void change(int *p1,int *p2);
 int a,b;
 int *point_a,*point_b;
 scanf("%d,%d",&a,&b);
 printf("%d,%d\n",a,b);
 point_a=&a;
 point_b=&b;
 change(point_a,point_b);
 printf("%d,%d\n",*point_a,*point_b);
 getch();
 }
 void change(int *p1,int *p2)
 {
  int *temp;
  temp=NULL;
  temp=p1;
  p1=p2;
  p2=temp;
 }
输入:4,5
输出:4,5
      4,5

第二个程序
#include <stdio.h>
void main()
{
 void change(int *p1,int *p2);
 int a,b;
 int *point_a,*point_b;
 scanf("%d,%d",&a,&b);
 printf("%d,%d\n",a,b);
 point_a=&a;
 point_b=&b;
 change(point_a,point_b);
 printf("%d,%d\n",*point_a,*point_b);
 getch();
 }
 void change(int *p1,int *p2)
 {
  int temp;
  temp=*p1;
  *p1=*p2;
  *p2=temp;
 }
输入:4,5
输出:4,5
      5,4
搜索更多相关主题的帖子: include void change 
2012-09-05 11:33
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
第一个程序只不过把两个指针变量在函数里面交换了一下 对于指针变量指向的值未做处理 因此无效
2012-09-05 11:36
kaneliuwei
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-7-19
得分:0 
找到答案了……
2012-09-05 11:36
kaneliuwei
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-7-19
得分:0 
回复 2楼 zklhp
指针指向的值在主函数不是已经定义了吗?我不明白的地方是,为什么同样是传递指针变量到函数change中,但要通过改变指针变量的值改变主函数的值必须用第二种方法
2012-09-05 11:41
kaneliuwei
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-7-19
得分:0 
书上给的答案是:因为单向的“值传递”原因,不可能通过调用函数来改变实参指针变量的值,但可以改变实参指针变量所指变量的值,但我不能理解的是,改变实参指针变量所指的值到底是怎么实现的。
2012-09-05 11:45
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
以下是引用kaneliuwei在2012-9-5 11:41:12的发言:

指针指向的值在主函数不是已经定义了吗?我不明白的地方是,为什么同样是传递指针变量到函数change中,但要通过改变指针变量的值改变主函数的值必须用第二种方法

为啥呢 因为第二种是正确的。。

为啥第二种是正确的呢 因为C语言都是传值的 因为指针是用来寻址的

用指针来交换变量 因为如果不用指针 直接对变量进行操作 无法违背上面的那条【C语言都是传值的】 用指针同样不能违背这个 但指针可以用于寻址 所以 我可以用指针在函数里间接操作其他函数里的变量 注意是【间接操作变量】 而非指针变量本身 所以 第一个里面你对指针变量做什么样的操作也没法对主函数里面的值造成影响
2012-09-05 11:46
kaneliuwei
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-7-19
得分:0 
回复 6楼 zklhp
谢谢你,不过我可能还要再消化一下
其实就是不理解为什么用变量的形式进行值传递,在函数结束的时候内存会被释放,但用形参指针改变实参指针指向的值,却能在函数结束的时候保留下来,这个问题是不是要学习了汇编语言或计算机组成原理之后才能更好地理解?
2012-09-05 11:55
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
但用形参指针改变实参指针指向的值,却能在函数结束的时候保留下来

保留下来的是指针指向的变量 指针变量也留不住

看能不能保留 关键是看这个东西在哪

……
int a = 0;
int *pa = &a;
func(pa);
……

在这里面 我是用pa操作了a 这个a不是func里面的 所以func不会销毁这个量 而传递给func的指针及func内部的东西则在函数返回的时候销毁了 只能留下返回值
2012-09-05 11:59
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
以下是引用kaneliuwei在2012-9-5 11:55:16的发言:

谢谢你,不过我可能还要再消化一下
其实就是不理解为什么用变量的形式进行值传递,在函数结束的时候内存会被释放,但用形参指针改变实参指针指向的值,却能在函数结束的时候保留下来,这个问题是不是要学习了汇编语言或计算机组成原理之后才能更好地理解?

学汇编一类的东西能帮你理解 这是肯定的 但学那些也要花时间 值得不值得看你理解了 不学的话如果多思考多练习也能理解的深刻 不是所有人都会汇编 自然也不是所有人都需要学汇编
2012-09-05 12:01
kaneliuwei
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-7-19
得分:0 
回复 8楼 zklhp
谢谢你,结合你的话我再好好看看书
2012-09-05 12:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-380737-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013876 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved