Chiarimenti sui puntatori

di il
11 risposte

Chiarimenti sui puntatori

Nuovo del forum mi sono avvicinato da poco al c e sto giocherellando con i puntatori . 

argomento poco trattato in modo completo .

vorrei proporvi una domanda sui puntatori a vettori , ho capito che il nome di un vettore è un puntatore al  primo elemento del vettore se al nome antepongo il carattere & diventa un puntatore all intero vettore ora la mia domanda è dato un vettore 

int A[3]={0,1,2}

A è un puntatore al primo indirizzo contenente lo zero

se ad esso sommo 1 mi sposto di 4 byte l'indirizzo contenente l'uno .

&A è un puntatore sempre al primo indirizzo contenente lo zero 

se ad esso sommo 1         &A+1 vado 12 byte piu avanti ossia vado oltre la fine del su indicato vettore 

ora se io dichiaro un puntatore al vettore A          int *p=A     p punta all'indirizzo iniziale di A sommando uno a p posso avanzare di 4 byte in byte accedendo alle varie posizioni .

è possibile dichiarare un puntatore p all' intero vettore A  

p=&A     è errato 

11 Risposte

  • Re: Chiarimenti sui puntatori

    22/11/2024 - Deltone16v ha scritto:


    è possibile dichiarare un puntatore p all' intero vettore A  

    Cosa intendi? Non capisco cosa sia un puntatore a TUTTO l'array.

    Un puntatore punta ad un solo elemento, sia questo il primo o l'ultimo. Un puntatore è un singolo indirizzo.

    A equivale a &A[0]

  • Re: Chiarimenti sui puntatori

    Ciao non so i termini tecnici autodidatta mi spiego con un esempio:

    nel aritmetica dei puntatori il nome del vettore A è un puntatore all'indirizzo base del vettore A ed è uguale ad &A[0] 

    int *p=A oppure int *p=&A[0] fan si che p punti allo stesso indirizzo base del vettore 

    ora int *p=A+1  oppure int *p=&A[0]+1

    se aggiungo 1 ad entrambe le dichiarazione il puntatore p avanza di una posizione ossia puntano entrambi al indirizzo A[1]

    se io effettuo invece questa dichiarazione 

    int *p=&A     p punta sempre all'indirizzo base del vettore A ossia A[0] ma aggiungendo uno 

    int*p=&A+1 lo fa avanzare oltre la fine del vettore se un int è di 4 Byte edi il vettore è di tre elementi va all'indirizzo 12 bytes avanti fuori dall'vettore.

    quindi &A è un puntatore all'interovettore .

    ok quindi non vi è un modo per dichiare p per farlo puntare all'intero vettore dove inizialmente punta all'indirizzo base di A  (A[0]   p+1 lo fa saltare oltre l'uldimo indirizzo di A  

  • Re: Chiarimenti sui puntatori

    Nel frattempo che chiarisci i punti sollevati da @oregon ti riporto una mia vecchia risposta se ti può essere utile:

    https://www.iprogrammatori.it/forum-programmazione/cplusplus/problema-con-i-vettori-e-le-definizioni-di-tipo-in-c-t53806.html#p8719557

  • Re: Chiarimenti sui puntatori

    Forse intendevi questo:

    int (*p)[3] = &A;

    Ma ha senso solo quando lavori con le matrici, per accedere ai singoli vettori. 

  • Re: Chiarimenti sui puntatori

    Quello si anche quando sommi ad &A+1  esce dal vettore e non ha senso 

    volevo vedere se lo si può fare con una variabile dichiarata puntatore  come nell'esempio da te postato che salta di tre elementi alla volta aggiungendo uno 

    per capire le varie regole dell'aritmetica dei puntatori vado a tentativi non ho trovato un testo che li tratti dalla a alla z

  • Re: Chiarimenti sui puntatori

    22/11/2024 - Deltone16v ha scritto:

    ho capito che il nome di un vettore è un puntatore al  primo elemento del vettore

    Non sempre l'identificatore di un array decade a puntatore al suo primo elemento, alcune eccezioni sono per esempio quando viene passato come argomento all'operatore di indirizzo & o all'operatore sizeof.

    23/11/2024 - Deltone16v ha scritto:

    int A[3]={0,1,2}

    [...]

    se io effettuo invece questa dichiarazione 

    int *p=&A

    Con quest'ultima dichiarazione il compilatore dovrebbe darti errore o almeno un warning. 
    Per quanto detto sopra in riferimento all'operatore di indirizzo, in questo caso A non decade a puntatore al primo elemento, quindi il tipo adatto a contenere &A è un puntatore ad un array di tre interi, ossia int (*p)[3], come ti ha fatto notare @Alexv.

    23/11/2024 - Deltone16v ha scritto:

    Quello si anche quando sommi ad &A+1  esce dal vettore e non ha senso

    Cosa non avrebbe senso? Il salto in byte nell'aritmetica dei puntatori è dato dalla dimensione del tipo puntato:

    #include <stdio.h>
    
    int main()
    {
        int *p1;
        int (*p2)[3];
        printf("%u\n", sizeof(*p1));
        printf("%u\n", sizeof(*p2));
    }

    Output:

    4
    12
    
    Process returned 0 (0x0)
  • Re: Chiarimenti sui puntatori

    La frase non ha senso era riferita al concetto esposto da Alexv che giustamente faceva notare che un puntatore all'intero vettore ha senso solo se utilizzi matrici e devi saltare riga per riga io pensavo che vi era un modo per dichiarare un puntatore all'intero vettore ,anche come dicevo non ha senso addizionarci 1 per farlo finire ove non seve a nulla era per capire prchè &a lo si puo fare ad esempio stampare  ma se lo assegno a una variabile puntatore da errore int *p=&a non mi devono essere chiari i decadimenti come ad esempio perche (*p)[n col]      (*p) indica un intera riga

  • Re: Chiarimenti sui puntatori

    Int (*p)[ncol]  è come se dichiaro un vettore di nome p di vcol elementi int p[ncol] ma non è cosi 

  • Re: Chiarimenti sui puntatori

    Quindi ora è tutto chiaro o hai ancora qualche dubbio? Chiedo perché tra la mancanza di punteggiatura e il fatto che ti rispondi da solo non si capisce molto bene...

  • Re: Chiarimenti sui puntatori

    Si e no ho capito che sono due tipi diversi il motivo per cui il compilatore da errore 

  • Re: Chiarimenti sui puntatori

    Evidentemente l'operatore Address-of (cioè &), proprio come sizeof, restituisce informazioni sull'intero array quando usato su un identificatore array, e quindi un indirizzo da 4*3 byte, che non puoi assegnare a un puntatore a int (4 byte). Da notare, però, che l'espressione

    int *p = &A;

    in C++ da errore, mentre in C compila. Questo perché il C ha un controllo sui tipi (in particolare la conversione fra puntatori, cosa che avviene in questo caso) molto meno rigido. Il risultato ovviamente è in puntatore a int. 

Devi accedere o registrarti per scrivere nel forum
11 risposte