通过引用传递,引用的地址保持不变

时间:2015-03-13 05:02:07

标签: c pointers

我有一个程序如下:

这里我有一个名为test()的函数,它接受指针tree1的地址,我试图在*tree1执行后更新指针test()的地址。我希望*tree中的test(sample *tree)引用tree1地址,如果我更新tree1,它也会更新tree。哎呀!我知道我弄错了。因此,该计划的目标是在*tree1完成后,使用*tree中的地址更新test()的地址。有没有办法实现这个目标?

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


typedef struct abc { 
        int num;        
    } sample;

sample *test(sample *tree){

    sample *text,*text1;

    text=(sample *)malloc(sizeof(sample));
    text->num=4;

    text1=(sample *)malloc(sizeof(sample));
    text1->num=6;

    tree=text1;

    printf("address of tree in test() is %p\n",tree);

    return text;

}

int main()
{

sample *tree1;

tree1=(sample *)malloc(sizeof(sample));
tree1->num=5;

printf("address of tree1 before test() is %p\n",tree1);

test(tree1);

printf("address of tree1 after test() is %p\n",tree1);

return(0);
}

3 个答案:

答案 0 :(得分:1)

指针在传递给函数时被复制,因此更改新指针地址不会影响原始指针。

typedef struct abc { 
        int num;        
    } sample;



sample *test(sample **tree){

    *text=(sample *)malloc(sizeof(sample));    
    return *text;
}

答案 1 :(得分:1)

您只需要进行一系列小改动,也许还需要添加一些null ptr测试。因为在C中所有param传递都是按值进行的,所以你必须传递test() tree1地址,以便该函数可以在其中传递一些新值地址。像,

sample* test(sample **ptr_to_tree) { // change defn

然后,将此指针值更新为

(*ptr_to_tree) = text1; // was tree=text1 changing what is basically "returned"

最后,当调用test()时,你需要传递树的地址

test(&tree); // changing how to use it

答案 2 :(得分:0)

你需要使用双指针。这对你来说是一个很好的教程,需要双指针。