C typedef和指针

C typedef和指针,c,pointers,typedef,C,Pointers,Typedef,我对指针有问题。基本上,我有一个结构,作为下面的链表队列Pcb struct pcb { pid_t pid; // system process ID char * args[MAXARGS]; // program name and args int arrivaltime; int remainingcputime; struct pcb * next; // links for Pcb handlers i

我对指针有问题。基本上,我有一个结构,作为下面的链表队列
Pcb

struct pcb {
    pid_t pid;             // system process ID
    char * args[MAXARGS];  // program name and args
    int arrivaltime;
    int remainingcputime;
    struct pcb * next;     // links for Pcb handlers
    int priority, memalloc, res1, res2, res3, res4, status;
};
typedef struct pcb Pcb;
typedef Pcb * PcbPtr;
现在您可以看到,我已将
Pcb
指针定义为
PcbPtr
,这意味着
PcbPtr
是指针,对吗?
然后,我实现了这些函数,根据队列的优先级向队列添加
PcbPtr

PcbPtr enqPcb(PcbPtr headofQ, PcbPtr process){
    PcbPtr c = headofQ;
    if (!headofQ) {
        headofQ = process;
        return headofQ;
    }
    while (c->next) {
        c = c->next;
    }
    c->next = process;
    return headofQ;
}

void priEnq(PcbPtr f1, PcbPtr f2, PcbPtr f3, PcbPtr a) {
    int pri = a->priority;
    if (pri == 3)
        enqPcb(f3, a);
    else if(pri == 2)
        enqPcb(f2, a);
    else 
        enqPcb(f1, a);
    return;
}
但它并没有改变我指向的对象(即本例中的
headf1

这就好像我在传递另一个对象作为参数。当我不使用
priEnq()
时,它会很好地添加到列表中

知道我做错了什么吗?非常感谢您的帮助

解决了的:
如果我正确理解您的问题,则
priEnq
的调用方具有指向队列的指针,并且希望在函数更改队列头时更新这些指针

问题是您正在按值传递指针。如果希望被调用函数修改调用方的值,则必须通过引用传递,即指向要更新的指针的指针。代码:

PcbPtr enqPcb(PcbPtr *headofQ, PcbPtr process){
    PcbPtr* c = headofQ;
    if (!*headofQ) {
        *headofQ = process;
        return *headofQ;
    }
    while (c->next) {
        c = c->next;
    }
    c->next = process;
    return headofQ;
}

void priEnq(PcbPtr *f1, PcbPtr *f2, PcbPtr *f3, PcbPtr a) {
    int pri = a->priority;
    if (pri == 3)
        enqPcb(f3, a);
    else if(pri == 2)
        enqPcb(f2, a);
    else 
        enqPcb(f1, a);
    return;
}

PcbPtr headi;
PcbPtr headf1; //priority 1
PcbPtr headf2; //priority 2
PcbPtr headf3; //priority 3
...
priEnq(&headf1, &headf2, &headf3, headi);
通过传递队列指针的地址,您允许
priEnq
修改指针,而不仅仅是它自己的副本


此外,正如Salnod所提到的,您可能需要考虑队列指针的可读性和可维护性。

这是有意义的,非常感谢。现在唯一的问题是,我无法访问c->next,因为它现在是指向指针的指针,即,我得到了“对非结构或联合中的成员'next'的请求”,我如何更改代码以允许这样做?我真的很感谢你的帮助对不起,忽略上面的帖子。我将“PcbPtr*c=headofQ;”更改为“PcbPtr c=*headofQ;”但现在我得到了“从不兼容指针类型返回”…hmmI正要建议您作为练习解决自己的问题,然后我看到您已经有了:)。类似的建议适用于返回值问题:考虑返回语句中表达式的类型。它与函数声明的返回类型有何不同?很抱歉,让所有的教学,但你没有标记这作为家庭作业…是的,愚蠢的问题真的。当然,我只是将返回值改为PcbPtr,而不是PcbPtr*。再次感谢,我将用解决方案更新OP。
PcbPtr enqPcb(PcbPtr *headofQ, PcbPtr process){
    PcbPtr c = *headofQ;
    PcbPtr d = c;
    if (!*headofQ) {
        *headofQ = process;
        return *headofQ;
    }
    while (c->next) {
        c = c->next;
    }
    c->next = process;
    return headofQ;
}

void priEnq(PcbPtr *f1, PcbPtr *f2, PcbPtr *f3, PcbPtr a) {
    int pri = a->priority;
    if (pri == 3)
        enqPcb(f3, a);
    else if(pri == 2)
        enqPcb(f2, a);
    else 
        enqPcb(f1, a);
    return;
}

PcbPtr headi;
PcbPtr headf1; //priority 1
PcbPtr headf2; //priority 2
PcbPtr headf3; //priority 3
...
priEnq(&headf1, &headf2, &headf3, headi);
PcbPtr enqPcb(PcbPtr *headofQ, PcbPtr process){
    PcbPtr* c = headofQ;
    if (!*headofQ) {
        *headofQ = process;
        return *headofQ;
    }
    while (c->next) {
        c = c->next;
    }
    c->next = process;
    return headofQ;
}

void priEnq(PcbPtr *f1, PcbPtr *f2, PcbPtr *f3, PcbPtr a) {
    int pri = a->priority;
    if (pri == 3)
        enqPcb(f3, a);
    else if(pri == 2)
        enqPcb(f2, a);
    else 
        enqPcb(f1, a);
    return;
}

PcbPtr headi;
PcbPtr headf1; //priority 1
PcbPtr headf2; //priority 2
PcbPtr headf3; //priority 3
...
priEnq(&headf1, &headf2, &headf3, headi);