[c] come incremento il puntatore?

di il
8 risposte

[c] come incremento il puntatore?

Buongiorno,
ho realizzato un programma che funziona. A scopo didattico voglio trasformare questa parte

do{
fscanf(fp1, "%s %s %d %f %s ", st[i].nomeStudente, st[i].cognomeStudente, &st[i].numero, &st[i].voto, st[i].materia);
printf("%s %s %d %f %s ", st[i].nomeStudente, st[i].cognomeStudente, st[i].numero, st[i].voto, st[i].materia);
i++; 
}while(!feof(fp1));
in una cosa così:
printf("%s %s %d %f %s ", st->nomeStudente, st->cognomeStudente, st->numero, st->voto, st->materia);

come incremento? come sostituisco i++; ? st++; non mi funziona!! e nememno *(st++); etc.

Stampa cose tipo:

antonio balice 1 1.100000 ita 0 0.000000
luca sassi 2 2.200000 mat 0 0.000000
luca parmisano 3 6.000000 spazio 0 0.000000

invece di:

antonio balice 1 1.100000 ita
luca sassi 2 2.200000 mat
luca parmisano 3 6.000000 spazio


Grazie

8 Risposte

  • Re: [c] come incremento il puntatore?

    Si incrementa con un ++
    
    #include <stdio.h>
    
    struct studente{
        char nomeStudente[50];
        char cognomeStudente[50];
        int numero;
        float voto;
        char materia[50];  
    };
    
    int main(void){
        studente st[2] = { {"Ugo", "Fantozzi", 1, 6.5, "ragioneria"}, {"Mario", "Rossi", 2, 7.5, "italiano"}};
        studente * st_ptr = &st[0];
        printf("%s %s %d %f %s \n", st_ptr->nomeStudente, st_ptr->cognomeStudente, st_ptr->numero, st_ptr->voto, st_ptr->materia);
        st_ptr++;
        printf("%s %s %d %f %s \n", st_ptr->nomeStudente, st_ptr->cognomeStudente, st_ptr->numero, st_ptr->voto, st_ptr->materia);
         
        return 0;
    }
    
  • Re: [c] come incremento il puntatore?

    Aritmetica dei puntatori questa sconosciuta
  • Re: [c] come incremento il puntatore?

    @oregon, oggi è stata una giornata dura... se mi vuoi dare una mano ti ringrazio, altrimenti, per favore, risparmiami l'ironia.

    @ Weierstrass alla fine così funziona (cioè come mi hai suggerito):
    
    void funzionestampa(studente st[]){
    
    FILE *fp1;
    fp1=fopen("testennesimo.dat","r");
    int j, i=0;
    studente * st_ptr = &st[0];
    if(!fp1) printf("Impossibile aprire il file");
    else
    {
    do{
    fscanf(fp1, "%s %s %d %f %s ", st[i].nomeStudente, st[i].cognomeStudente, &st[i].numero, &st[i].voto, st[i].materia);
    printf("%s %s %d %f %s ", st_ptr->nomeStudente, st_ptr->cognomeStudente, st_ptr->numero, st_ptr->voto, st_ptr->materia);
    i++; st_ptr++;
    }while(!feof(fp1));
    
    //for(j=0; j<i; j++)
    //printf("%s %s %d %f %s ", st[j].nomeStudente, st[j].cognomeStudente, st[j].numero, st[j].voto, st[j].materia);
    
    }
    fclose(fp1);
    }
    
    
    Però ero convinto di poter utilizzare direttamente st scrivendo st++; Cioè ero convinto di poter utilizzare il nome del vettore come puntatore;

    Ne ero convinto perché ho trovato questo esercizio:
    Commenta i seguenti tre punti
    int a[]={1,2,3};
    int *ptr=a;
    a=a+2;
    E l'ultima espressione mi sembrava un chiaro uso dell'aritmetica dei puntatori:
    Scusatemi se non sono stato chiaro!
  • Re: [c] come incremento il puntatore?

    St non è un puntatore, è un vettore. L'utilizzo del nome del vettore come se fosse un puntatore all'elemento 0 si fa solo nel passaggio come parametro di una funzione o nell'assegnazione (o meglio: è il compilatore che lo fa in modo implicito, cioè int *ptr=a è equivalente a int *ptr=&a[0]).
    Nel tuo esempio, il compilatore ti dà errore su a=a+2;
  • Re: [c] come incremento il puntatore?

    Esatto, i vettori e puntatori sono cose completamente diverse anche se hanno espressioni molto comuni. Questi sono solo rvalue e non possono essere quindi utilizzati come lvalue
  • Re: [c] come incremento il puntatore?

    antragorn ha scritto:


    @oregon, oggi è stata una giornata dura... se mi vuoi dare una mano ti ringrazio, altrimenti, per favore, risparmiami l'ironia.
    Permaloso eh?
    int a[]={1,2,3};
    int *ptr=a;
    a=a+2;

    E l'ultima espressione mi sembrava un chiaro uso dell'aritmetica dei puntatori:
    L'ultima espressione di quel codice è evidentemente sbagliata.

    The name of the array A is a constant pointer to the first element of the array. So A can be considered a const int*. Since A is a constant pointer, A = NULL would be an illegal statement.
  • Re: [c] come incremento il puntatore?

    oregon ha scritto:


    The name of the array A is a constant pointer to the first element of the array. So A can be considered a const int*. Since A is a constant pointer, A = NULL would be an illegal statement.
    In realtà è int *const A. Cioè un rvalue
  • Re: [c] come incremento il puntatore?

    Ok ragazzi, tutto chiaro. Grazie.
Devi accedere o registrarti per scrivere nel forum
8 risposte