鱼C论坛

 找回密码
 立即注册
查看: 4557|回复: 25

求大牛帮忙解答

[复制链接]
发表于 2013-4-8 08:44:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
void change(int*p1,int*p2);
void main()
{   
        int*p11,*p22, a,b;
        a=10;
        b=11;
        p11=&a;
        p22=&b;
        if(a<b)
        {
                change(p11,p22);//交换p11和p22(a b的地址),但是这个结果算出来是:10 11
               
        }
        printf("%d %d",*p11,*p22);
}
void change(int*p1,int*p2)      
{
        int*p;
        p=p1;
        p1=p2;
        p2=p;
}
    /*******************************
        int change (int*p1,int*p2)      //交换*p11和*p22(a b的值),但是这个结果算出来是:11 10
               
{
         int p;                                 
         p=*p1;
         *p1=*p2;
         *p2=p;
}
*********************************/

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-4-8 08:44:49 | 显示全部楼层
我想问一下,问什么结果不一样呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-8 08:56:48 | 显示全部楼层
楼主这里是要改变指针p11和p22的值,那就要传p11和p22的地址进去。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-4-8 09:08:12 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-8 09:21:07 | 显示全部楼层
  1. #include<stdio.h>
  2. void change(int **p1,int **p2);
  3. void main()
  4. {   
  5.         int*p11,*p22, a,b;
  6.         a=10;
  7.         b=11;
  8.         p11=&a;
  9.         p22=&b;
  10.         if(a<b)
  11.         {
  12.                 change(&p11,&p22);//交换p11和p22(a b的地址),但是这个结果算出来是:10 11
  13.                
  14.         }
  15.         printf("%d %d",*p11,*p22);
  16. }
  17. void change(int **p1,int **p2)      
  18. {
  19.         int*p;
  20.         p=*p1;
  21.         *p1=*p2;
  22.         *p2=p;
  23. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-8 09:23:55 | 显示全部楼层
你不理解指针噢亲,第一个change根本没有做任何有意义的操作。函数传递进来的指针是复制过来的,与main里面的p11,p22不是一个,只是数值相等而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-4-8 09:25:54 | 显示全部楼层

#include<stdio.h>
void change(int **p1,int **p2);
void main()
{   
        int*p11,*p22, a,b;
        a=10;
        b=11;
        p11=&a;
        p22=&b;
        if(a<b)
        {
                change(&p11,&p22);//交换p11和p22(a b的地址),但是这个结果算出来是:10 11
               
        }
        printf("%d %d",*p11,*p22);
}
void change(int **p1,int **p2)      
{
        int*p;
        p=*p1;
        *p1=*p2;
        *p2=p;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-4-8 09:29:34 | 显示全部楼层
俯首の低姿态 发表于 2013-4-8 09:25
#include
void change(int **p1,int **p2);
void main()

我试过了,结果还是10 11.另外,p11,p22 不就是&a,&b吗,所以chang(p11,p22)就是传进去的a,b的地址啊。按你的说法,传p11,p22的地址,只会改变,&p11,&p22,但是不会改变指针指向的地址啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-4-8 09:35:40 | 显示全部楼层
七月之变 发表于 2013-4-8 09:23
你不理解指针噢亲,第一个change根本没有做任何有意义的操作。函数传递进来的指针是复制过来的,与main里面 ...

你能给我详细说一下吗,我没看很懂。为什么第二个就可以呢,第一个函数和第二个函数区别在哪里啊?如果你能修改一下第一个函数,我会不胜感激的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-8 09:57:16 | 显示全部楼层
我试过了,结果还是10 11.另外,p11,p22 不就是&a,&b吗,所以chang(p11,p22)就是传进去的a,b的地址啊。按你的说法,传p11,p22的地址,只会改变,&p11,&p22,但是不会改变指针指向的地址啊

你用的是什么编译器哟,我写的代码应该可以调换吧。我是运行后确定正确的才弄上来的呀。其实函数传值只要知道这样一个道理,你要改变当前变量的值,就传它的地址过去,像你上面的程序,明显是在改变p11和p22的值,那就要传它们的地址进去。不管它是地址还是不是地址。就这么简单
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-4-8 11:03:07 | 显示全部楼层
小亮1201 发表于 2013-4-8 09:57
你用的是什么编译器哟,我写的代码应该可以调换吧。我是运行后确定正确的才弄上来的呀。其实函数传值只要 ...

嗯,我又试了下,你的程序正确。,不过我想问一下 #include<stdio.h>
void main()
{
        int *p1,*p2,*p,a=10,b=11;
        p1=&a;
        p2=&b;
    if(a<b)
        {
       p=p1;
           p1=p2;
           p2=p;
        }
        printf("%d %d\n%d %d\n",a,b,*p1,*p2);
}
这个程序没有问题,为什么我一引用函数就不对了呢?难道我对函数理解错了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-8 11:12:47 | 显示全部楼层
嘿嘿!你对函数的参数传递理解错了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-4-8 12:03:22 | 显示全部楼层
小亮1201 发表于 2013-4-8 11:12
嘿嘿!你对函数的参数传递理解错了。

好吧,我再重新学一下函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-8 12:11:48 | 显示全部楼层
好吧,我再重新学一下函数
多看看函数传参的代码,或者是单步调试看看函数传参编译器到底怎么传的。加油!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-4-8 12:15:37 | 显示全部楼层
小亮1201 发表于 2013-4-8 12:11
多看看函数传参的代码,或者是单步调试看看函数传参编译器到底怎么传的。加油!

嗯,谢谢支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-8 17:34:23 | 显示全部楼层

RE: 求大牛帮忙解答

俯首の低姿态 发表于 2013-4-8 09:35
你能给我详细说一下吗,我没看很懂。为什么第二个就可以呢,第一个函数和第二个函数区别在哪里啊?如果你 ...

小亮的就是正解,用**,简单地说你要在一个函数中修改其他函数中变量的值,基本都会有*变量名
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-4-8 23:16:22 | 显示全部楼层
七月之变 发表于 2013-4-8 17:34
小亮的就是正解,用**,简单地说你要在一个函数中修改其他函数中变量的值,基本都会有*变量名

是不是只支持值传递而不支持址传递
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-9 08:02:24 | 显示全部楼层

RE: 求大牛帮忙解答

俯首の低姿态 发表于 2013-4-8 23:16
是不是只支持值传递而不支持址传递

目前可以这么理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-4-9 09:23:54 | 显示全部楼层
七月之变 发表于 2013-4-9 08:02
目前可以这么理解

嗯,谢啦 真是难得给力的鱼油啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-9 15:33:53 | 显示全部楼层
课本里有详细解释楼主没看书吧??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-26 23:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表