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