0

関数内で通常の変数の値を変更したい場合は、参照による呼び出しを使用して渡します。しかし、refenceによる呼び出しを使用してポインター変数(バイナリツリーのノードなど)を渡さなければならない場合の複雑さを理解することはできません。別のノードを指すようにpoiter変数を変更する場合は、参照による呼び出しを使用する必要があることを理解しています。しかし、ルートのデータ要素を変更する必要がある場合はどうでしょうか。変更するには、参考までに電話が必要だと思いました。しかし、次のコードスニペットは、関数modifyTreeで値による呼び出しを使用してツリーのルートノードを渡したにもかかわらず、10、10、10の出力を提供しています。ここで何かが足りないのですか?

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


struct node
{
int data;
struct node* left;
struct node* right;
};

/* Helper function that allocates a new node with the
given data and NULL left and right pointers. */
struct node* newNode(int data)
{
struct node* node = (struct node*)malloc(sizeof(struct node));

node->data = data;
node->left = NULL;
node->right = NULL;
return(node);
}

/*  This function sets the data fields of some of the nodes of tree to 10*/
void modifyTree(struct node* node)
{

node->data = 10;
node->left->data = 10;
node->right->data = 10;
}

int main()
{
struct node *root = newNode(1);
root->left            = newNode(2);
root->right          = newNode(3);
root->left->left     = newNode(4);
root->left->right   = newNode(5);

modifyTree(root);

printf("%d\n", root->data);
printf("%d\n", root->left->data);
printf("%d\n", root->right->data);

getchar();
return 0;
}
4

3 に答える 3

3

ポインタを値で渡すということは、呼び出された関数が呼び出し元が使用したのとまったく同じポインタ値を受け取ることを意味します。したがって、そのポインタを介したアクセスはすべて同じメモリを参照します。

呼び出し元が持っているポインターを関数で変更する場合は、ダブルポインターが必要になります(たとえば、新しいツリーを割り当てて、新しいポインター値を「作成」します)。

于 2012-06-07T12:43:39.917 に答える
1

ポインタを値で渡していますが、ポインタは同じものを指しています。いくつかの架空の値を使用して説明します。

で、main新しいを割り当てますstruct node。それがメモリ位置で作成されたとしましょう0x12345。だから今あなたstruct node *rootは含まれています0x12345

ここでを呼び出しますmodifyTree(root);。 の引数にrootで渡されます。rootmodifyTree

これrootで、が含まれます0x12345同じメモリ位置を指しています。

したがって、でその場所にアクセスするとnode->data = 10、で作成したのと同じメモリにアクセスすることになりますmain

于 2012-06-07T12:44:25.683 に答える
0

ポインターを値yesで渡しますが、modifyTree関数内で変更しているのは、ポインターが指している構造体の要素です。値によって構造体へのポインターを渡すことは、パラメーターによってポイントされている構造体の内部コンテンツを変更することを妨げることはありません。変更するのがポインタ自体である場合は、期待する動作が表示されます。

于 2012-06-07T12:45:45.957 に答える