Прежде всего элемента данных с именем next
в структуре
struct name
{
int example;
name *next;
};
и переменную с тем же именем объявленной после того, как структуры, как, например
struct name *next = NULL;
две разные сущности.
Последнее объявление не инициализирует NULL элемент данных любого объекта структуры. Он объявляет указатель на объект типа структуры.
Теперь о разнице между этими двумя декларациями
struct name *next = NULL;
и
name *next = NULL;
В первом есть используются так называемым разработано название struct name
типа. Его преимущество по сравнению со вторым объявлением заключается в том, что любой объект, счетчик или функция, объявленные с тем же именем name
, скрывают объявление структуры. Например
struct name
{
int example;
name *next;
};
enum { name, noname };
Здесь Перечислитель name
скрывает тип struct name
данных и если вы пишете, например
name *next = NULL;
, то компилятор выдаст сообщение об ошибке.
Но если вы будете использовать разработанное имя
struct name *next = NULL;
затем код компилируется успешно, потому что компилятор теперь знает, что name
в этой декларации struct name
.
Другая важная разница.
Рассмотрим следующий фрагмент кода
int main()
{
struct name
{
int example;
name *next;
};
{
name *next = NULL;
}
}
В этом проножки объявление во внутреннем блоке кода декларирует указатель типа Struture объявленной во внешнем блоке кода.
Теперь переписать программу
int main()
{
struct name
{
int example;
name *next;
};
{
struct name *next = NULL;
}
}
В этом случае заявление во внутреннем блоке коды представляет нового типа struct name
, скрывающее объявление структуры во внешнем блоке коды.
Хорошо, спасибо! –
@DianaPapukchieva было бы полезно для всех, если бы вы пошли дальше и прочитали вводный учебник по C++. Это, пожалуй, одна из первых вещей, которую хороший гид упоминает при объяснении классов. Нет необходимости спрашивать его (еще один раз) о переполнении стека. –
Необязательный вообще при объявлении. – Puppy