函数参数传递:参数传递从右往左
内存分为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.