2012-02-24 161 views
0

我想了解从一个简单的优先级队列这个C代码,尤其是 - 为什么它需要struct qnode **first部分:为什么这个C函数将一个指针指针作为参数?

int quedel(struct qnode **first, struct qnode **last, int *prio, int *val) { 
struct qnode *tmp = NULL; 

if((NULL == *last) && (*last == *first)) { 
    fprintf(stderr, "Empty queue.....\n"); 
    return -1; 
} 

*val = (*first)->data, *prio = (*first)->prio; 
tmp = *first, *first = (*first)->next; 

if(*last == tmp) 
    *last = (*last)->next; 
free(tmp); 

return 0; 
} 

回答

2

由于C没有传递按引用传递只按值,这种做法是让这项任务的唯一方法:

*first = (*first)->next; 
对呼叫者可见的

(如果first只是一个指针,而我们写first = first->next,然后调用此函数不会看到修改的代码。)

+0

C *具有*传递引用,您可以使用指针实现它。 “传递引用”是一个概念,而不是特定的编程语言结构。相比之下,C++还允许通过指针或通过本机引用类型传递引用。另一方面,Java [没有任何参考依据](http://javadude.com/articles/passbyvalue.htm)。 – 2012-02-25 00:00:58

+1

@KerrekSB:我不同意;传递值和传递引用是语言语义的问题。 C和Java都具有仅通过按值,尽管都提供机制,以模仿传按引用语义(在C中,可以通过一个指针;在Java中,可以通过一个可变的包装对象)。 – ruakh 2012-02-25 00:05:42

+0

@KerrekSB:顺便说一句,您链接的页面与我同意;它说,例如,“Java严格按照价值传递,完全如同C”。 – ruakh 2012-02-25 00:07:01

2

由于队列本身是通过指针处理(以struct qnode S),并自你想quedel有其firstlast元素引用语义,您可以通过将指针传递到要参考的东西使用实现引用语义的通常的C成语 - 和指针的指针到struct qnode是,好,一个双指针。

quedel函数的意义在于修改调用者范围内的实际变量,因为它会删除队列头并将调用者的原始头指针更改为新头指针(或尾部或其中任何一个办法解决这事情会发生):

{ 
    struct qnode * q = new_queue(); // or whatever 

    add_lots_of_elements(q);   // fine; the head doesn't change, 
            // only its contents do 

    quedel(&q);      // now q is something else! 
} 
+0

非常感谢你!这是点击! – Coffee 2012-02-25 03:49:11

相关问题