PROBLEMA Chi può spiegarmi questo semplice programma in C?

Pubblicità

pongo18

Nuovo Utente
Messaggi
8
Reazioni
1
Punteggio
20
Sul mio libro ho trovato questo piccolo programmino semplice in C (non c'è soluzione sul libro) e non riesco a capire come sia possibile che la funzione stringReverse riesca a scrivere la stringa all'indietro. Come è possibile? E che significa &strArray? Sul libro non dà alcuna spiegazione sull'operatore & messo prima dell'array. L'unica cosa che non riesco a capire è il funzionamento di stringReverse. Ho provato a riscrivere il programma utilizzando il for e mettendo un contatore che conta in modo discendente e ci sono riuscito. Ma qui la funzione è ricorsiva.... aiutatemi per favore :(

C:
#include <stdio.h>
#define SIZE 30

void stringReverse(char strArray[]);

int main(void)
{
    char strArray[SIZE] = "Print this string backward.";
    
    for (unsigned int loop = 0; loop < SIZE; ++loop) {
        printf("%c", strArray[loop]);
    }
    
    puts("");
    stringReverse(strArray);
    puts("");
}

void stringReverse(char strArray[])
{
    if (strArray[0] == '\0') {
        return;
    }
    
    stringReverse(&strArray[1]);
    printf("%c", strArray[0]);
}
 
infatti non funziona :)
Manca il "corpo" della funzione stringReverse, ossia quello che fa l'inversione di due caratteri (il primo e l'ultimo)
Comunque &strArray[1] significa l'indirizzo del secondo elemento del vettore strArray (ossia l'elemento di indice 1)
 
infatti non funziona :)
Manca il "corpo" della funzione stringReverse, ossia quello che fa l'inversione di due caratteri (il primo e l'ultimo)
Comunque &strArray[1] significa l'indirizzo del secondo elemento del vettore strArray (ossia l'elemento di indice 1)

Invece funziona. Provalo. Il testo l'ho copiato dal libro e l'ho testato
 
Ciao,

È un modo molto complicato di fare una cosa molto semplice.

Essendo una funzione ricorsiva, per com'è scritta, richiama se stessa continuamente passando come parametro il puntamento di memoria del carattere successivo (con la &) e successivamente stampando invece il carattere "0".

Infatti nel c se passi un vettore o il puntamento a memoria del primo elemento (o in questo caso di un elemento successivo) del vettore non ci sono differenze.

Quindi di fatto continua a chiamare in maniera annidata passando, nel tuo caso, prima l'indirizzo della lettera "r", poi quello della "i", poi quello della "n" etc.

Quindi la prima funzione annidata che terminerà sarà quella che troverà come carattere iniziale il terminatore di stringa.

Poi successivamente termineranno al contrario tutte le funzioni annidate che erano state eseguite in precedenza stampando quindi al contrario tutte le lettere della stringa.

Dimmi se hai capito altrimenti farò un disegno
 
Ciao,

È un modo molto complicato di fare una cosa molto semplice.

Essendo una funzione ricorsiva, per com'è scritta, richiama se stessa continuamente passando come parametro il puntamento di memoria del carattere successivo (con la &) e successivamente stampando invece il carattere "0".

Infatti nel c se passi un vettore o il puntamento a memoria del primo elemento (o in questo caso di un elemento successivo) del vettore non ci sono differenze.

Quindi di fatto continua a chiamare in maniera annidata passando, nel tuo caso, prima l'indirizzo della lettera "r", poi quello della "i", poi quello della "n" etc.

Quindi la prima funzione annidata che terminerà sarà quella che troverà come carattere iniziale il terminatore di stringa.

Poi successivamente termineranno al contrario tutte le funzioni annidate che erano state eseguite in precedenza stampando quindi al contrario tutte le lettere della stringa.

Dimmi se hai capito altrimenti farò un disegno
Grazie per questa spiegazione, ho capito perfettamente tutto, sei stato chiaro ed esaustivo :)
 
Pubblicità
Pubblicità
Indietro
Top