标题:关于指针在被传到被调用函数的问题(求助)
只看楼主
zpcg
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-8-21
结帖率:100%
已结贴  问题点数:10 回复次数:5 
关于指针在被传到被调用函数的问题(求助)
指针的这个问题我被困扰了很久,希望真正悟透的兄弟给上精确的答复,不要搜索或人去亦云的东西.为了能得到精确的答案,我干脆直接用下面这种方式提问:
书上说C语言是以传值的方式将参数值传递给被调用函数,被调用函数不能直接修改主调函数中变量的值.
下列程序中是主函数先调用第一个函数,然后在第一个函数里面又调用第二个函数.
问题1:在运行 exchange(p1, p2);后,被传到第一个函数的是指针变量p1,p2的(    )
A、指针指向的地址     B、所对应的变量a,b       C、值5和6.
问题2:在第一个函数中又调用了第二个函数这时,这时被传到第二个函数中的是指针变量p1,p2的(    )
A、指针指向的地址       B、所对应的变量a,b。    C、值5和6。
程序代码:
[color=#008000]/*交换a, b 两个数*/

#include <stdio.h>
void main()
{
    void exchange(int *q1, int *q2);
    int a , b;                     
    int *p1, *p2;
    a = 5;
    b = 6;
    p1 = &a;
    p2 = &b;
   
    exchange(p1, p2);
   
    printf("\n%d %d\n", a, b);   
    printf("\n%d %d\n", *p1, *p2);      
}

void exchange(int *q1, int *q2)   //第一个函数
{
    void swap(int *qt1, int *qt2);
    if(*q1 < *q2) 
        swap(q1, q2);
}

void swap(int *qt1, int *qt2)    //第二个函数
{
    int t;
    t = *qt1;
    *qt1 = *qt2;
    *qt2 = t;
}

[/color]
搜索更多相关主题的帖子: 兄弟 exchange 搜索 C语言 
2011-08-28 20:19
Luminal
Rank: 6Rank: 6
等 级:侠之大者
帖 子:140
专家分:470
注 册:2011-8-24
得分:3 
楼主的提问方式估计大家很难接受哦!哈哈
不论是第一个函数还是第二个函数,本程序中传递的都是同一个内容,就是变量a和b所指的地址,这两个地址分别存储着变量
a和b的值,即5和6,其实你的函数中处理的就是变量a和b,
a-->xxxx1        b-->xxxx2
    5                6
上面这个示意图xxxx表示的是内存地址
xxxx1 中存着变量a的值 -- 5
xxxx2 中存着变量b的值 -- 6
而传指针参数,就相当于把xxxx1和xxxx2 传进函数,所以当函数中对xxxx1和xxxx2进行赋值操作(写内存)时,
改变了xxxx1和xxxx2的内容,所以变量a和b的值也就被改动了,
呵呵,没有按照你的回答方式回答,请见谅!如果要是那样回答,我想你可能还是不明白是怎么回事的!
初学乍练,难免有错!
2011-08-28 20:53
Hujc71
Rank: 2
等 级:论坛游民
帖 子:49
专家分:65
注 册:2010-3-31
得分:0 
你的答案都不标准,问题一答案传到第一个函数的是指针变量p1,p2的值,但它是a,b对应的地址!并不是5和6,也就是一个指针量;第二个答案也是一样的;两题你都应该加个选项D、所对应的变量a,b的存储地址!希望你能明白~
2011-08-28 21:59
A13433758072
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广东潮州
等 级:小飞侠
威 望:1
帖 子:1182
专家分:2784
注 册:2010-7-22
得分:4 
回复 楼主 zpcg
两个都选a

一步一个脚印...............................默默地前进.....
诚邀乐于解答c菜鸟问题,的热心网友加入,  QQ群38490319
2011-08-28 22:00
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
得分:3 
楼主,类似的问题貌似问过的。“被调用函数不能直接修改主调函数中变量的值”,那就意味着可以间接修改,通过指针去修改。另外,楼主为了验证在被调函数中改变主调函数普通变量和指针变量的值,写了这两个测试函数,感觉有点绕。我另外写了swap_value和swap_pt,可以参考下。不对的地方可以讨论。
    在调用函数里面改变主函数的数值,需要指向该变量的指针,因此,你要交换a,b的数值,需要传递&a,&b。因此你的 swap函数成功调换了a,b的数值;但是你要改变指针的值,那么同样需要指向指针的指针,因此需要有二级指针来完成。你用了1级指针当然达不到目 的了。
#include <stdio.h>
void main()
{
    void swap_pt(int **q1, int **q2);
    void swap_value(int *qt1, int *qt2);
    int a , b;
    int *p1, *p2;
    scanf("%d%d", &a, &b);
    p1 = &a; p2 = &b;
    printf("原来:\n");
    printf("p1=%p    p2=%p\n", p1, p2);
    printf("&a=%p    &b%p\n", &a, &b);
    printf("a=%d    b=%d\n", a, b);
 
    swap_pt(&p1, &p2);
    printf("\n\n交换指针后:\n");
    printf("p1=%p    p2=%p\n", p1, p2);
    printf("&a=%p    &b%p\n", &a, &b);   
    printf("a=%d    b=%d\n", a, b);
    swap_value(&a, &b);
    printf("\n\n交换数值后:\n");
    printf("p1=%p    p2=%p\n", p1, p2);
    printf("&a=%p    &b%p\n", &a, &b);   
    printf("a=%d    b=%d\n", a, b);
}
void swap_pt(int **q1, int **q2)
{
int *tmp;
tmp=*q1;
*q1=*q2;
*q2=tmp;
}
void swap_value(int *qt1, int *qt2)
{
    int t;
    t = *qt1;
    *qt1 = *qt2;
    *qt2 = t;
}
gcc编译后输出:
12 45
原来:
p1=0xbfb5fe1c    p2=0xbfb5fe18
&a=0xbfb5fe1c    &b0xbfb5fe18
a=12    b=45
交换指针后:
p1=0xbfb5fe18    p2=0xbfb5fe1c
&a=0xbfb5fe1c    &b0xbfb5fe18
a=12    b=45
交换数值后:
p1=0xbfb5fe18    p2=0xbfb5fe1c
&a=0xbfb5fe1c    &b0xbfb5fe18
a=45    b=12


[ 本帖最后由 pauljames 于 2011-8-29 06:43 编辑 ]

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2011-08-29 06:32
C高手
Rank: 2
等 级:论坛游民
帖 子:18
专家分:12
注 册:2011-7-18
得分:0 
都选A
2011-08-29 08:22



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




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

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