Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:处理指针的方法_C - Fatal编程技术网

C:处理指针的方法

C:处理指针的方法,c,C,我想知道为什么第一种方法不起作用,而第二种方法起作用: //第一种方法 int create_node(struct node *create_me, int init){ create_me = malloc(sizeof(struct node)); if (create_me == 0){ perror("Out of momory in ''create_node'' "); return -1; } (*create_me

我想知道为什么第一种方法不起作用,而第二种方法起作用:

//第一种方法

int create_node(struct node *create_me, int init){
    create_me = malloc(sizeof(struct node));
    if (create_me == 0){
        perror("Out of momory in ''create_node'' ");
        return -1;
    }
    (*create_me).x = init;
    (*create_me).next = 0;
    return 1;
}

int main( void ){
    struct node *root;
    create_node(root, 0);
    print_all_nodes(root);

}
好的,这里的print_all_nodes函数告诉我,root尚未初始化。现在,第二种方法很有效:

struct node* create_node(struct node *create_me, int init){ //<-------
    create_me = malloc(sizeof(struct node));
    if (create_me == 0){
        perror("Out of momory in ''create_node'' ");
        exit(EXIT_FAILURE);
    }
    (*create_me).x = init;
    (*create_me).next = 0;
    return create_me; //<---------
}


int main( void ){
    struct node *root;
    root = create_node(root, 0); //<---------------
    print_all_nodes(root);

}
它实际上改变了
i
。 明白了吗?
有人能和我分享他/她的知识吗

您需要指向指针的指针,而不仅仅是指针

如果要更改另一个函数中的变量,必须发送指向该变量的指针。如果变量是整数变量,则发送指向该整数变量的指针。如果变量是指针变量,则发送指向该指针变量的指针

在你的问题中,你是说“当我给
create_node
函数一个指向根节点的指针时,它实际上改变了
x
和根节点的
next
。”你的措辞让我怀疑这里有些混乱。是的,您正在更改
x
next
的内容,但不是
root
的内容
root
没有
x
next
,因为
root
是指向包含
x
next
的结构的指针。函数不会更改
根目录的内容,因为函数得到的只是该指针的一个副本

对代码的更改:

int create_node(struct node **create_me, int init) {
    *create_me = malloc(sizeof(struct node));
    if (*create_me == 0){
        perror("Out of momory in ''create_node'' ");
        return -1;
    }
    (*create_me)->x = init;
    (*create_me)->next = 0;
    return 1;
}

int main( void ){
    struct node *root;
    create_node(&root, 0);
    print_all_nodes(root);

}

您需要执行类似于
create_节点(&root,0)的操作
,然后在被调用的方法中作为
**
访问它。C没有通过引用传递的概念。您需要在另一个函数中提供访问地址。

这是变量范围的问题。在第一个示例中,您提供了一个指向节点的指针,您可以更改该节点,并且这些更改将在以后持续。但是,您的
malloc
会更改此指针,该指针在作用域(您的函数)结束后将被丢弃

在第二个示例中,您返回此指针,因此在丢弃之前复制它

这与您给出的第3个示例中的情况相对应:

void change_i(int* p){
    *p = 5; // you can 'change i'
    p = 5 // but not p (pointer to i), as it is local -> gets discarded after following '}'
}
当我给create_node函数一个指向根节点的指针时,它实际上改变了root的x和next

不给
create_node()
函数(在两个版本中)一个指向根节点的指针,因为您首先没有根节点

宣言:

struct node *root;
创建类型为
struct node*
的变量
root
,并使其取消初始化
root
是一个变量,可以将
struct节点
值(指向
struct节点
值的指针)的地址存储在内存中。但是代码没有创建任何
struct节点
值,
root
的值只是垃圾

接下来,函数
create_node()
的两个版本都会在参数
create_me
中接收
root
的垃圾值,作为调用的结果:

create_node(root, 0);
create_-node()
的两个实现的第一件事是忽略它们在
create_-me
参数中接收的值(无论是否有效),创建一个类型为
struct-node
的值,并将其地址存储在
create_-me

台词:

(*create_me).x = init;
(*create_me).next = 0;
将一些值放入新分配的
struct节点
对象的属性中

然后,函数的第一个版本返回1并忽略存储在
create\u me
中的值。作为函数参数(函数的局部变量),其值将被丢弃并永远丢失。代码刚刚创建了一个内存泄漏:一个已分配但无法访问的内存块,因为没有指向它的指针不要这样做

函数的第二个版本返回
create_me
的值(即
struct node
类型的新分配值的地址)。调用代码(
root=create_node(root,0);
)将函数返回的值存储到变量
root
(替换用于初始化此变量的垃圾值)


巨大的成功第二个版本的
create_node()
函数创建一个新的
struct node
对象,初始化其属性并返回要存储和/或进一步处理的新对象的地址。不要忘记在不再需要对象时调用。

指定参数对外部世界没有影响。方法1的工作原理类似于
voidchangei(intp){p=5;}
,方法2类似于
intchangei(intp){p=5;返回p;}
。(理解指针的一个关键是要意识到它们没有什么特别之处。)@molbdnilo,你能解释一下你的意思吗,,赋值给参数对外界没有影响“拜托?C不支持方法,只支持函数。你让它变得简短,一旦被遗忘,就很容易在以后查找!谢谢你,小伙子!谢谢你分享这个长长的答案,我想这对谷歌搜索这个问题的人来说真的很有用!并没有完全解决我的问题,但这是另一个威胁,我将了解!非常感谢。
(*create_me).x = init;
(*create_me).next = 0;