PROBLEMA Chi può spiegarmi questo semplice programma in C?

pongo18

Nuovo Utente
8
1
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]);
}
 

Andretti60

Utente Èlite
6,440
5,091
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)
 

pongo18

Nuovo Utente
8
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
 

lpleo

Nuovo Utente
33
10
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
 

Andretti60

Utente Èlite
6,440
5,091
Ciao,

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

...

Hai ragione.
Di fatto avevo capito male io, pensavo che lo scopo fosse quello di invertire la stringa, invece che semplicemente stamparla al contrario.
La tua spiegazione non fa una piega.
 
  • Mi piace
Reazioni: lpleo

pongo18

Nuovo Utente
8
1
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 :)
 
  • Mi piace
Reazioni: lpleo

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili