Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 18 su 18

Discussione: benedetti puntatori

  1. #11
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da roldo
    Continua lo scioglilingua sui puntatori ...e alla fine si è in dubbio su un po' di cose.

    char *A ; // è un puntatore

    char **B = &A ; // è un puntatore di un puntatore

    char ***C = &B ; // è un puntatore di un puntatore di un puntatore

    Char ****D = &C ; // è un puntatore di un puntatore di un puntatore di un puntatore

    E cosi all' infinito ?
    Sì ... e quindi? C'è la possibilità di farlo ma raramente serve. In ogni caso, non vedo nessun problema.

    insomma con espressioni strane , mi sembra.....
    Strane? Il C è un linguaggio con delle precise regole, non c'è nulla di strano, basta seguirle.

    I puntatori sono molto semplici da capire ed usare. Ciò che viene usato dal punto di vista didattico è banale ... basta solo non complicarsi la vita e soffermarsi sulle basi e le situazioni più semplici.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  2. #12
    Un array non è né un puntatore né un puntatore costante, è un array (se fosse un puntatore sizeof applicato ad un array fornirebbe le dimensioni di un puntatore invece di quelle dell'array).
    Il punto è che il nome dell'array decade in un puntatore al suo primo elemento in un gran numero di circostanze (operatore di indicizzazione, passaggio a funzione e in generale ogni situazione in cui può avvenire il cast implicito), e così pure i puntatori ad array.
    Qui trovi praticamente tutto quello che puoi voler sapere sugli array (e anche un po' di più).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #13
    Scusate se non l 'ho ribadito, ma intendevo dal punto di vista della grammatica del linguaggio. Quando dichiaro un array di 5 elementi, in linea di massima il compilatore fa così :
    1)crea il puntatore costante
    2)"pusha "gli elementi sullo stack
    3)assegna al puntatore l indirizzo al primo elemento

    Siccome poi non è un puntatore come tutti gli altri, il compilatore nella sua tabella si annota anche la quantità di variabili allocata, da restituire con sizeof. E soprattutto vuole che venga passato alle funzioni con l 'operatore [] e non *

  4. #14
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    codice:
    int* a[5];
    A livelo grammaticale a è un token, un identificatore.
    A livello semantico è un vettore di puntatori.
    E non c'è niente da fare, è così.

    Mi dispiace contraddirti...ma un vettore è un puntatore.

    int a[3];

    a è un puntatore.

    Il fatto che non sia assegnabile è che, in questo esempio, il compilatore lo considera come un const int*. Ma è un puntatore. Se scrivi in C++:

    cout << a;

    non ti stamperà il vettore m un numeraccio esadecimale che non è altro che l'indirizzo in memoria a cui punta.
    Secondo questa logica:

    codice:
    int a;
    cout << &a;
    &a è un puntatore.Invece è un indirizzo, statico e inassegnabile.
    const int* non è un puntatore costante, è un puntatore a const int.
    Se tu hai:

    codice:
    const int* a;
    Questo significa che a può essere assegnato, tutti i valori puntati da a possono essere letti, ma non possono essere scritti.
    L' istruzione a++ è corretta, mentre se a fosse un vettore :

    codice:
    int a[5];
    L' istruzione a++ sarebbe vietata.

    Per cui un vettore di puntatori non è un puntatore a puntatore, e continuare a negarlo sarebbe un' arrampicata sugli specchi.
    Tutte le cose dichiarate con le parentesi [] sono vettori.

    codice:
    char* a[]={(char*)"ciao",(char*)"ehi",(char*)"!"};
    char* b[]={(char*)"ehi"};
    const char* c;
    c++;   // legale
    a++; //  illegale

  5. #15
    Originariamente inviato da ardito86
    Scusate se non l 'ho ribadito, ma intendevo dal punto di vista della grammatica del linguaggio. Quando dichiaro un array di 5 elementi, in linea di massima il compilatore fa così :
    1)crea il puntatore costante
    2)"pusha "gli elementi sullo stack
    3)assegna al puntatore l indirizzo al primo elemento
    Quindi non dal punto di vista della grammatica (che dice che è un array), ma dell'implementazione.
    Siccome poi non è un puntatore come tutti gli altri, il compilatore nella sua tabella si annota anche la quantità di variabili allocata, da restituire con sizeof.
    Tu stai dicendo che "è un puntatore" con mille eccezioni... e guarda caso, queste eccezioni saltano fuori perché non è un puntatore. I casi in cui tu lo usi come un puntatore sono i casi in cui decade ad un puntatore al suo primo elemento, come specificato a §6.3.2.1 ¶3 dello standard C99:
    Except when it is the operand of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue.
    E soprattutto vuole che venga passato alle funzioni con l 'operatore [] e non *
    Questa è una sciocchezza, quando in un parametro di funzione tu scrivi
    codice:
    int arr[]
    o addirittura
    codice:
    int arr[10]
    questo viene inteso come
    codice:
    int * arr
    infatti
    A declaration of a parameter as ‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’, where the type qualifiers (if any) are those specified within the [ and ] of the array type derivation.
    (C99, §6.7.5.3 ¶7)
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #16
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da ardito86
    E soprattutto vuole che venga passato alle funzioni con l 'operatore [] e non *
    Questa non l'ho proprio capita ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #17
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    56
    Mi aspettavo qualche dubbio.....

    Tornando al mio codice iniziale : perchè debbo usare B[0] o C[1] o D[2] invece di B o C o D
    per stampare la stringa puntata da A visto che sono tutti puntatori e non vettori di puntatori ?


    codice:
                  #include <stdio.h>
                 #include <string.h>
                 #include <stdlib.h>
    
                int main(void) {        
             
            
        char *P[100] = {"gennaio", "febbraio",
                        "marzo", "aprile",
                        "", ""};
    
    
        char *A ;
    
        A = P[3]  ;
    
        char **B = &A ;
    
        char ***C = &B ;
    
        char ****D = &C ; 
     
      
      
       printf("%s\n",  A);
    
      printf("%s\n",  B[0]);
    
      printf("%s\n",  C[1]);
    
      printf("%s\n",  D[2]);
    
    
     
    }

  8. #18
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466

    Moderazione

    Originariamente inviato da roldo
    benedetti puntatori
    Sorvolando sul titolo del tutto inadeguato (e manca il linguaggio come sempre), invito a non uscire dal problema centrale durante la discussione, e il problema deve essere molto specifico, altrimenti nasce un inutile "polpettone" che si arrotola su questioni abbastanza marginali riempiendo una discussione in cui si parla di tutto.

    Inoltre, determinate nozioni che riguardano le caratteristiche del linguaggio si approfondiscono sui libri, non sul forum.

    Invito ad aprire discussioni per problemi e/o argomenti precisi, con interventi che riguardino quelli senza deviare.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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 © 2025 vBulletin Solutions, Inc. All rights reserved.