Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C] Cast e doppi puntatori

    Ciao a tutti,

    sto usando le librerie winsock2.lib ma ho un problema un pezzo di codice (funzionante) che pero non riesco bene a comprendere...
    Codice PHP:
    struct hostent *str// questa riga dichiara una struct di tipo hostent che è così fatta:

    typedef struct hostent {
      
    char FARh_name;
      
    char FAR  FAR** h_aliases;
      
    short h_addrtype;
      
    short h_length;
      
    char FAR  FAR** h_addr_list;// qua ci dovrebbe essre la lista di indirizzi IP dell host locale
    hostent
    l istruzione

    Codice PHP:
    str=gethostbyname(""); 
    mette nella struttura puntata da str le informazioni relative all host locale... fin qui tutto bene....

    ma cio che non mi capisco sta in questa istruzione:

    Codice PHP:
    printf("%s\n",inet_ntoa(*(struct in_addr *)*str->h_addr_list)); 
    che stampa a video l indirizzo IP del PC locale.

    La funzione inet_ntoa è definita così

    Codice PHP:
    charFAR inet_ntoa(
      
    struct   in_addr in
    ); 
    ora qualcuno mi spiega questa serie di puntamenti e casting??

    Codice PHP:
     *(struct in_addr *)*str->h_addr_list 
    Grazie!





  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Cosi' ti e' piu' chiaro ?

    codice:
    char **x1 = str->h_addr_list;
    
    char *x2 = *str->h_addr_list;
    
    struct in_addr *x3 = (struct in_addr *)x2;
    
    struct in_addr x4 = *x3;
    
    printf("%s\n",inet_ntoa(x4));

  3. #3
    Originariamente inviato da oregon
    Cosi' ti e' piu' chiaro ?

    codice:
    char **x1 = str->h_addr_list;
    
    char *x2 = *str->h_addr_list;
    
    struct in_addr *x3 = (struct in_addr *)x2;
    
    struct in_addr x4 = *x3;
    
    printf("%s\n",inet_ntoa(x4));
    Si decisamente.... thanks! però correggimi se sbaglio:

    char **x1 = str->h_addr_list; x1 e un doppio puntatore a char e quindi lo inizializzo con str->h_addr_list

    char *x2 è un puntatore a carattere, quindi per inizializzarlo devo deferire ( si dice cosi no?) str->h_addr_list e quindi pongo un * davanti a str...

    struct in_addr *x3; definisco un puntatore x3 a una struttura di tipo in_addr...

    (struct in_addr *)x2; questo se non erro dovrebbe essere il casting del puntatore x2 (che puntava a char) alla struttura di tipi in_addr....

    struct in_addr x4 = *x3; dichiaro la struttura x4 di tipi in_addr e ci metto il valore puntato da *x3....

    Spero di aver capito!


  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Originariamente inviato da UltraBeginner
    Si decisamente.... thanks! però correggimi se sbaglio:

    char **x1 = str->h_addr_list; x1 e un doppio puntatore a char e quindi lo inizializzo con str->h_addr_list

    char *x2 è un puntatore a carattere, quindi per inizializzarlo devo deferire ( si dice cosi no?) str->h_addr_list e quindi pongo un * davanti a str...

    struct in_addr *x3; definisco un puntatore x3 a una struttura di tipo in_addr...

    (struct in_addr *)x2; questo se non erro dovrebbe essere il casting del puntatore x2 (che puntava a char) alla struttura di tipi in_addr....

    struct in_addr x4 = *x3; dichiaro la struttura x4 di tipi in_addr e ci metto il valore puntato da *x3....

    Spero di aver capito!

    Sì ...


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.