1. 程式人生 > >C語言易錯點(函式裡修改傳入變數的值不會改變傳入變數的指標)

C語言易錯點(函式裡修改傳入變數的值不會改變傳入變數的指標)

函式裡修改傳入變數的值不會改變傳入變數的指標   

相關語句如下:

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<b)                                                      
      {   
          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

這裡為什麼會讓人混淆了,或許還有一點就是函式外面的變數名字和函式裡面是一樣的吧