Ciao a tutti!!!

Stavo rivedendo un po' le struct, e ho notato qualcosa di strano, mi spiego con un esempio

Primo codice

codice:
#include <stdio.h>
 
typedef struct prova{
    char str[20];
    int num;
}PRO;
 
void scrivi(PRO *s);
void stampa(PRO s);
 
int main()
{
    PRO s;
 
    scrivi(&s);
    stampa(s);
 
    return 0;
 
}
 
void scrivi(PRO *s)
{
    printf("\nInserire una stringa: ");
    scanf("%s", s->str);
    printf("\nInserire un numero: ");
    scanf("%d", &s->num);
}
 
void stampa(PRO s)
{
    printf("\n\nStr: %s", s.str);
    printf("\nnum: %d", s.num);
}
Secondo codice

codice:
#include <stdio.h>
 
typedef struct prova{
    char str[20];
    int num;
}PRO;
 
void scrivi(PRO *s);
void stampa(PRO s);
 
int main()
{
    PRO s;
 
    scrivi(&s);
    stampa(s);
 
    return 0;
 
}
 
void scrivi(PRO *s)
{
    printf("\nInserire una stringa: ");
    scanf("%s", &s->str);
    printf("\nInserire un numero: ");
    scanf("%d", &s->num);
}
 
void stampa(PRO s)
{
    printf("\n\nStr: %s", s.str);
    printf("\nNum: %d", s.num);
}
Come avete potuto notare tra i due codici c'è una differenza ovvero
nel primo uso
scanf("%s", s->str);
mentre nel secondo
scanf("%s", &s->str);

Tuttavia anche con questa differenza i due codici funzionano allo stesso modo, perché?
Per me dovrebbe funzionare solo nel primo caso infatti il campo str della struttura è un vettore di caratteri quindi &str[0]==str.
Cosa non sto considerando? qualcuno potrebbe spiegarmi perché nel secondo caso non succede nulla di strano?


Ringrazio tutti anticipatamente!