Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [c++] Array

  1. #1

    [c++] Array

    dato un ..array di array.. dichiarato cosi..
    int A[3][3];

    ho bisogno di inizializzarlo..
    non mi interessa farlo nelle classiche maniere
    lo voglio fare con l'aritmetica dei puntatori.
    --------------------------
    // CASO 1)

    for(int i=0; i<9; i++ ){
    *(A+i)=0;
    cout << i;
    }

    // errore di tipo.. ok!

    --------------------------
    // CASO 2)

    for(int i=0; i<9; i++ ){
    **(A+i)=0;
    cout << i;
    }

    //segmentation fault ! (subito) ???

    --------------------------
    // CASO 3)

    for(int i=0; i<9; i++ ){
    *(*A + i)=0;
    cout << i;
    }

    // funziona correttamente..

    ---------------------------

    perche' nel CASO 2 mi da subito segmentation fault
    e non mi stampa niente?
    mi aspettavo 012 e poi segmentation fault
    o almeno 0 e poi segmentation fault.

    ..quando i vale 0 questo *(*A)=0 e' lecito..
    al massimo qui *(*A+1)=0 iniziano i problemi.. ma anche no!
    perche' dovrebbe corrispondere alla prima cella del secondo array..

    qualcuno sa il motivo di questo comportamento, a mio parere, "un po' anomalo".. ??

    ..forse non ho ben capito come vengono allocati gli array bidimensionali in memoria.. e quindi applico l'aritmetica dei puntatori in maniera erronea..
    Pinguino a Catwoman:
    Non so cosa vuoi, ma sono certo di potertelo dare ..denaro? ..gioielli? ..un enorme gomitolo di lana..?

  2. #2
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    un puntatore a puntatore è semplicemente un puntatore che quando lo dereferenzi ti riferisci ad un altro puntatore, quindi da trattare come tale e per riferirsi al valore vero e proprio puntato bisogna dereferenziare ancora.

    Ecco un piccolo esempio:

    codice:
    #include <stdio.h>
    
    int main() {
    	int i, j;
    	char* test[3] = {"123", "123", "123"};
    	for(i = 0; i < 3; i++) {
    		for(j = 0; j < 3; j++) {
    			printf("%c", *((*(test + i)) + j));
    		}
    	}
    
    
    	return 0;
    }
    *((*(test + i)) + j)

    questa parte vuol dire, fai puntare test all'elemento i-esimo, dereferenzialo(con *, quindi da ora in poi ci riferiremo all'altro puntatore), sposta il secondo puntatore al j-esimo elemento.

    Quindi se vuoi riferirti al secondo carattere della seconda stringa devi fare: *((*(test + 1)) + 1)


    E' ciaro?
    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  3. #3
    ok l'esempio e' stato assimilato..

    non e' proprio un array di array ma ci assomiglia molto..

    forse adesso mi sono fatto lo schema logico giusto..

    ricapitolo un attimo..

    char A[2][3] ={ { 'a','b','c'} , {'d','e','f'} };

    i numeri sono degli ipotetici indirizzi di memoria..


    codice:
      100    101   102   103 104 105 106 107 108  <-indirizzi
    -[101]--[103]-[106]--[a]-[b]-[c]-[d]-[e]-[f]----steack--  
       |     ^ |    |     ^           ^
       |    /  |    |     |           |
       |---/   |    |-----|-----------|
               |          | 
               |----------|
    **A = a
    *(*A+1) = b
    **(A+1) = non funziona perche' da 101 non ci sono due puntatori da dereferenziare..

    ..tutto torna..!
    se c'è qualcosa che non è cosi fatemi sapere...


    P.S. viene tutto allocato sullo steack vero!?
    e non sullo heap!!!

    GRAZIE netarrow
    Pinguino a Catwoman:
    Non so cosa vuoi, ma sono certo di potertelo dare ..denaro? ..gioielli? ..un enorme gomitolo di lana..?

  4. #4
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    Originariamente inviato da gpiantel
    non e' proprio un array di array ma ci assomiglia molto..
    è un array di array, solo scritto in modo più chiaro, scrivere

    char A[3][5]

    vuole dire che A è un puntatore al primo dei tre elementi che a loro volta sono puntatori che puntano al primo dei cinque loro elementi, se scrivo

    char* A[3]

    è la stesso cosa, un puntatore alla prima di tre stringhe, stringhe che sono array di caratteri. Scrivere char* A[3] è più immediato da capire, un array di 3 elementi, che contiene stringhe.

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  5. #5
    si e' vero,
    ma non e' certo la stessa cosa perche' in un array bidimensionale char A[2][3] viene creato un array di tre elementi di tipo array di 2 char quindi le dimensioni sono ben chiare e non modificabili,
    se scrivendo char* A[3] viene creato un solo array di tre elementi ed ognuno di questi deve essere un char*.

    quando alloco char A[2][3] occupo 6 bytes + 3 puntatori(const) mentre se alloco char* A[3] occupo solo lo spazio per 3 "dangling pointer".. e vinco tre possibili segmentation fault..

    ed in piu..
    se voglio scorrere tutti gli elementi con un unico puntatore (tramite l'aritmetica dei puntatori com'era il mio problema iniziale) se uilizzo char* A[3] non e' possibilie in modo facile perche' i singoli char non sono allocati consecutivamente come in A[2][3].
    Pinguino a Catwoman:
    Non so cosa vuoi, ma sono certo di potertelo dare ..denaro? ..gioielli? ..un enorme gomitolo di lana..?

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.