C, dubbio su VOID**

di il
5 risposte

C, dubbio su VOID**

Ciao a tutti, ho un dubbio che non riesco a risolvere.

Premetto che magari la soluzione sarà una cavolata, ma non essendo esperto del C sono un po in diffcoltà.

Allora devo realizzare una funzione
void swapPtr(void **ptr1, void **ptr2);
, che scambi due puntatori generici.

Non riesco a capire il motivo per cui gli argomenti della funzione hanno come tipo void** , non bastava avere argomenti di tipo void * ??

grazie in anticipo a tutti per l'aiuto!

5 Risposte

  • Re: C, dubbio su VOID**

    Void e' il tipo nullo per il sistema dei tipi del C/C++, un po' come lo 0 per la somma o l'1 per la moltiplicazione.

    Se ti serve un puntatore generico, quindi non di tipo intero, char, ecc, il suo tipo sara' void *.

    Ora, tu hai due variabili A e B di tipo T, diciamo a e b.
    Come si scambiano i valori?
    
    T t = a;
    a = b;
    b = t;
    
    Ora, come si fa per passare una variabile ad una funzione in modo che questa la possa cambiare?
    
    void f(T* p)
    {
       *p = 6;
    }
    
    ... 
    a = 5;
    f(&a);
    
    
    quanto vale a, dopo la chiamata di f(&a) ?

    Ok, ora metti tutto assieme ... ed ecco la soluzione!

    Ovviamente ti ho dato solo i ragionamenti spiccioli.
    Devi applicarti un po' per fare il ragionamento complessivo e capire perche'
    usare void **
  • Re: C, dubbio su VOID**

    Allora ho capito l'esempio che mi hai fatto: in quel caso dopo l'applicazione della funzione f la variabile a assume il valore 6.

    Però scusa non ho veramente capito la riga che mi hai scritto sotto...me la potresti spiegare!
  • Re: C, dubbio su VOID**

    Hai ragione, ma alle 4 di mattina con il cellulare e stanco morto ho fatto un bel po' di casino con a, b, bold ecc.!
  • Re: C, dubbio su VOID**

    Ahahahah vai tranquillo!

    Comunque penso di aver capito la faccenda.
    Dunque per dichiarare una variabile, diciamo generica, uso il tipo void*.
    Ma per scambiare effettivamente due valori devo passare i valori puntati non i valori in sè, ecco spiegata la presenza del secondo puntatore.

    mi traeva in inganno la convinzione che fosse corretto dichiarare (nel main) due variabili in questo modo:
    void a, b;

    e successivamente scambiarle con
    void swap(void *x, void *y){
    
    ...
    
    }
    qualcuno mi conferma se ho capito o meno?
  • Re: C, dubbio su VOID**

    Giusto, a parte il fatto che non si puo' definire una variabile di tipo void.
    Secondo me e' un castronata del progettista del linguaggio, nel senso che dovrebbe essere possibile farlo. Non servirebbe a molto, perche' la variabile dovrebbe contenere in dato lungo 0 (zero) byte, cioe' niente, ma per essere conformi a int, long, ... si dovrebbe poterlo fare. Ma cosi' e' .
Devi accedere o registrarti per scrivere nel forum
5 risposte