Почему мне нужно добавлять '&' при вызове функции - PullRequest
0 голосов
/ 07 мая 2020
 typedef struct sTree {
    int key;
    struct sTree* p;
    struct sTree* left;
    struct sTree* right;
} sTree;

typedef sTree* tree;

void treeInsert(tree* root);

int main(){
    srand((unsigned)time(NULL));
    tree *root = NULL;
    treeInsert(&root);
    return 0;
}

void treeInsert(tree* root){
    ......
}

Я не понимаю, почему я должен передавать '&' при вызове вставки дерева (& root вместо root). Я создал структуру, представляющую узел двоичного дерева, и объявил указатель на root дерева как «дерево *». Итак, «root» - двойной указатель. Функция treeInsert ожидает двойной указатель. Если я передаю просто «root», он принимает значение (NULL), иначе с оператором «&» он правильно указывает на root. Проблема в следующем: передавая '& root', я не передаю тройной указатель? Может кто-нибудь объяснить почему?

1 Ответ

0 голосов
/ 07 мая 2020

относительно:

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()`
    ......
}
...