當我們想通過函數改變普通變量的值時,我們使用call by reference來傳遞它。但是當我們必須通過refence傳遞一個指針變量(如二叉樹的節點)時,我無法理解錯綜複雜的情況。我明白如果我們想修改poiter變量指向另一個節點,我們必須使用引用調用。但是如果我們必須修改根的數據元素呢。我認爲要改變它,我們也需要通過引用來打電話。但是,下面的代碼片段提供了10,10,10的輸出,即使我已經通過函數modifyTree中的值調用傳遞了樹的根節點。我在這裏錯過了什麼嗎?在處理二叉樹時按值調用vs通過引用調用
#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;
}
'modifyTree(struct node * node)':所以你*將一個指向'root'節點的指針傳遞給'modifyTree'。所以它*是一個'通過引用調用'。 – ArjunShankar
我已經傳遞了根元素作爲modifyTree(root)而不是像modifyTree(&root)。所以這是一個價值的呼叫。 – Prateek
C不支持按引用進行呼叫。指針與C++中的引用不完全相同。請參閱http://c-faq.com/ptrs/passbyref.html。 –