в чем разница между созданием head и n в коде

#c #list #struct

#c #Список #структура

Вопрос:

В этом коде объект head создается прямо перед определением структуры, но n создается в int main.

Можем ли мы просто объявить оба способа, которыми был объявлен head? Я думаю, я просто не понимаю, чем struct node *n это отличается от способа объявления head, потому что они оба являются объектами, верно?

   struct node
    {
        int data;
        struct node *next;
    }*head;
    .
    .
    .
    int  main()
    {
        int i,num;
        struct node *n;
        head = NULL;
        ...
  

Комментарии:

1. » они оба являются объектами, верно? » — head и n оба обозначают «объекты» в смысле этого термина в стандарте C, но так же делают i и num обозначают объекты в этом смысле. Я думаю, вы можете подразумевать «объекты» в более ОО смысле, который приравнивается к «структурам», но здесь вы должны быть осторожны: это *head и *n , которые обозначают структуры; head и n обозначают не структуры, а указатели , которые сами по себе являются отдельными, независимыми объектами (в смысле C).

Ответ №1:

В вашем коде вы смешиваете объявление struct node и объявление переменной head , что соответствует C, но TBH не очень читаемо.

Напишите свой код примерно так:

 struct node
{
    int data;
    struct node *next;
};                   // declaration of struct node

.
.
struct node *head;   //declaration of a variable head of type "pointer to struct node"
.
.
.
int  main()
{
    int i,num;
    struct node *n;   //declaration of a local variable n of type "pointer to struct node"
    head = NULL;
    ...
  

Это эквивалентно вашему коду, но более читабельно.

Ответ №2:

«head» — это глобальный указатель, где в качестве «n» используется локальный указатель на структуру узла.

Также обратите внимание, что ни «head», ни «n» не являются объектами. Они являются указателями на объекты структуры узла. Вам нужно выделить память для них.