Puntatore ad array (puntatore a riga)

di il
42 risposte

42 Risposte - Pagina 3

  • Re: Puntatore ad array (puntatore a riga)

    oregon ha scritto:


    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 ...
    Sì appunto, per questo dire "un puntatore è un puntatore" per me non ha molto significato, perché da questa frase io dedurrei che potrei fare tutte le operazioni che si fanno coi puntatori, compresa la dereferenziazione. Invece non è così, un puntatore ad array non lo posso dereferenziare, per questo mi chiedo a cosa serva.
  • Re: Puntatore ad array (puntatore a riga)

    O scusa ma sta nascendo veramente un po' di confusione ...

    1) quando ti ho scritto

    *((int *)vett+1)

    ho dereferenziato o no?

    2) che c'entra l'inizializzazione di un array con la dereferenziazione di un puntatore? Nulla
  • Re: Puntatore ad array (puntatore a riga)

    oregon ha scritto:


    O scusa ma sta nascendo veramente un po' di confusione ...

    1) quando ti ho scritto

    *((int *)vett+1)

    ho dereferenziato o no?

    2) che c'entra l'inizializzazione di un array con la dereferenziazione di un puntatore? Nulla
    1) Non mi sembra una dereferenziazione, perché dereferenziando si dovrebbe accedere all'elemento puntato che è di tipo array. Tu hai acceduto ad un elemento dell'array, ad un tipo int, non a un tipo array, ma qui il puntatore è ad array, quindi la sua dereferenziazione dovrebbe dare un array.

    2) E' proprio questo il punto: se il tipo array non permette l'inizializzazione dereferenziando un puntatore ad array, a quale pro è stato definito questo puntatore?
  • Re: Puntatore ad array (puntatore a riga)

    vbextreme ha scritto:


    @Autoditatta esercizio semplice:
    Preleva da input una matrice di cui le colonne corrispondano ad un nome di massimo 80 caratteri non è dato sapere a priori il numero di nomi inserito dall utente.

    Avanzato:
    Riordinare la matrice in ordine alfabetico.
    Se la sintassi lo permette, si potrebbe inserire la stringa introdotta da input in un array, poi la seconda stringa in un altro array eccetera. Il problema è proprio questo: per fare ciò dovrei avere il puntatore ad array dereferenziato come l-value, in modo da usare l'aritmetica dei puntatori per introdurre la stringa via via in array diversi, e non mi sembra si possa fare. Almeno, io non ho trovato il metodo per farlo. Qualcuno lo conosce?
  • Re: Puntatore ad array (puntatore a riga)

    Non esiste un "tipo array" in C a cui puntare. E, di conseguenza, non esiste un puntatore ad un "tipo array". Quando dereferenzi accedi ad un elemento di quell'array.

    Dal mio punto di vista non c'è molto altro da dire.
  • Re: Puntatore ad array (puntatore a riga)

    oregon ha scritto:


    Non esiste un "tipo array" in C a cui puntare. E, di conseguenza, non esiste un puntatore ad un "tipo array". Quando dereferenzi accedi ad un elemento di quell'array.

    Dal mio punto di vista non c'è molto altro da dire.
    Secondo il Domenici-Frosini esiste il puntatore ad array (chiamato anche puntatore a riga). Le cose quindi sono due:
    - esiste il tipo array (o riga, che dir si voglia)
    - il concetto di puntatore non è così universale come si diceva, dato che esiste il puntatore a qualcosa che non è un tipo
    C'è anche una terza possibilità, ma mi sembra la più improbabile: Domenici e Frosini sparano cazzate!
  • Re: Puntatore ad array (puntatore a riga)

    Ma se ne parla nell'ambito dell'argomento "array multidimensionali" ? Perché in questo caso è tutta un'altra storia ...

    Tu, fino ad ora, hai parlato di semplici vettori (array ad una dimensione) ...
  • Re: Puntatore ad array (puntatore a riga)

    oregon ha scritto:


    Ma se ne parla nell'ambito dell'argomento "array multidimensionali" ? Perché in questo caso è tutta un'altra storia ...

    Tu, fino ad ora, hai parlato di semplici vettori (array ad una dimensione) ...
    Soprattutto, ma non solo (se ne parla anche nel caso di array monodimensionali, anche se solo un accenno). Comunque sì, lasciano intendere che nel caso di array multidimensionali i puntatori ad array possano essere utili. Il punto è proprio questo: non ho capito quale possa essere la loro utilità.
  • Re: Puntatore ad array (puntatore a riga)

    Perche', probabilmente, non hai mai sentito parlare di:

    1) matrici
    1.1) matrici sparse
    2) tensori
    2.1) tensori sparsi
    3) array multidimensionali (con 10/20 o piu' dimensioni)
    4) linguaggi di programmazione come Mahematica, Lua, ...
    5) implementazione di strutture dati come skiplist, grafi, ecc
    6) ecc, ecc, ecc

    Di conoscenze da acquisire ne hai .... a tonnellate

    Il concetto di puntator e' universale il problema e' che in C non c'e' un concetto di array, o, per meglio dire, c'e', ma solo in certi contesti (allocazione nello stack), mentre non c'e' in altri (allocazione dinamica.
  • Re: Puntatore ad array (puntatore a riga)

    migliorabile ha scritto:


    Perche', probabilmente, non hai mai sentito parlare di:

    1) matrici
    1.1) matrici sparse
    2) tensori
    2.1) tensori sparsi
    3) array multidimensionali (con 10/20 o piu' dimensioni)
    4) linguaggi di programmazione come Mahematica, Lua, ...
    5) implementazione di strutture dati come skiplist, grafi, ecc
    6) ecc, ecc, ecc

    Di conoscenze da acquisire ne hai .... a tonnellate

    Il concetto di puntator e' universale il problema e' che in C non c'e' un concetto di array, o, per meglio dire, c'e', ma solo in certi contesti (allocazione nello stack), mentre non c'e' in altri (allocazione dinamica.
    Fra le cose che hai elencato conosco le matrici e gli array multidimensionali. Però non riesco a trovare un'applicazione del concetto di puntatore ad array neanche in questi contesti. Lavorando con array multidimensionali, in quale situazione potrebbe rendersi necessaria l'applicazione del concetto di puntatore ad array?
  • Re: Puntatore ad array (puntatore a riga)

    Il "puntatore a riga" ha un senso solamente nell'ambito di array multidimensionali proprio perché questi vengono visti come vettori di puntatori a degli array (e nella visione tipo tabella, come vettori di puntatori a righe).

    Per gli array ad una dimensione non ha senso parlarne.

    Nel caso di array multidimensionale, guarda questo codice
    
    	int i;
    	int arr[2][5] = { {1,2,3,4,5}, {10,20,30,40,50} };
    	int (*parr)[5] = &arr[1];
    
    	int *priga = *parr;
    
    	for(i=0; i<5; i++)
    		printf("%d ", *(priga+i));
    
  • Re: Puntatore ad array (puntatore a riga)

    oregon ha scritto:


    Il "puntatore a riga" ha un senso solamente nell'ambito di array multidimensionali proprio perché questi vengono visti come vettori di puntatori a degli array (e nella visione tipo tabella, come vettori di puntatori a righe).

    Per gli array ad una dimensione non ha senso parlarne.

    Nel caso di array multidimensionale, guarda questo codice
    
    	int i;
    	int arr[2][5] = { {1,2,3,4,5}, {10,20,30,40,50} };
    	int (*parr)[5] = &arr[1];
    
    	int *priga = *parr;
    
    	for(i=0; i<5; i++)
    		printf("%d ", *(priga+i));
    
    Avevo già pensato a questo utilizzo, ma non aggiunge niente, dato che potrei tranquillamente fare:
    
    	int i;
    	int ar[2][5] = { {1,2,3,4,5}, {10,20,30,40,50} };
    	int* pun = &ar[1][0];
    
    	for(i=0; i<5; i++)
    		cout << pun[i];
    
    che il risultato sarebbe lo stesso. E il codice come l'ho scritto io non presuppone nessuna conoscenza in più rispetto all'utilizzo del puntatore a riga, dato che per definizione di array il primo elemento della riga è quello con indice 0. Anzi, l'utilizzo del puntatore a riga complica la sintassi.
  • Re: Puntatore ad array (puntatore a riga)

    Okay, è una questione di diversa sintassi utilizzabile. Come ti dicevo "un puntatore è un puntatore".

    Ma non per questo è inutile ... c'è chi, in quell'ambito, la preferisce.
Devi accedere o registrarti per scrivere nel forum
42 risposte