0

次の連結リスト構造があるとします。

struct linked_list
{
    struct linked_list *next;
    int data;
};
typedef struct linked_list node;

そして、リンクされたリストを印刷する次の関数:

void print(node *ptr)
{
    while(ptr!=NULL)
    {
        printf("%d ->",ptr->data);
        ptr=ptr->next;
    }
}

main()これを書くときの関数で:

print(head); // Assume head is the pointer pointing to the head of the list

これは基本的に値渡しです。は のコピーを受け取るためptrです。また、値渡しであるため、関数から変更することはできません。printheadheadprint()

しかし、私の疑問は、ptrのコピーを受け取るのでhead、リンクされたリストの値を出力できるということです。これは、print()関数がリンクされたリストのコピー全体を受け取ることを意味しますか? リンクされたリストの全体のコピーを受信しない場合、リストを印刷するにはどうすればよいですか?

4

2 に答える 2

4

関数はポインターのコピーを受け取ります。ポインターのコピーは、元のポインターと同じ場所を指します。

ポインタはアドレスのようなものです。ここに類推があります。一枚の紙に住所を書き留めることを想像してみてください。友人にそれを渡したい場合は、住所をコピーします。つまり、同じ住所を新しい紙に書き、その紙を友人に渡します。しかし、コピーに書かれた住所に行けば、元の紙に書かれた住所に行ったのとまったく同じ場所に行くことになります。

于 2012-07-29T23:02:21.287 に答える
0

printヘッドのアドレスのコピーを受け取ります。これは、表すデータheadがコピーされていないことを意味します。関数は実際のヘッドを使用しているため、コピーではなく実際のリンクリストを使用しています。

つまり、たとえば変更したり、リンクされたリストの残りを変更したりできます。唯一できないことは、渡されたポインタが指しているノードを変更することです。headhead->datahead = NULLprintprint

したがって、次の変更はすべて関数の外部に反映されます。

// pick one:
ptr->data = 20;
ptr->next = NULL;
ptr->next = malloc(sizeof(node));
ptr->next->data = 20;
// etc.

以下はそうではありません:

ptr = NULL;
ptr = malloc(sizeof(node));
于 2012-07-29T23:02:32.330 に答える