PDA

Visualizza la versione completa : [C] Equivalenza di scritture che usano puntatori


keykode20
08-02-2012, 12:20
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



#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

ramy89
08-02-2012, 12:45
*(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.

keykode20
08-02-2012, 12:58
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


#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 ^^

ramy89
08-02-2012, 13:07
*(a+i) va bene, dato che i è un intero.Basta che non esci dall' array.
Studiati l' aritmetica dei puntatori.

keykode20
08-02-2012, 13:08
ma quindi *(a+i) che valore assume in questo caso?

grazie per l aiuto

ramy89
08-02-2012, 13:30
Prova a dirlo tu che valore assume, hai tutti gli strumenti per farlo.

keykode20
08-02-2012, 14:38
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

ramy89
08-02-2012, 15:27
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

:mem:

MItaly
08-02-2012, 20:15
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.

Loading