Originariamente inviata da
Satiro88
Ciao a tutti! Avrei qualche domanda teorica per quanto riguarda i puntatori,mi danno non pochi problemi.
Se riusciste a spiegarmi questi due esempi mi sarebbe molto di aiuto.
che differenza c'è tra:
*(p++) e *(p)++
Nel primo caso ++ agisce sul puntatore, nel secondo sul valore puntato.
codice:
int arr[5]={0, 1, 2};
int *p=arr;
printf("%d", *(p++)); /* stampa 0, _poi_ p viene spostato all'elemento successivo */
printf("%d", *p); /* stampa 1 */
printf("%d", *(p)++); /* stampa 1 e _poi_ lo incrementa */
printf("%d", *p); /* stampa 2 */
/* ora arr è {0, 2, 2}, e p punta al secondo elemento */
[/quote]
Tipodato *p; //sizeof(Tipodato)=28(bit?byte?)
[/quote]
Il valore restituito da sizeof è in byte, ovvero in unità di "char" (sizeof(char)=1 per definizione).
Sposta p alla posizione successiva, ma in questo caso non ha senso, visto che il puntatore non è stato inizializzato; puoi incrementare/decrementare puntatori solo se puntano all'interno del medesimo array.
come descrizione è riportato "incremento pari a 7 celle di memoria" ma non capisco come lo calcoli
Se sizeof(Tipodato) è 28, incrementerà di 28 byte (ovvero, passa all'elemento successivo se p sta puntando dentro un array).
i puntatori in generale che dimensioni hanno? Ok che ci sono puntatori che puntano a interi altri a caratteri, però sempre di puntatori si tratta, non credo che influisca sull'indirizzo...
Dipende dalla piattaforma; sulle piattaforme a 32 bit saranno 4 byte, su piattaforme a 64 bit 8 byte. Non ricordo se è garantito dallo Standard che tutti i puntatori abbiano le medesime dimensioni, ma (1) in pratica è sempre così, e (2) comunque è garantito che tutti i puntatori siano convertibili a void * senza perdita di informazione, per cui sizeof(void *) di fatto ti dà la misura dei puntatori usati sulla piattaforma corrente.