#c #linked-list #typedef
#c #связанный список #typedef
Вопрос:
Я путаюсь с typedef, кто-нибудь может переписать это в обычную композицию? структур? Я действительно не хочу обрабатывать typedef, так как это сбивает меня с толку
struct stackNode
{
int data;
struct stackNode *nxtptr;
};
typedef struct stackNode StackNode;
typedef StackNode *StackNodePtr;
является
typedef struct stackNode StackNode;
это то же самое, что struct stackNode StackNode
и typedef StackNode *StackNodePtr;
совпадает с struck stackNode *StackNodePtr
??
Ответ №1:
Если вы не хотите использовать typedef
, вы всегда можете использовать полное имя типа:
Вместо:
StackNode sn;
Вы бы использовали:
struct stackNode sn;
Вместо:
StackNodePtr snp;
Вы бы использовали:
struct stackNode *snp;
Объявления точно такие же.
Комментарии:
1. soo typedef struct StackNode StackNode; будет ли struct StackNode StackNode структурой StackNode? и typedef StackNode *StackNodePtr; будет struct StackNode * StackNodePtr; я прав?
2. Помните: с помощью
typedef
вы только создаете / определяете / переименовываете новые типы , а не новые переменные.3. @PabloSantaCruz вернее, новые имена типов.
Ответ №2:
Более распространенным способом написания того же самого было бы:
typedef struct stackNode
{
int data;
struct stackNode *nxtptr;
} StackNode_t;
где stackNode
— так называемый «тег структуры», а StackNode_t
— фактическое имя типа. Если вы объявляете структуры подобным образом, остальной части программы не нужно будет обращаться к тегу struct, и вы можете использовать nxtptr, как если бы он был StackNode_t .
Ответ №3:
typedef struct stackNode { int data; struct stackNode *nxtptr; } StackNode_t;
Если вы не хотите иметь «struct StackNode» внутри структуры, я обнаружил, что могу это сделать:
typedef struct STACKNODE STACKNODE;
typedef struct STACKNODE
{
int data;
STACKNODE *nxtptr;
};
То, что вы могли бы закодировать такую вещь, И она просто отлично компилируется и работает просто отлично, может показаться нелогичным. Это может показаться нелогичным, потому что я использую одно и то же имя для struct STACKNODE и typedef STACKNODE. И, кроме того, я определяю структуру до того, как она будет существовать как определение. Тем не менее, я обнаружил, что могу сделать это с Microsoft C во многих версиях до сегодняшнего дня и Borland C (тогда еще).
Мне это нравится, потому что, если я уже собираюсь ввести структуру, мне не нравится прибегать к «struct STACKNODE * nxtptr» структуры (т. Е. использовать слово «struct») внутри определения структуры.
Комментарии:
1. Я думаю, что это в значительной степени два варианта, которые я нашел для использования typedef со связанным списком. 1
2. На самом деле вам не следует использовать a
typedef
без имени, поэтому второй оператор должен быть простоstruct STACKNODE { … };
(опускаяtypedef
). В нынешнем виде у вас есть пустотаtypedef
, и некоторые компиляторы предупредят об этом. Лично я бы не стал использовать все заглавные буквы для имени; я оставляю все заглавные буквы для макросов и констант перечисления.
Ответ №4:
С помощью typedef вы определяете, что StackNode должен быть struct StackNode, а указатель StackNodePtr должен быть StackNode.
Итак, что не ясно?
Ответ №5:
Ну, чтобы объяснить это легко: Typedef практически ничего не делает, кроме как сообщать компилятору, что вы создаете новый тип переменных (такой как int, char и т.д.)
Основными причинами использования typedef являются
- Мнемонические имена. Это также часто используется в библиотечных функциях. Вместо использования стандартного типа, такого как int или long, вы можете просто ввести его в size_t. Так понятнее, для чего используется эта переменная.
- Сокращение имен. Обычно используется для таких вещей, как структуры (это было бы в вашем случае). Чтобы избежать необходимости всегда вводить struct MyStruct varname, вы можете легко использовать typedef, чтобы избавиться от структуры впереди.
Ответ №6:
посмотрим, typedef
поможет ли. Больше похоже на 101. Раздел, озаглавленный «Проблемы с использованием», может дать некоторое представление о ваших, э-э, проблемах.