在“for”循环中初始化两个指向相同值的指针

时间:2012-03-20 11:26:47

标签: c++ pointers

我正在处理一个链表,并试图初始化两个等于“first”/“head”指针的指针。我试图在for循环中干净地完成这项工作。所有这一切的重点在于我可以通过链表运行两个指针,一个在另一个后面(这样我就可以根据需要进行修改)......

类似的东西:

//listHead = main pointer to the linked list
for (blockT *front, *back = listHead; front != NULL; front = front->next)
//...//
back = back->next;

我的想法是,我可以提前提前,以便它提前一步,完成工作,而不是递增“返回”直到代码块的底部,以防我需要备份以修改链接列表...

无论这个“为什么”,除了以上我尝试过:

for (blockT *front = *back = listHead; /.../

for (blockT *front = listHead, blockT *back = listHead; /.../

我想避免指向指针。我只需要在循环之前初始化这些吗?

4 个答案:

答案 0 :(得分:3)

你接近成功

for (blockT *front = listHead, *back = listHead; front != NULL; front = front->next)

注意,它是语法糖。它实际上就像

一样
int x = 0, y = 1;

答案 1 :(得分:2)

语法为:

for ( BlockT* front = listHead, *previous = NULL;
        front != NULL;
        front = front->next ) {
    //  ...
    previous = front;
}

你需要循环中previous的特殊情况,以便 测试并避免在列表前面备份。或者, 您可以使用&listHead代替NULL,但您需要 用它来玩类型游戏(并确保你不尝试修改任何 成员)。如果您只需要能够插入中间成员 (在front前面)或删除front,那么你应该考虑一个 指向指针的指针:

BlockT** previousNext = &listHead;
BlockT* current = listHead;
while ( current != NULL ) {
    //  ...
    previousNext = &current->next;
    current = current->next;
}

在循环中,您可以通过*previousNext = &current->next从列表中删除当前内容(确保在删除之前提前current 旧元素);插入新元素*previousNext = new BlockT; previousNext->next = current;

答案 2 :(得分:1)

您可以从for:

中取出变量声明
blockT *front, *back;
for (front = back = listHead; front != NULL; front = front->next)

但为了您的目的,这将更合乎逻辑:

for (blockT *front = listHead, *back = 0; 
    front != NULL;  
    back = front, front = front->next) {

    /* if (back != 0) backup */
}

答案 3 :(得分:1)

我将指针的声明放在循环之外:

//listHead = main pointer to the linked list
blockT *front, *back;
for (front = back = listHead; front != NULL; front = front->next) {
    //...//
    back = back->next;
}

这样你也可以按照你编写的那样执行back = back->next;行(在循环之外),如果你出于某种原因需要,虽然我想你想要它。在循环中声明变量(当然包括指针)会使它们在它外面不可用。

<强>更新 如果您需要仅针对数组的指针,我会选择:

for (blockT *front = listHead, *back = listHead; front != NULL; front = front->next) {
    //...//
    back = front;
}