относительно:
treeInsert(&root);
необходимость в &
обусловлена тем, что функции: treeInsert()
необходимо будет изменить содержимое указателя. Без &
любое присвоение этому переданному параметру изменит только параметр в стеке вызовов, а не содержимое параметра в main()
относительно:
tree *root = NULL;
Поскольку tree
уже является указателем, это приводит к (эффективно)
tree ** root = NULL;
, которое не выполнит sh того, что необходимо.
Яркий пример того, почему указатель НЕ должен быть скрытый в операторе typedef
следующий предлагаемый код ясно говорит о том, что требуется:
struct sTree
{
int key;
struct sTree* p;
struct sTree* left;
struct sTree* right;
};
typedef struct sTree tree;
void treeInsert(tree** root);
int main( void )
{
srand((unsigned)time(NULL));
tree *root = NULL;
treeInsert(&root);
return 0;
}
void treeInsert(tree** root)
{
tree *localroot = *root; // now 'localroot' is a pointer to the variable `root` in function: `main()`
......
}