2017-10-21 5 views
1

以下は、ダブルポインタを関数に渡すコードです。ダブルポインタには、ので作成されたポインタのアドレスが割り当てられます。ダブルポインタに格納されているアドレスを出力すると、関数に渡す前に最初にdoubleポインタを与えた値であるNULLが出力されます。 This is the result I get when I run the codeダブルポインタを関数に渡し、関数のローカルポインタのアドレスを割り当てます。

#include <stdio.h> 
#include <stdlib.h> 

struct node 
{ 
    int value; 
}; 

void append(struct node **nodePtr); 

int main() 
{ 
    struct node **nodePtr = NULL; 

    append(nodePtr); 
    printf("\nnodePtr = %p", nodePtr); 

    return 0; 
} 

void append(struct node **nodePtr) 
{ 
    // creating new node 
    struct node *currentNode = malloc(sizeof(struct node)); 

    // assigning the address of currentNode to the double pointer NodePtr 
    nodePtr = &currentNode; 

    printf("\n&currentNode = %p", &currentNode); 
} 

は、私が知っているあなたが外ポインタにアクセスしたときに消えることはありませんあなたは、関数内のポインタに加えた変更を意味し、それは参照によって渡される関数へのポインタを渡す場合関数。

私の質問は、私はなぜ関数の外でcurrentNodeのアドレスにアクセスできないのですか?私は二重ポインタに割り当てたので、私はそれを関数の外側にアクセスできるはずですか?右?上記は、あなたの答えポールのためにすでに

おかげに答えてきた

、それは完全に働きました。私はコードに展開しようとしました。私はという頭部と呼ばれる構造体ポインタにnodePtrを割り当てたいと思っていました。関数を呼び出すと、currentNodeのアドレスをヘッドポインタに格納したかったのです。

最初は、以下に表示されている関数内のコードを変更すると効果があると考えました。

*nodePtr = currentNode; 

しかし、私はちょうどnodePtrの内容をheadの内容で変更していたので、これは機能しませんでした。

次にnodePtrをheadのアドレスに初期化しようとしました。

struct node *nodePtr = &head; 

しかし、これはダブルポインタではないため動作しませんでした。ダブルポインタとして初期化すると、以前と同じ問題が発生します。以下

は、これまでのすべての私のコードです

#include <stdio.h> 
#include <stdlib.h> 

struct node 
{ 
    int value; 
}; 

void append(struct node **nodePtr); 

int main() 
{ 
    struct node *head = NULL; 
    struct node *nodePtr = head; 

    append(&nodePtr); 

    printf("%p", head); 
    return 0; 
} 

void append(struct node **nodePtr) 
{ 
    // creating new node 
    struct node *currentNode = malloc(sizeof(struct node)); 

    // assigning the address of currentNode to the double pointer NodePtr 
    *nodePtr = currentNode; 
} 
+0

"ダブルポインタ"はありません。ポインタだけがあります。ポインタはポインタを含む何かを指すことができます。ポインターを指すポインターは、単なるポインターであり、 "ダブルポインター"ではありません。これを覚えておけば、多くの混乱がなくなるはずです。 – gnasher729

答えて

0

あなたのメインは、次のようになります。

int main() 
{ 
    struct node *nodePtr = NULL; 

    append(&nodePtr); 
    printf("\nnodePtr = %p", nodePtr); 

    return 0; 
} 

ですから、メインからnodePtrのアドレスを渡します。追記で

、あなたはそのポインタデリファレンス今しなければならない:

// assigning the newly allocated currentNode to the double pointer NodePtr 
    *nodePtr = currentNode; 

(関数が戻った後、ローカル変数が存在しなくなるので、だから、ローカル変数currentNodeのアドレスをasssignしていないあなたが割り当てます。 mallocによって返されたポインタ。)

私はあなたがmainappendのメモリを書いたり、保存されます何が起こっているとものを見るためにポインタを描画するペンと紙を使用することをお勧め。

0

ダブルポインタの使用を強くお勧めする場合は、関数内にトリプルポインタを渡す必要があります。

コードでは、変更は関数内で実行されますが、終了後は変更されません。

しかし、main()ではダブルポインタを使用する必要はありません。ただ1つのポインタを使用してそのまま使用してください。

関連する問題