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);