> 技术文档 > 函数f(int a,int b),a和b的地址关系?

函数f(int a,int b),a和b的地址关系?

你问的这个问题其实涉及到函数参数在内存中的存放顺序,尤其是形参ab在栈上的地址关系


1. 一般情况说明

void f(int a, int b) { // 这里a和b是函数的形参}
  • ab 是按顺序传入函数的参数。
  • 在大多数编译器和常见平台上(比如 x86/x64 的系统),函数参数会按顺序压栈,先传入的参数(a)会位于更高地址,后传入的参数(b)会位于更低地址。
  • 因此,b 的地址通常比 a,即:&b < &a

2. 为什么是这样?

  • 函数调用时,参数是从右往左压栈的(cdecl调用约定)。
  • 第一个参数a最后入栈,位于栈顶(高地址)。
  • 第二个参数b先入栈,位于栈底(低地址)。

示意图:

栈顶(高地址)----------------| 参数 a 地址 | ← &a----------------| 参数 b 地址 | ← &b----------------栈底(低地址)

3. 注意事项

  • 以上是典型的**栈增长方向向下(地址递减)**的系统默认情况(比如大多数x86架构)。
  • 具体地址顺序依赖于编译器实现、调用约定、CPU架构,不完全固定。
  • 有些架构或调用约定可能会使用寄存器传递参数,此时参数可能不在栈上,地址无意义。
  • 如果参数是寄存器传递,那么可能根本没有对应的内存地址。

4. 小实验验证(GCC x86-64 Linux)

#include using namespace std;void f(int a, int b) { cout << \"&a = \" << &a << endl; cout << \"&b = \" << &b << endl;}int main() { f(1, 2); return 0;}

可能输出:

&a = 0x7ffee5c0d8dc&b = 0x7ffee5c0d8d8

&b 小于 &a,地址低。


总结:

参数顺序 地址关系(典型x86) f(int a,int b) &b < &a(后面的参数地址更低)
济南婚介机构