whyyouhitme_
whyyouhitme_
2018-03-23 13:52
采纳率: 65.7%
浏览 1.9k

形参和实参的关系。我理解的不对吗

void decmopse(double x,long int_part,double frac_part)
{
int_part=(long)x;
frac_part=x-int_part;
}
假设调用这个函数:
decmopse(3.14159,i,d);

接下来发生的事,不应该是3被赋值给了i,0.14159被赋值给了d吗。

为什么书上说:
在调用开始程序把3.14159赋值给了x,i赋值给int_part,d赋值给frac_part。
然后decompose函数内的语句把3赋值给了int_part而把0.14159赋值给frac_part.i和d的值不会改变。。。。想问如果是这样的话,我设值这两个实参做什么呢?实参不就是和形参对应的吗?函数对形参做了什么,调用的时候就对实参做什么。不是这么理解吗?

依照书上的解释,i和d在这里等于是没用。如果i和d在这里没用的话,之前那么多题,调用函数时使用的实参是怎么回事?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

10条回答 默认 最新

  • qq_35679818
    忽见一刘 2018-03-23 13:55

    便于你动态改变参数

    点赞 评论
  • xinchen1102
    xinchen1102 2018-03-23 14:06

    形参是指函数声明中指明需要传的参数,实参是你实际调用函数的时候传到函数中的值。形参和实参的位置是一一对应的。你的这个例子中就是 x, int_part, frac_part 是形参,3.14159、i、d 就是实参,而且是一一对应的。当你调用函数传入实参的时候,对于 int,double 这些基础数据类型的数据,编译器会拷贝一份实参的值,然后把拷贝的值赋值给形参,所以在函数中改变了某个形参的值,实参是不会受影响的。但是对于数组之类的数据类型就要注意了,实参给形参复制的时候不是拷贝一份,而是直接把实参的地址(指针)拷贝给了形参,所以如果在函数里面改变了形参也会改变实参(数据就一份,参指向的是同一份数据)

    点赞 评论
  • sinat_40721384
    -iostream- 2018-03-23 14:26

    兄弟,我已经回答你的两个问题了,这个问题我已经实在是不想在从头给你讲c语音了,我劝你先买本《C++ primer》之类的书回来好好看看,看你的状态连门都没入啊,真的。
    在实战之前先把规则搞清楚好吧

    点赞 评论
  • sinat_40721384
    -iostream- 2018-03-23 14:37

    先给你段代码:
    int sum(int param1,int param2);
    int main()
    {
    int a,b;
    ...
    int c=sum(a,b);
    ...
    return 0;
    }
    int sum(int param1,int param2)
    {
    return param1+param2;
    }
    这个简单的程序的功能是求a,b的和并把结果赋给c。调用sum()函数时,程序对应地把a赋给param1,把b赋给param2,并返回它们的和。
    param1和param2就是形式参数,它们在函数sum()被调用时生成并分配内存空间,在sum()结束时被释放。
    另外你那个函数的功能是错误的,由于参数是按值传递的,所以实参的值是不会被函数修改的。如果要修改实参的值,则必须传指针或是传引用。这部分你还是自己去看书吧,我给你讲完我都能写书了。

    点赞 评论
  • x12345xsakura
    辛潇 2018-03-23 14:44

    去看一下指针和引用吧,看了就知道怎么改变了

    点赞 评论
  • qq_38646470
    龙跃十二 2018-03-23 14:59

    你这是在基础问题上异或,你还没搞清楚实参和形参的关系,你可以去看看我的函数栈帧建立与销毁:https://blog.csdn.net/qq_38646470/article/details/79213082。建议你跟着网上视频学习

    点赞 评论
  • qq_41715746
    qq_41715746 2018-03-24 00:57

    你好。
    你的这个问题在于不理解C语言的函数调用的传递问题。像这种直接调用实参来传递给形参的方法,实际上是将实参的值传递给函数,也就是说系统将实参的值拷贝了下来
    传递给函数,但函数里面的操作并不影响实参本身的值;如果你希望改变实参的值,这需要你使用间址运算符*。在使用了*的情况下你是可以通过在函数中改变形参的值来达到改变实参的值的目的。如果不理解什么是指针和指针的运用你可以百度。

    点赞 评论
  • chendeyuan22
    九叔疯了 2018-03-24 03:15

    1、形参和实参是不同的内存
    2、形参的内存是在函数调用的时候从栈空间分配,函数调用结束后,出栈释放内存。
    3、因此对形参赋值改变的是形参对应的内存,所以实参内存不变。

    需要改变实参的内容则需要通过传递实参的内存指针,函数再对指针指向的内存进行修改,达到修改实参内容的目的。

    点赞 评论
  • wangshuange
    wangshuange 2018-03-24 05:13

    你好,从使用角度来讲,形参告诉使用者需要填入参数的类型,而实参是函数在调用时真正使用的参数。

    点赞 评论
  • dujiahaogod
    杜佳豪 2018-03-25 11:20

    形参和实参的位置是一一对应的。
    你的这个例子中就是 x, int_part, frac_part 是形参,3.14159、i、d 就是实参,而且是一一对应的。当你调用函数传入实参的时候,对于 int,double 这些基础数据类型的数据,编译器会拷贝一份实参的值,然后把拷贝的值赋值给形参,所以在函数中改变了某个形参的值,实参是不会受影响的。但是对于数组之类的数据类型就要注意了,实参给形参复制的时候不是拷贝一份,而是直接把实参的地址(指针)拷贝给了形参,所以如果在函数里面改变了形参也会改变实参(数据就一份,参指向的是同一份数据)

    点赞 评论

相关推荐