指针在函数内部地址和创建新值

时间:2014-01-25 22:39:12

标签: c pointers memory-address

首先,我有点宿醉,所以我不确定如何制定这个问题。随意编辑标题或内容以提供更好的洞察力。

我有两种方法。它们都打印指针的地址。但是地址不同。在main函数中打印指针地址时,结果与将指针地址传递给函数和打印完全相同。但是当将指针传递给函数并打印地址时,会得到一个不同的地址。这是为什么?

我已经明白,在将变量传递给函数时,它会复制值并分配新的内存。但为什么不为指针的地址执行此操作?

void print_pointer_1(int** p)   {
    printf("In print_pointer_1 address is : \t\t\t%p\n", p);
}

void print_pointer_2(int* i)    {
    printf("In print_pointer_2 address is : \t\t\t%p\n", &i);
}

int main()        {
    int j = 1;
    int* i = &j;

    printf("Directly printing the pointers address in main : \t%p\n", &i);
    print_pointer_1(&i);
    print_pointer_2(i);

    return 0;
}

产生这些输出:

Directly printing the pointers address in main :    0x7fff24330a48

In print_pointer_1 address is :                     0x7fff24330a48

In print_pointer_2 address is :                     0x7fff24330a28

3 个答案:

答案 0 :(得分:3)

void print_pointer_2(int* i)    {
                          ^
                 Here is the local variable, you're
                 printing the address of this local variable.
    printf("In print_pointer_2 address is : \t\t\t%p\n", &i);
}

所以你只是打印一个局部变量的地址。你宁愿打印 指针的值,因为该指针存储您在main()

中分配给它的地址
    printf("In print_pointer_2 address is : \t\t\t%p\n", i);

这会自然地打印j的地址,而不是主要的i变量的地址,如 你的print_pointer_1()函数。 print_pointer_2()无法知道main()的i

的地址

答案 1 :(得分:1)

首先,为什么不简单:

void print_pointer (void *p) {
    printf("In print_pointer address is : \t\t\t%p\n", p);

}

问题:print_pointer_1将指针作为参数(恰好指向指向int的指针),它作为参数出现。然后打印该指针。到现在为止还挺好。但是您要打印的指针是局部变量i的地址,该变量没有j的链接(只有内容j的链接,不是地址)。但是,这解释了为什么它与main()中直接打印的地址相同,因为它们都是i的地址。

print_pointer_2将指针作为参数(恰好指向指向int的指针),它作为参数出现。但是,然后你打印那个指针的地址,它将是print_pointer_1的堆栈帧中的一个地址 - 一个对你没用的地址。它不是main()中任何内容的地址。你用i作为参数来调用它,但是你用它来调用它并不重要;它总是打印相同的地址,因为它是您正在打印的参数的地址。

答案 2 :(得分:1)

好的,让我们尝试解释一下这样。 我使用“mem j”来表示分配用于存储变量j的值的内存。 这是您使用“j”时访问的内存。您将获得存储在此内存位置的值。

所以在主要

mem j< - 包含1

mem i< - 包含mem j的地址

您调用“print_pointer_1(& i)”,这意味着您将“print_pointer_1”值“mem i的地址”作为参数。

在print_pointer_1中,您将打印值“mem i的地址”。

然后调用“print_pointer_2(i)”。由于我包含“mem j的地址”,因此这是您传递给“print_pointer_2”的值。

现在为了使这个更简单,让我们再次使用这个实现 对于“print_pointer_2”:

void print_pointer_2(int* myvalue)    {
    printf("In print_pointer_2 address is : \t\t\t%p\n", &myvalue);
}

所以你打印“mem myvalue的地址”,它与“mem i的地址”无关。所以当然“print_pointer_2”打印的内容与“print_pointer_1”不同; - )。