1. 程式人生 > >函式引數傳遞:引數傳遞從右往左

函式引數傳遞:引數傳遞從右往左

記憶體分為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.