学到函数了。遇到两个问题。为什么实参必须初始化?为什么变量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()函数上,显示在屏幕上是原值

c

4个回答

(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. 有问题可以再问我.

whyyouhitme_
whyyouhitme_ 厉害了!
接近 2 年之前 回复
 (1)是否需要初始化,是编译器和所设置的警告级别决定的。
如果你看的是谭浩强时代的c语言书,那么不初始化也是可以的。
一些编译器(特别是现代的编译器)会要求你用更严格的语法,减少潜在错误。
(2)可以改变,但是不会作用在实参(调用者)上。
如果要改变实参,应该用指针。
void change(int * m)
{
*m = 123;
}
int main()
{
int m = 1;
change(&m);
}

形参是n是m的一个拷贝,与m并不是同一个内存,而形参使用指针的话就是同一个内存了,值才会改变。在c++里,引入了引用,给变量起别名也是同一个内存,值也会改变。

形参是n是m的一个拷贝,与,值才会改变。在c++里,引入了引用,给变量起个内存,值也会改变。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问

相似问题

3
javascript中使用ajax时设置回调函数,我想向回调函数中传参?该怎么传参?
4
两个数组作为实际参数传给被调用函数的时候,没有敲长度,但可以正常运行
10
形参和实参的关系。我理解的不对吗
9
把外部变量局部于main函数内遇到了问题
5
关于Fortran调用C++的函数,函数传参为字符型。
1
找不与实参个数对应的函数实现
7
js文件里调用另外一个js里的函数,但是两个js里函数重复的很多,怎么办?
2
vue中this遇到点问题,到底能不能用箭头函数?
2
这里的同步函数为什么没有效果,必须要加个计时器才行?
1
MATLAB函数返回的问题
3
python中 一个类中函数怎么调用另一个类有参数self的函数
1
进行dll动态加载的时候用GetProcAddress()函数进行地址传入出现不能初始化问题
1
python中函数名还可以作为变量引用另一个函数吗
1
pytorch自定义loss函数
1
C++带有回调函数的函数传参问题
2
自学C的十。。来天)?到函数部分,什么形参实参好混乱,为什么我总被编译器提示形参有重定义?
2
C++MFC初学者请教问题...在自己创建的类中添加的初始化函数初始combo box控件用不了成员函数
3
BP神经网络的训练函数和学习函数,还有性能函数分别代表什么
1
c++关于用一个类外函数调用两个不同对象问题
2
用函数编程实现两个数组数值的交换,要求要用到指针?