whyyouhitme_ 2018-03-11 13:55 采纳率: 57.1%
浏览 1483
已采纳

学到函数了。遇到两个问题。为什么实参必须初始化?为什么变量m进过函数后,没有被赋新值

#include
int gcd(int n,int m,int y)
{
for(;n!=0;m=n,n=y)
y=m%n;
return m;
}
int gcd(int n,int m,int y);
int main(void)
{
int a,b,c=0;
printf("输入两个数:");
scanf("%d %d",&a,&b);
gcd(a,b,c);
printf("最大公约数是:%d\n",gcd(a,b,c));
return 0;

}
此程序我变量C没有初始化,就报警告。赋值0,就没事了

#include
int num_digits(int n)
{
int i=0;
while(n>0){
n=n/10;
i++;
}
return i;
}
int num_digits(int n);
int main(void)
{
int m,j;
printf("enter a number:");
scanf("%d",&m);
j=num_digits(m);
if(j==1)
printf("thera is %d digit in %d\n",j,m);
else
printf("thera are %d digits in %d\n",j,m);
return 0;
}
为什么变量m经过函数num_digits(m)后,其值没有改变?体现在输出printf()函数上,显示在屏幕上是原值

  • 写回答

4条回答 默认 最新

  • CycleAdd 2018-03-11 15:12
    关注

    (1)其实你问的两个问题都是需要理解"**实参**"和"**形参**"与**实际电脑存储空间**的关系.
    (2)首先第一个问题"为什么实参必须初始化?" : 这里要说明**实参不是必须初始化**, 你这里是特殊情况. 你的c变量在定义在main函数之中, 属于局部变量, 在定义c时, 不会被自动初始化, 此时c会被分配和电脑中一个int数据类型大小的存储空间对应, 由于不会被自动初始化, 这块空间中存放什么数据是不确定的, 也就不可以在下边的代码中有调用c的值的行为. 你的gcd(a,b,c )函数明显就想直接获取c的值, 所以会报错, 后来你手动给c初始化, 就相当于在这个存储空间中放上了c的值.
    (3)其次第二个问题"为什么变量m进过函数后,没有被赋新值" : 这里要说明, 在你的情况中, 不能说m进过函数, 而是**m的值进过函数**. 在函数定义中的参数都是"形参"(即你这里的n), 而定义函数时, 形参是不会被分配电脑存储空间来对应的. 只有当函数运行时, 形参n才会被分配实际的一块电脑存储空间和它对应, 才会把你调用的函数的括号里面的东西的值(即m的值), 放到这个存储空间里, 即表现为把m的值赋给了n.
    (4)纯手打, 转发请注明源自csdn用户CycleAdd. 有问题可以再问我.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型