-2

リンクされたリストがあります。呼び出し関数では、最初のノードを作成し、その最初のノードのポインターを関数に渡して、さらに処理を行いました。追加のノードはその関数で作成されます。しかし、何らかの理由で、関数内の処理中に最初のノードを削除する必要があります。したがって、処理関数では、連結リストの最初のノード アドレスが次のノードに変更されます。ただし、呼び出し元の関数に戻ると、その変更は呼び出し元の関数には反映されません。呼び出し関数では、リンクされたリストの最初のノードは削除された最初のノードのままですが、どうすれば更新できますか?

呼び出し関数の内部:

model_list *allmodelroot;

allmodelroot =  new model_list;
allmodelroot->next = NULL;
allmodelroot->modelIndex = -1;  
processfunction(bmodelroot, wmodelroot, settings, featurePts, allmodelroot);

内部プロセス機能;

int processfunction(model_list *bmodelroot, model_list *wmodelroot, set_setting &settings, calib_features &featurePts, model_list *allmodelroot)
{
    model_list *first_allmodelroot = allmodelroot;  


    model_list *previous = allmodelroot;
   for(i = 0; i < allmodelrootSize; i++)
   {

       if(usemodel[i] == false)
       {
               //delete the first node
               first_allmodelroot = allmodelroot->next;
               previous = allmodelroot->next;
               delete allmodelroot;
               allmodelroot = previous;



       }else{
          previous = allmodelroot;
          allmodelroot = allmodelroot->next;
       }

   }

   allmodelroot = first_allmodelroot;   

}
4

2 に答える 2

1

ポインターについて十分に理解する必要があります。
つまり、ポインター自体はメモリ内のアドレスを持っていますが、その値は他の変数のアドレスです。

#include <stdio.h>
void pointer_test(char *p) {
    printf("p addr \t:%d\n", (int)p);
    p = p + 1;
    printf("p addr \t:%d\n", (int)p);
}
int main() {
    char buf[3] = {'a', 'b', 'c'};
    printf("buf addr\t:%d\n", (int) buf);
    printf("buf[0] addr\t:%d\n", (int) &buf[0]);
    printf("buf[1] addr\t:%d\n", (int) &buf[1]);
    printf("buf[2] addr\t:%d\n", (int) &buf[2]);
    pointer_test(buf);
    printf("buf addr\t:%d\n", (int) buf);
    printf("buf[0] addr\t:%d\n", (int) &buf[0]);
    printf("buf[1] addr\t:%d\n", (int) &buf[1]);
    printf("buf[2] addr\t:%d\n", (int) &buf[2]);
    return 0;
}

上記の例では、p の値は buf のアドレスであり、p のアドレスはスタックまたは単なるレジスタにあります。
buf のアドレスは、p の値として関数 pointer_test にコピーされます。
p の値を変更しても、この場合の buf には影響しません。
上記のコードの出力は、次のようになります。

buf addr        :2686736
buf[0] addr     :2686736
buf[1] addr     :2686737
buf[2] addr     :2686738
p addr  :2686736
p addr  :2686737
buf addr        :2686736
buf[0] addr     :2686736
buf[1] addr     :2686737
buf[2] addr     :2686738

あなたの場合、allmodelroot の値を変更する場合はmodel_list **allmodelroot、ポインタ allmodelroot のアドレスを渡すことを意味する使用する必要があります。ポインター allmodelroot の元のアドレスを取得すると、関数内でポインター allmdelroot の値を変更できます。

于 2013-11-08T04:36:58.297 に答える
1

リスト内の最初のノードへのポインターではなく、リンクされたリスト自体を表す構造体をコードに渡します。そのような構造がない場合、それはコードにかなり大きな欠陥があると言えます。

于 2013-11-08T04:09:06.107 に答える