#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
Комментариев нет:
Отправить комментарий