Pointer Arithmetic In C

Considera il seguente frammento di codice:

int (*p)[3]; int (*q)[3]; q = p; q++; printf("%d, %d\n", q, p); printf("%d\n", qp); 

So che l’aritmetica del puntatore è intelligente, il che significa che l’operazione q++ avanza q abbastanza byte in avanti per puntare a un prossimo array di 3-interi, quindi non mi sorprende che la prima stampa sia 12, 0 ‘ che significa che l’incremento q ingrandito in 12.

Ma la seconda stampa mi sorprende. Stampa 1!
Quindi, perché dovrebbe stampare 1 anziché 12? mi lascia solo perplesso.

Come l’operatore di incremento ++ , anche l’operatore di sottrazione con puntatori prende in considerazione la dimensione degli oggetti puntati. In particolare, il risultato restituito è il numero di differenza di byte nei valori del puntatore diviso per la dimensione dell’object puntato (12, nel tuo esempio). Quindi la differenza è di 12 byte, divisa per la dimensione 12 o 1.

Se vuoi veramente conoscere la differenza, lancia ogni puntatore su un (char *) e poi su (int) e poi sottrai. Questo dovrebbe darti la risposta.

Questo codice ti dà il valore assoluto:

 printf("%d\n", abs((int)((char*)q) - (int)((char*)p))); 

Ricordati di includere la matematica.h.

Modifica: come indicato in un commento, non è necessario un doppio cast. Lanciare ogni puntatore a un int e quindi a sottrarre dà la stessa risposta della doppia fusione (non necessaria) sopra.

 printf("%d\n", abs((int)(q) - (int)(p)));