Pokud budu vycházet z původního zápisu funkce insertNodes:
insertNodes( Node* node, int key ) {
// něco dělá
}
//volání
insertNodes( tree->root, 3 )
znamená to, že zavoláním funkce insertNodes vytváříš novou proměnnou node, která bude ukazovat na to, na co ukazuje root.
Jestliže root už nějaký obsah měl (ukazoval na platnou strukturu Node) pak změnou proměnné node:
node->key = 11;
dosáhneš změny i v tree->root->key.
Pokud ale root, potažmo node bude obsahovat NULL, přiřazením nějaké hodnoty do node už nezměníš to, kam ukazuje root. Po ukončení platnosti funkce insertNodes se proměnná node smaže a ty o data přijdeš.
V jiném případě, kdy bys do funkce chtěl dostat proměnnou, kterou ve funkci chceš měnit (bez toho abys ji musel vracet, například proto, že návratovou hodnotu chceš použít jako indikaci (ne)zdaru) použil bys ukazatel:
int cislo = 10;
foo( int * i ) {
// neco dela
}
foo( &cislo );
Root ale už ukazatel je, jednoduché doplnění ampersandu do volání funkce insertNodes( &root->child, 3) bude mít za následek chybovou hlášku:
main.cpp:23:22: error: cannot convert 'Node**' to 'Node*' for argument '1' to 'Node *insertNodes(Node*, int)'
Což už tě samo navádí k tomu, že potřebuješ ukazatel na ukazatel.
insertNodes(Node **node, int key) {
// něco dělá
}
// Volání
insertNodes( &tree->root, key);
Tím vytvoříš po volání funkce proměnnou, která ukazuje na root. K root se dostaneš pomocí *node. Editací této proměnné upravuješ zároveň proměnnou root. Proto ti po zániku lokální proměnné node zůstanou všechna data v pořádku až do smazání tree->root.
Whew, jestli jsi to dočetl až sem, máš u mě palec hore!