Страницы

Поиск по вопросам

четверг, 12 декабря 2019 г.

Объясните этот синтаксис пожалуйста

#c #структуры


Нет, правда. Поверхностно я знаю C но это... новый синтаксис C99 наверное:

struct node {
    int payload;
    int height;
    struct node *kid[2];
} dummy = {0, 0, {&dummy, &dummy}}, *nnil = &dummy;
// internally, nnil is the new nul


Что вот это значит?:


Создать тип struct node node (оказывается имя типа всё-таки struct node) 
typedef struct node dumy Оказывается: объявить (глобальную?) переменную dummy содержащую
помимо прочего массив состоящий из двух указателей на саму себя
, => node* nnil = опять указатель на эту dummy


Я прав? Это шо за синтаксис такой? C99? (смайлик "я в ужасе")
    


Ответы

Ответ 1



struct node { Объявили структуру } dummy Создали переменную типа struct node = {0, 0, Первые два поля переменной dummy - нули (dummy.payload = dummy.height = 0) {&dummy, &dummy}} Элементам массива kid (указателям) присвоили адреса переменной dummy (dummy.kid[0] = dummy.kid[1] = &dummy) , *nnil Создали ещё одну переменную - указатель на переменную типа struct dummy = &dummy; Присвоили ей адрес переменной dummy Всё, никаких хитростей, чистый C безо всяких наворотов.

Ответ 2



В этой конструкции сразу же объявляется структура, объект этой структуры и указатель на объект этой структуры. Чтобы это объявление struct node { int payload; int height; struct node *kid[2]; } dummy = {0, 0, {&dummy, &dummy}}, *nnil = &dummy; было более понятным, вы можете его разбить на несколько объявлений. Исходное объявление эквивалентно следующим объявлениям. struct node { int payload; int height; struct node *kid[2]; }; struct node dummy = {0, 0, {&dummy, &dummy}}; struct node *nnil = &dummy; То есть объявляется структура с именем struct node. Затем объявляется объект этой структуры с именем dummy и его поля, как объекта структуры, инициализируются соответствующими значениями. Чтобы это объявление было еще более понятным, вы можете даже его переписать в C99 как struct node dummy = { .payload = 0, .height = 0, .kid = { [0] = &dummy, [1] = &dummy }}; В этом объявлении объекта dummy его член данных kid, который представляет собой массив указателей, инициализируется адресом самого объекта dummy. И, наконец, в третьем объявлении объявляется указатель с именем nnil на объект dummy

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

Отправить комментарий