| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 613 人关注过本帖
标题:关于形参与实参的问题,为什么用指针的话,就可以影响实参,求解啊
只看楼主 加入收藏
浩皓好
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2013-4-27
结帖率:100%
收藏
已结贴  问题点数:15 回复次数:9 
关于形参与实参的问题,为什么用指针的话,就可以影响实参,求解啊
#include<stdio.h>
void xingcan(int x,int y)
{
    int H;
    H=x;
    x=y;
    y=H;
}
void xingcanzz(int *x,int *y)
{
    int *s;
    *s=*x;
    *x=*y;
    *y=*s;
}
void main()
{
    int a=5,b=6;
    xingcan(a,b);
    printf("%d,%d\n",a,b);
    xingcanzz(&a,&b);
    printf("%d,%d\n",a,b);
}
搜索更多相关主题的帖子: 影响 
2014-03-03 17:16
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:2 
这个测试案例不用写那么麻烦
程序代码:
void xingcan(int x,int y)
{
   x=100;
   y=999;
}
void xingcanzz(int *x,int *y)
{
   *x=100;
   *y=999;
}
void main()
{
    int a=5,b=76;
    xingcan(a,b);
    printf("%d,%d\n",a,b);
    xingcanzz(&a,&b);
    printf("%d,%d\n",a,b);
}
指针 修改了
函数的栈  返回时 销毁了


DO IT YOURSELF !
2014-03-03 17:31
klapset
Rank: 4
等 级:业余侠客
威 望:2
帖 子:71
专家分:234
注 册:2014-2-27
收藏
得分:10 
实参:就是你填的这个值本身,而形参则是对实参的拷贝。

为啥?

涉及到栈帧的概念了,简单说,就是一份拷贝。也就是函数里面的变量怎么改变,改变的也是拷贝的那一份,更你实参半毛钱关系都没有。
但是换成指针就不一样了,指针变量用的也是拷贝的那份,但是指针指向的内容却没有变化!注意理解这里。

指针A -> 地址X
拷贝 指针B -> 地址X

现在函数中用的是指针B。 对指针B的操作,直接等同于操作X地址。这样也就修改了实参。
2014-03-03 17:34
loveClangage
Rank: 8Rank: 8
来 自:广东云浮
等 级:蝙蝠侠
帖 子:326
专家分:891
注 册:2013-8-23
收藏
得分:0 
指针传递的是地址,不是指针就传递的是副本

编写的程序,不能改变世界,却可以改变自己...
2014-03-03 18:32
fjasd
Rank: 1
等 级:新手上路
帖 子:7
专家分:2
注 册:2014-1-12
收藏
得分:1 
指针传递的是变量的地址,也就是它在内存中所在的位置,它发生改变,变量就改变;一般变量做形参,传递的是变量的值,地址不发生改变,函数在执行过程中调用内存空间,执行完便释放内存空间,所以不改变。
2014-03-03 19:50
造化天运
Rank: 2
等 级:论坛游民
帖 子:28
专家分:31
注 册:2014-2-14
收藏
得分:1 
函数可以通过指针修改主函数中的值
2014-03-03 21:55
向上的小树
Rank: 2
来 自:湖南~岳阳
等 级:论坛游民
帖 子:41
专家分:30
注 册:2013-12-26
收藏
得分:1 
c中函数值的传递方式分三种,值传递,指针传递和引用传递,其中第一种不会改变原值,后两种可以

。。。。。。一定要用代码敲出自己的牛奶和面包,加油。。。。。。。
2014-03-03 22:30
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用向上的小树在2014-3-3 22:30:17的发言:

c中函数值的传递方式分三种,值传递,指针传递和引用传递,其中第一种不会改变原值,后两种可以

C语言有引用么。。
2014-03-04 08:32
浩皓好
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2013-4-27
收藏
得分:0 
回复 3楼 klapset
可是用*A,*B,不是取值得意思嘛,非地址。那交换的应该是值不是地址啊。怎么也能改变呢是我没理解你说什么嘛
2014-03-04 21:36
klapset
Rank: 4
等 级:业余侠客
威 望:2
帖 子:71
专家分:234
注 册:2014-2-27
收藏
得分:0 
回复 9楼 浩皓好
说得再浅显一些吧。

但是先把忘掉你所知的概念。

1,函数传递,不管什么你是什么方式,参数本身就是一个变量 (管你什么方式传递,这里只说C,高级语言会复杂一些) !对不对?

2,然后你要知道这个变量是什么类型。
eg.
int func(int *pTmp);
int func(int Val);

3,其次你要明白的是 函数中的这个参数 不过是一个拷贝 (因为在函数代码入栈的时候,会单独使用寄存器保存参数,而非参数本身,因为栈帧内部的局部变量是不能互相访问的,主要看操作系统是否限制)
eg.

int a = 123;
pTmp = &a; //指针pTmp此刻指向了a变量, 指针pTmp此刻保存了a变量所在的内存地址, pTmp这个变量的内容就是a变量所在的内存地址。

int func(int *pTmp)
{
    *pTmp = 321;   
}

模拟参数传递伪代码:
a变量地址 : 0x1000;
pTmp变量等于 0x1000;
MOV r0, pTmp; //假如r0是寄存器,它现在存放的是0x1000
LD [r0],#321; //这句话意思就是把立即数 321 装载到0x1000地址中。这样 int a是不是已经被修改了?!!!!

我们在来看下下面这个

int a = 123;
int func(int Val)
{
    Val = 321;
}


还是伪代码:
a变量地址 : 0x1000;
MOV r0, #321 //这唯一的一句话,意思就是 把321传给ro。没了。 r0跟0x1000半毛钱没关系啊,所以不会影响原来的变量a。当这个函数释放掉后,r0寄存器会有其他用途,这也是局部变量为什么会被清掉的原因。

事实上上面伪代码基本上跟汇编出来的没太大区别。
2014-03-05 13:57
快速回复:关于形参与实参的问题,为什么用指针的话,就可以影响实参,求解啊
数据加载中...
 
   



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

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