C语言易错点(函数里修改传入变量的值不会改变传入变量的指针)

SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机、32位ARM Cortex-M0处理器、128kB Flash存储器、以及丰富的数字接口。SYD8801片上集成了Balun无需阻抗匹配网络、高效率DCDC降压转换器,适合用于可穿戴、物联网设备等。具体可咨询:http://www.sydtek.com/

函数里修改传入变量的值不会改变传入变量的指针   

相关语句如下:

uint8_t a,b,c;

    a=4;
    b=6;
    c=0;
    oled_printf(0,0,"a:%d b:%d c:%d",a,b,c);
    c=Max_Common_Divisor(a,b);
    oled_printf(0,1,"A:%d B:%d C:%d",a,b,c);

其中Max_Common_Divisor函数如下:

uint32_t Max_Common_Divisor(uint32_t a, uint32_t b)            
{  
      uint32_t  temp;                                                          
      if(a       {   
          temp=a;  
          a=b;    
          b=temp;  
    }                                                                     
       while(b!=0)                                                         
           {  
          temp=a%b;  
          a=b;                                                                    
          b=temp;  
    }  
      return a;                                                                

经过上面的运算输出结果如下:

a:4 b:6 c:0

A:4 B:6 C:2

实验结果可以证明:

不管Max_Common_Divisor函数对传入的变量a,b进行怎样的修改,在函数外边看(main)a,b这两个变量的值是不变的。

也可以这样分析编译的过程:

当执行Max_Common_Divisor函数时:

1.把a,b作为变量拷贝到R1,R2(按照单片机来解释),或者说当调用这个函数的时候a,b的值就放到R1,R2了

2.然后把R1,R2压栈,当需要这些变量的时候从堆栈中获取

3.用堆栈中的数据进行计算等等操作

4.最后退出函数

所以:不管函数里怎么改变传入的那两个变量,都不会改变函数外的数据,因为在调用这个函数的时候传进来的就不是函数外的数据的原件,而是一个备份而已

所以在主函数外看:a\b的值永远是4\6

这里为什么会让人混淆了,或许还有一点就是函数外面的变量名字和函数里面是一样的吧

你可能感兴趣的:(C语言易错点(函数里修改传入变量的值不会改变传入变量的指针))