内部函数打印不同的指针地址

时间:2014-07-13 13:58:29

标签: c pointers

我是C和指针的新手。以下是我正在尝试的一些代码。

struct node{
    struct node * next;
    struct node * prev;
    int num;
 };

 void func(struct node * leaf , struct node ** add_leaf){
     printf("function starts");
     printf("&leaf = %p  add_leaf = %p\n" , &leaf , add_leaf);
     printf("leaf = %p  *add_leaf = %p\n" , leaf , *add_leaf);
     printf("function over");
     return
 }


 void main(){
     struct node * leaf = (struct node*)malloc(sizeof(struct node));
     printf("leaf = %p\t&leaf = %p\n" , leaf , &leaf);
     func(leaf , &leaf);
 }

leaf和* add_leaf的值相等,这正是我的预期。但是我做不到 理解为什么在函数内部打印时& leaf和add_leaf的值存在差异。在这里,我试图打印节点指针叶的地址。

3 个答案:

答案 0 :(得分:3)

调用leaf时,会复制main中的局部变量func。这意味着leaf内的局部变量funcleaf内的main具有相同的值,即它指向相同的内存地址(因此第二次检查的等效性) ,但它本身存储在不同的地址。

答案 1 :(得分:2)

如果你画一个带箭头和方框的图片,我通常会发现更容易理解指针。

& leaf 为您提供变量 leaf 的地址,因为您有两个名为 leaf 的不同变量(两者都包含指向你的malloc分配的结构),你得到两个不同的地址:

enter image description here

答案 2 :(得分:0)

leaf是指向struct node的指针,指针是存储在内存中的32位(取决于架构)整数。

当您将leaf传递给printf时,会发生什么,leaf变量的副本将在堆栈上进行。该副本对应于printf函数的第二个本地参数。

但是当您将&leaf传递给printf函数时,您所做的就是传递leaf变量的地址

由于leaf中的main()变量和printf的第二个参数位于两个不同的位置,因此它确实会打印两个内存地址。