Capire typedef e stamparlo

di il
5 risposte

Capire typedef e stamparlo

Ciao a tutti, sto studiando il C e cercando di capire come implementare una coda. Vi scrivo il codice:

Creo una struttura di tipo struct queueNode

struct queueNode
{
    char data;
    struct queueNode *nextPtr; 
};

typedef struct queueNode QueueNode; 
typedef QueueNode *QueueNodePtr; 

La prima domanda è:
Cosa fa precisamente typedef struct queueNode QueueNode; ? da quello che ho capito, crea solamente un sinonimo per queueNode, ossia creo una variabile QueueNode di tipo struct queueNode. Quindi invece di chiamare struct queueNode (quando necessario) chiamo semplicemente QueueNode senza ripetere "struct" e inoltre QueueNode è come se diventasse un "tipo" (come int o char) creato da me. E' corretto? Serve solo a questo utilizzare la keyword "typedef"?

typedef QueueNode *QueueNodePtr; Questo dovrebbe creare un puntatore chiamato QueueNodePtr di tipo struct QueueNode. Giusto?

Per la seconda domanda, vi allego un altro pezzetto di codice:

La funzione che inserisce un elemento:

void enqueue( QueueNodePtr *headPtr, QueueNodePtr *tailPtr, char value)
{

    QueueNodePtr newPtr;
    newPtr = malloc( sizeof(QueueNode));

    if( newPtr != NULL)
    {

        newPtr->data = value;  
        newPtr->nextPtr = NULL; 

        printf("Il valore di *headPtr e': %c\n",  *headPtr); // Questo e' il secondo problema. 
        
     // Codice ...
     }

}

Piccolo frammento di main:

int main(void)
{
    QueueNodePtr headPtr = NULL; 
    QueueNodePtr tailPtr = NULL;
    int choice;
    char item;

// Altro codice ...

return 0;
}

La domanda quindi e': Come faccio a stampare il valore puntato da "headPtr" ? Dovrebbe essere NULL vero (come impostato da main) ? Il compilatore mi dice:
warning: format ‘%c’ expects argument of type ‘int’, but argument 2 has type ‘QueueNodePtr’ [-Wformat=]
printf("Il valore di *headPtr e': %c\n", *headPtr);
^
In teoria headPtr dovrebbe essere un puntatore di tipo struct QueueNode, corretto?

Lo stesso codice è riportato sul libro Deitel&Deitel (sto studiando lì), non è il mio.

Grazie della disponibilità e scusate se mi sono dilungato.

5 Risposte

  • Re: Capire typedef e stamparlo

    La typedef serve proprio a "DEFinire un nuovo TYPE (tipo) di dati". Quindi QueueNode NON è una variabile ma un nuovo tipo di dato (equivalente ad una struct queueNode). Anche QueueNodePtr è un nuovo tipo di dato, esattamente un puntatore alla struttura in questione.

    I tipi di dati sono utilissimi per la chiarezza del codice ...

    La seconda questione non l'ho capita ... cosa intendi fare con una printf %d della struttura ? %c serve a visualizzare un carattere, ma a quale carattere ti riferisci ?
  • Re: Capire typedef e stamparlo

    Se vuoi l'indirizzo a cui punta il puntatore, prova ad utilizzare %p come placeholder nella printf, senza de-referenziare il puntatore.
    se vuoi il suo contenuto, ti basta usare un %c de-referenziando il puntatore.
    l'indirizzo NULL potrebbe variare a seconda del compilatore, alcuni lo interpretano come 0x00000000 e altri 0xFFFFFFFF (non so a cosa sia dovuta questa differenza).
  • Re: Capire typedef e stamparlo

    Grazie delle risposte, ho ancora bisogno di chiarimenti.
    La typedef serve proprio a "DEFinire un nuovo TYPE (tipo) di dati". Quindi QueueNode NON è una variabile ma un nuovo tipo di dato (equivalente ad una struct queueNode). Anche QueueNodePtr è un nuovo tipo di dato, esattamente un puntatore alla struttura in questione.
    Quindi QueueNode è un tipo di dato struttura come queueNode mentre QueueNodePtr è un puntatore alla struttura QueueNode. La domanda che mi viene in mente a questo punto è: Perchè ho bisogno di 2 strutture (queueNode e QueueNode) quando posso utilizzarne solo una? (non è una spreco di memoria ?)

    La seconda questione non l'ho capita ... cosa intendi fare con una printf %d della struttura ? %c serve a visualizzare un carattere, ma a quale carattere ti riferisci ?
    Io vorrei stampare il contenuto di "headPtr". Visto che è un puntatore vorrei stampare il suo valore, che appunto dovrebbe essere NULL ma vorrei
    vederlo sulla shell.
    se vuoi il suo contenuto, ti basta usare un %c de-referenziando il puntatore.
    Io so che l'operatore di de-referenziazione è " * " e serve per accedere al contenuto di un'area di memoria. Quindi se x è un indirizzo di memoria, *x è il valore contenuto nell'area di memoria con indirizzo x.

    Quindi non va bene così ? (come avevo già scritto?)
    printf("Il valore di *headPtr e': %c\n",  *headPtr);
    Grazie ancora.
  • Re: Capire typedef e stamparlo

    Escher ha scritto:


    La domanda che mi viene in mente a questo punto è: Perchè ho bisogno di 2 strutture (queueNode e QueueNode) quando posso utilizzarne solo una? (non è una spreco di memoria ?)
    No, non hai capito. La memoria non c'entra nulla. NON sono variabili che usano memoria, come non lo è int o char. E' solo un tipo di dato.

    Se dovessi scrivere

    struct queueNode var1;
    struct queueNode var2;
    struct queueNode var3;
    struct queueNode var4;

    potresti scrivere

    QueueNode var1;
    QueueNode var2;
    QueueNode var3;
    QueueNode var4;
    Io vorrei stampare il contenuto di "headPtr". Visto che è un puntatore vorrei stampare il suo valore, che appunto dovrebbe essere NULL ma vorrei vederlo sulla shell.
    headPtr è un doppio puntatore. Per vedere il suo valore del puntatore puntato dovrai usare %p nella printf, quindi
    printf("Il valore di *headPtr e': %p\n",  *headPtr);
  • Re: Capire typedef e stamparlo

    Grazie mille ho capito.
Devi accedere o registrarti per scrivere nel forum
5 risposte