函数参数传递:参数传递从右往左

内存分为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.