Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    152

    [C] puntatori

    Ciao a tutti
    ho bisogno di una mano per capire per bene cosa vogliono dire determinate scritture che ho trovato in alcuni codici.
    ecco un esempio

    codice:
    #include <stdio.h>
     int f(int a[], int *b){
    if (*b == 0) return 0;
    else {
    if (*(a+*b) > *b) *a = *b;
    (*b)--;
    return (*a);
    }
     }
     main() {
    int e[3] = {2, 2, 2};
    int v = 2;
    int c = f(e,&v);
    printf("%d\n",c);
    printf("%d %d %d\n", e[0], e[1], e[2]);
     }
    una delle domande sul esercizio è:
    Le scritture *(a+*b) e a[*(b)] sono equivalenti tra di loro?

    su un altro esempio mi chiede se invece *(a+b)=a[(*b)] sono equivalenti fra loro.
    Il concetto dei puntatori è chiaro ma queste due scritture sono a me sconosciute -> *(a+*b) e *(a+b)
    quali differenza ci stanno? cosa significano? che valori assumono?
    grazie mille per l aiuto

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    Re: [C] puntatori

    *(a+*b) è equivalente ad a[*b] , perchè un puntatore ad int se incrementato, non viene incrementato di 1, ma di sizeof(int) byte (in genere 2 o 4 byte nelle macchine più diffuse).
    Quindi se a è un array, in a è contenuto l' indirizzo del primo elemento dell' array.
    Sommando a quell' indirizzo *b, ti sposti di *b celle di memoria (con ogni cella lunga sizeof(int)).Lo stesso vale per l' operatore di indicizzazione.
    Ma la scrittura *(a+b) probabilmente causerà un segmentation fault : b è un indirizzo, a è un indirizzo, stai sommando due indirizzi e questo non ha senso.Capace anche che ti da errore di sintassi.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    152
    il secondo caso cioè quello in cui *(a+b) l ho preso da un altro codice, che in teoria non dovrebbe dare errore te lo copio al volo
    codice:
    #include <stdio.h>
    void f(int a[], int *b){
    int i = 0;
    for (i = *b; i >= 0; i--)
    if (*(a+i) > *b) *(a+i) = *(a+i) - *b;
    else if (*(a+i) < *b) *(a+i) = *(a+i) + *b;
    if (*b < *a) *b = *b + *a;
     }
    
     main() {
    int e[3] = {1, 2, 3};
    int v = 2;
    f(e,&v);
    printf("%d\n",v);
    printf("%d %d %d\n", e[0], e[1], e[2]);
     }

    quindi *(a+*b) equivale ad a[(*b)], questo ora è chiaro.
    invece in questo caso *(a+i) ??
    grazie per la pazienza ^^

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    *(a+i) va bene, dato che i è un intero.Basta che non esci dall' array.
    Studiati l' aritmetica dei puntatori.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    152
    ma quindi *(a+i) che valore assume in questo caso?

    grazie per l aiuto

  6. #6
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Prova a dirlo tu che valore assume, hai tutti gli strumenti per farlo.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    152
    se ho capito bene in questo caso questa scritto nel primo ciclo for equivale ad a[2]
    poichè *(a+i) i è un intero
    e prima era un errore poichè *(a+b) b è un puntatore e generava un errore

  8. #8
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Originariamente inviato da keykode20
    se ho capito bene in questo caso questa scritto nel primo ciclo for equivale ad a[2]
    poichè *(a+i) i è un intero
    e prima era un errore poichè *(a+b) b è un puntatore e generava un errore

  9. #9
    In effetti se si va a vedere nello standard l'operatore [] è proprio definito in termini di somma di puntatore e indice; ovvero, a[b] e *(a+b) sono sinonimi per definizione.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.