以下は、ダブルポインタを関数に渡すコードです。ダブルポインタには、ので作成されたポインタのアドレスが割り当てられます。ダブルポインタに格納されているアドレスを出力すると、関数に渡す前に最初に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 = ¤tNode;
printf("\n¤tNode = %p", ¤tNode);
}
は、私が知っているあなたが外ポインタにアクセスしたときに消えることはありませんあなたは、関数内のポインタに加えた変更を意味し、それは参照によって渡される関数へのポインタを渡す場合関数。
私の質問は、私はなぜ関数の外で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;
}
"ダブルポインタ"はありません。ポインタだけがあります。ポインタはポインタを含む何かを指すことができます。ポインターを指すポインターは、単なるポインターであり、 "ダブルポインター"ではありません。これを覚えておけば、多くの混乱がなくなるはずです。 – gnasher729