函式引數傳遞:引數傳遞從右往左
阿新 • • 發佈:2019-01-03
記憶體分為4個區域,如下:
而函式的引數就存放在棧中。棧,先進後出。
引數傳遞方式:a.通過棧 b.從右往左。
什麼是從右往左呢?來舉個例子。
int Max(int a,int b);
Max函式有兩個引數a和b。
這兩個引數怎麼存放在棧中呢?從右往左,即先從b,然後a。讀取資料則出棧,先讀取a,然後讀取b(即先進後出)。
關於這個問題有一個經典挖坑例題。
int main()
{
int arr[] = {1,2,3,4};
int i = 1;
int *p = arr;
printf("%d,%d\n",arr[i],arr[++i]);//++i有副作用
printf("%d,%d\n",p[1],p[2]);
return 0;
}
執行結果:
printf("%d,%d\n",arr[i],arr[++i]);//++i有副作用
這句程式碼錯誤思路是這樣的:i= 1;arr[1] = 2, ++i為2,arr[2] = 3。
所以結果為 2,3。
但實際是這樣的:printf()函式的兩個引數入棧時,arr[++i]先入棧,++i:前置++,i為1,所以i先自加1,i為2,++i為2,arr[2] = 3,arr[2] = 3,。
所以結果:3,3.