指向参数的指针作为值传递?

时间:2014-04-21 10:31:48

标签: c pointers scope arguments

在下面的例子中:

#include <stdio.h>
#include <stdlib.h>

void test1 (int x)
{
    int * xp = &x;
    printf("Address of xp (test1): [%p]\n", &xp);
    printf("xp points to: [%p] which is the same as [%p]\n", xp, &x);
}

int main()
{
    int x = 4;
    printf("Address of x (main): [%p] \n", &x);
    test1(x);
    return 0;
}

输出:

Address of x (main): [0xbfca0c5c] 
Address of xp (test1): [0xbfca0c2c] 
xp points to: [0xbfca0c40] which is the same as [0xbfca0c40] 
  • 地址0xbfca0c40会发生什么(参数地址) test1)功能之外?
  • 它位于记忆中的哪个位置?

3 个答案:

答案 0 :(得分:1)

这是由实现定义的。

它非常可能出现在机器堆栈上,因为堆栈是实现参数传递和局部变量的常用方法。当test1()函数退出时,将释放堆栈空间,因此可以重用所讨论的内存。

答案 1 :(得分:0)

int x;形式参数列表中的

test1test1的本地变量。如果您在int y;中将test1作为声明,则它具有类似的状态。它具有自动存储持续时间。

退出test1后,变量不再存在。

通常,编译器通过包含堆栈结构的内存块实现自动存储。当您调用一个函数时,在该函数的自动变量(以及返回地址和需要保存的任何寄存器)的堆栈顶部都会声明新的空间;当你离开这个功能时,堆栈会被弹出#34;回到调用函数之前的位置。

答案 2 :(得分:0)

  1. 在某些程序重复使用之前,地址仍将包含x的值。
  2. 地址位于堆栈上,因为变量x是函数参数。