都是赋值,为什么第一个代码的n不会被修改,第二个代码的prince会被修改呢?


#include<stdio.h>
void f2(int n){
  n++;
printf("\nf2 中的n=%d",n);
}
void main(){

int n =9;
f2(n);
printf("\nmain 函数中 n=%d",n);
getchar();
}


# include <stdio.h>
 double price =200.0;    

  void test01(){
 printf ("%.2f \n ", price );   
 }

 void test02(){               
  price =250.0;       
 printf ("%.2f \n ", price );   
 }

 void main (){               
 printf (" main price =%.2f \n ", price );  
  test01();              
test02();                   
test01(); 
getchar();
 }

第一段代码,n 是各个函数里的局部变量,它的作用域仅限在各函数体内,因此在void f2(int n) 对 n++只在函数内作用,所以这里输出 10,但在主函数里 n 的值仍然没有被改变,仍为 9。
第二段代码,double price =200.0; 定义在程序开始,是个全局变量,它的作用域从定义它的那行开始向下全域有用,只要不在各个函数里定义和它同名的局部变量。如果在某个函数里定义的局部变量名和全局变量名同名,则在这个函数里起作用的就是局部变量,全局变量被屏蔽了。

你知道什么是值传递和指针传递吗?

  • 以下回答由chatgpt基于相关博客总结生成:

    第一个代码中,变量n的值不会被改变是因为在函数Facl中,使用的是传值调用(pass by value)的方式。在该方式下,函数参数是形参,会创建一个新的内存空间来存储参数的值,并且在函数调用结束后会被销毁,不会改变原始变量的值。所以在函数Facl中对n的改变不会影响到main函数中的n。

    第二个代码中,变量prince的值会被改变是因为在函数中使用的是传引用调用(pass by reference)的方式。在该方式下,函数参数是实参的引用,传递的是变量的内存地址。因此,在函数中对实参的修改会直接修改原始变量的值。所以在函数中对prince的改变会影响到main函数中的prince。

    要解决第一个代码中变量n不会被改变的问题,可以考虑使用指针作为参数。具体步骤如下:

    1. 修改函数Facl的定义,使其接受一个指向int类型的指针作为参数,同时将函数返回值改为void类型。修改后的函数定义如下:

    c void Facl(int *n) { if (*n <= 1) { return; } else { *n = *n * Facl(*n - 1); } }

    1. 在main函数中,声明一个int类型的变量n,并使用&运算符取得其地址:

    c int n = 0; scanf("%d", &n);

    1. 调用函数Facl时,传入变量n的地址:

    c Facl(&n);

    1. 输出结果:

    c printf("%d", n);

    这样就可以改变第一个代码中的变量n的值了。

    请注意,这里将函数Facl的返回值改为void类型,因为已经通过指针修改了变量n的值,所以无需再返回修改后的值。

第一个是值传递
第二个是全局变量

第一个代码是一个函数值增加1的过程
第二个代码是全局,而且是先输出的price,再对它进行赋值
我还是一名小学生,能先点个采纳吗,实在不懂,我再教你。