Puntatore ad array (puntatore a riga)

di il
42 risposte

42 Risposte - Pagina 2

  • Re: Puntatore ad array (puntatore a riga)

    oregon ha scritto:


    Autodidatta ha scritto:


    una mancata comprensione
    Cioè, tu non capisci perché esistano e a cosa servano i puntatori in C .. corretto?
    ... non è possibile accedere agli elementi dell'array puntato tramite la dereferenziazione del puntatore stesso
    Come no? Puoi accedere a qualsiasi elemento tramite il puntatore all'array ...
    né è possibile inizializzare un altro array dereferenziando l'array puntato da vett.
    Devi copiare elemento per elemento, con un ciclo o con la memcpy ...

    Probabilmente devi studiare meglio l'argomento puntatori senza dare "sentenze" definitive sulla loro utilità ...
    Se sbaglio sei libero di correggermi, ma forse quello che non ha capito sei tu. Non sto mica dubitando dell'utilità dei puntatori, non riesco a capire a cosa servano un particolare tipo di puntatori, e, non vorrei sbagliare, ma forse tu non hai capito di quali puntatori io stia parlando. Parlo dei puntatori ad array, non dei puntatori al primo elemento dell'array, in pratica non parlo del puntatore la cui variabile contenitore è identificata dal nome dell'array, la quale è un putatore al primo elemento dell'array, ma della variabile puntatore ad array, che, nel caso l'array sia un costituito da 8 interi, si definisce come:
    int (*vett)[8]; //questo è un puntatore ad array
    Se ho un array:
    int arr[8];
    posso fare:
    vett = &arr;
    e vett punterà all'array arr, ma non al primo elemento dell'array.
  • Re: Puntatore ad array (puntatore a riga)

    E se fai malloc cosa ottieni?
  • Re: Puntatore ad array (puntatore a riga)

    vbextreme ha scritto:


    e se fai malloc cosa ottieni?
    Uso il C++, faccio new. new restituisce un puntatore.
  • Re: Puntatore ad array (puntatore a riga)

    Altra domanina, strettamente correlata con quetta di vbextreme, cosa fa questo codice?
    
    int *arr = (int*)malloc(8*sizeof(int));
    int **vett = &arr;
    
    Che relazione ha con il tuo codice?
  • Re: Puntatore ad array (puntatore a riga)

    Autodidatta ha scritto:


    un particolare tipo di puntatori
    Cominciamo da qui ... in C non esiste "un particolare tipo di puntatori". Il concetto di puntatore è unico.
    Parlo dei puntatori ad array, non dei puntatori al primo elemento dell'array
    Ancora tu non hai capito che questa differenza non c'è. Un puntatore è un puntatore.
    Se ho un array ...
    ... che è come scrivere

    int *p;

    p = arr;

    Due modi diversi di fare la stessa cosa ... quindi? Perché dici con certezza

    non è possibile accedere agli elementi dell'array puntato

    (era questa la "sentenza" a cui mi riferivo ...)
  • Re: Puntatore ad array (puntatore a riga)

    oregon ha scritto:


    Autodidatta ha scritto:


    un particolare tipo di puntatori
    Cominciamo da qui ... in C non esiste "un particolare tipo di puntatori". Il concetto di puntatore è unico.
    Parlo dei puntatori ad array, non dei puntatori al primo elemento dell'array
    Ancora tu non hai capito che questa differenza non c'è. Un puntatore è un puntatore.
    Se ho un array ...
    ... che è come scrivere

    int *p;

    p = arr;

    Due modi diversi di fare la stessa cosa ... quindi? Perché dici con certezza

    non è possibile accedere agli elementi dell'array puntato

    (era questa la "sentenza" a cui mi riferivo ...)
    Il concetto di puntatore è unico, ma non l'utilizzo. Quello che mi sfugge è l'utilizzo del puntatore ad array. Ripeto, l'utilizzo del puntatore ad array, non l'utilizzo del puntatore al primo elemento dell'array. L'esempio che hai fatto tu non è pertinente, il tuo arr è un puntatore a intero, dato che l'array è costituito da interi.
  • Re: Puntatore ad array (puntatore a riga)

    migliorabile ha scritto:


    Altra domanina, strettamente correlata con quetta di vbextreme, cosa fa questo codice?
    
    int *arr = (int*)malloc(8*sizeof(int));
    int **vett = &arr;
    
    Che relazione ha con il tuo codice?
    Non mi ricordo malloc, se la puoi scrivere con new mi fai un piacere.
  • Re: Puntatore ad array (puntatore a riga)

    Autodidatta ha scritto:


    Il concetto di puntatore è unico, ma non l'utilizzo.
    ???
    Quello che mi sfugge è l'utilizzo del puntatore ad array.
    Lo utilizzi per accedere a qualsiasi elemento dell'array ... continuo a non capire ...
    Ripeto, l'utilizzo del puntatore ad array,
    Ripeto, lo utilizzi per accedere a qualsiasi elemento dell'array, dal primo all'ultimo.
    L'esempio che hai fatto tu non è pertinente,
    E perché mai?
    il tuo arr è un puntatore a intero, dato che l'array è costituito da interi.
    Il tuo punt non lo era?
  • Re: Puntatore ad array (puntatore a riga)

    oregon ha scritto:


    Autodidatta ha scritto:


    Il concetto di puntatore è unico, ma non l'utilizzo.
    ???
    Quello che mi sfugge è l'utilizzo del puntatore ad array.
    Lo utilizzi per accedere a qualsiasi elemento dell'array ... continuo a non capire ...
    Ripeto, l'utilizzo del puntatore ad array,
    Ripeto, lo utilizzi per accedere a qualsiasi elemento dell'array, dal primo all'ultimo.
    L'esempio che hai fatto tu non è pertinente,
    E perché mai?
    il tuo arr è un puntatore a intero, dato che l'array è costituito da interi.
    Il tuo punt non lo era?
    Allora, fai una cosa, scrivi questo programma:
    int arr[3] = {1, 2, 3};
    int (*vett)[3];
    vett = &arr;
    cout << vett[1] << endl;
    Compilalo (e la compilazione andrà a buon fine) ed eseguilo. Vedrai che la stampa a schermo non darà 2. Non accedi agli elementi dell'array col puntatore ad array.
  • Re: Puntatore ad array (puntatore a riga)

    Dovrai scrivere

    cout << (*vett)[1] << endl;

    oppure così

    cout << *((int *)vett+1) << endl;
  • Re: Puntatore ad array (puntatore a riga)

    migliorabile ha scritto:


    Altra domanina, strettamente correlata con quetta di vbextreme, cosa fa questo codice?
    
    int *arr = (int*)malloc(8*sizeof(int));
    int **vett = &arr;
    
    Che relazione ha con il tuo codice?
    arr è un puntatore a int, vett è un puntatore a puntatore a int. arr punta all'elemento (cioè il valore contenuto da arr è l'indirizzo del primo elemento allocato nella memoria libera, e tale elemento è un intero), e il valore contenuto da vett è l'indirizzo di arr. Non capisco cosa c'entri tutto questo con l'argomento di cui sto parlando.
  • Re: Puntatore ad array (puntatore a riga)

    oregon ha scritto:


    Dovrai scrivere

    cout << (*vett)[1] << endl;

    oppure così

    cout << *((int *)vett+1) << endl;
    Ah ok, così funziona, quindi si può accedere agli elementi dell'array. Ed esiste pure una sintassi per inizializzare un array tramite la dereferenziazione di un puntatore ad array? Altrimenti continuo a non capirne l'utilità, visto che l'accesso agli elementi dell'array si può fare col puntatore al primo elemento ed è anche più semplice.
  • Re: Puntatore ad array (puntatore a riga)

    Autodidatta ha scritto:


    Ah ok, così funziona
    quindi si può accedere agli elementi dell'array.
    Come ti dicevo, un puntatore è un puntatore ...

    Tu stai facendo solo un po' di confusione sulla priorità ....

    Se scrivi

    vett[1]

    dato che vett è un puntatore, non fai altro che fare riferimento al "prossimo puntatore" ovvero all'indirizzo del secondo elemento del vettore.

    Quindi non è che "in quel modo funziona" e non è più complesso ... quella è la sintassi corretta ...
    Non so come fartelo capire meglio ma non c'è un "puntatore al primo elemento" e "un altro puntatore ... anche vett è un puntatore al primo elemento e lo vedi se scrivi

    cout << (*vett)[0] << endl;
    oppure
    cout << *((int *)vett) << endl;

    Per l'inizializzazione, non mi è chiaro cosa intendi ... prova con un codice usando il puntatore al primo elemento ...
  • Re: Puntatore ad array (puntatore a riga)

    oregon ha scritto:


    Autodidatta ha scritto:


    Ah ok, così funziona
    quindi si può accedere agli elementi dell'array.
    Come ti dicevo, un puntatore è un puntatore ...

    Tu stai facendo solo un po' di confusione sulla priorità ....

    Se scrivi

    vett[1]

    dato che vett è un puntatore, non fai altro che fare riferimento al "prossimo puntatore" ovvero all'indirizzo del secondo elemento del vettore.

    Quindi non è che "in quel modo funziona" e non è più complesso ... quella è la sintassi corretta ...
    Non so come fartelo capire meglio ma non c'è un "puntatore al primo elemento" e "un altro puntatore ... anche vett è un puntatore al primo elemento e lo vedi se scrivi

    cout << (*vett)[0] << endl;
    oppure
    cout << *((int *)vett) << endl;

    Per l'inizializzazione, non mi è chiaro cosa intendi ... prova con un codice usando il puntatore al primo elemento ...
    Non mi sembra così lineare la cosa, dato che l'inizializzazione non la faccio facendo
    *vett = &arr;
    ma la faccio così:
    vett = &arr;
    Quindi presumevo che la variabile fosse identificata da vett e non da *vett. D'altronde, rifacendomi al codice di prima, se definisco un nuovo array:
    int prova[3] = *vett;
    il compilatore mi dà errore, ma se seguissi il ragionamento valido per i puntatori dovrei inizializzare l'array prova.
  • Re: Puntatore ad array (puntatore a riga)

    L'inizializzazione di un vettore la puoi fare solo indicando i valori tra parentesi { } come hai fatto in

    int arr[3] = {1, 2, 3};

    Non so come tu voglia inizializzare un array del tipo

    int prova[3] = ....

    con dei puntatori al posto dei puntini ...
Devi accedere o registrarti per scrivere nel forum
42 risposte