为何scanf函数的参数需要取地址?

描述

scanf后面的参数,为什么要加上取地址的符号? 一般学习C语言学到第二天的时候,很多同学都会有这样的疑问。 这个问题等你学完了指针,应该就会很清晰。 scanf的作用是从标准输入缓冲区获得一个数据,放在对应的变量里面,假设我们获取的是一个整数。 如果不取地址,写法是这样的:

 

scanf("%d", num);
  num在这个地方叫做实参。 scanf的定义在C库中,而且还涉及可变参数,我们把它简化一下,假设函数的定义就是这样:
int scanf(char *f, int n)
{
    // ...
}
  这个地方的n叫做形参。 在内存里面,实参占 4 个字节,形参也占 4 个字节。 函数体里面要做的,就是从标准输入读取一个整数,放在 n 中。 那么问题来了,数据确实被放到了 n 里面,但是 num 没有任何变化,回到函数调用的地方,num 并没有变成我们想要的数据。 如果改成取地址,实参还是 num,但是形参变成了 num 的地址,指针 n 指向 num,在 scanf 函数里面,可以通过地址把获取到的数据放到 num 中。
回到函数调用的地方,num确实被修改了。 所以我们使用 scanf 的使用,经常会见到取地址的符号,就是希望在函数内部修改实参的值。 最后,还得强调一下,并不是所有使用 scanf 的地方都要加上取地址符号,比如数组,数组名本身就是地址,也就没有必要再对他做取地址的操作。 

审核编辑:黄飞

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分