Perché se se sottraggo da un puntatore un altro puntatore (puntatori interi) senza typecasting il risultato sarà 1 e non 4 byte
Questo è il punto centrale del tipo di dati che un puntatore che punta a . Probabilmente è più semplice guardare un contesto di array come di seguito. Il punto è indipendentemente dal tipo di dati sottostante (in questo caso long
o double
), è possibile utilizzare l'aritmetica del puntatore per navigare nell'array senza preoccuparsi di come esattamente la dimensione del suo elemento sia. In altre parole, (puntatore + 1) significa puntare sull'elemento successivo indipendentemente dal tipo.
long l[] = { 10e4, 10e5, 10e6 };
long *pl = l + 1; // point to the 2nd element in the "long" array.
double d[] = { 10e7, 10e8, 10e9 };
double *pd = d + 2; // point to the 3rd element in the "double" array.
notare anche nel codice:
int a , b , *p , *q;
p = &b;
q = p + 1; // q = &a; <--- NO this is wrong.
Il fatto che a
e b
sono dichiarato uno accanto all'altro non significa che a
e b
sono assegnati uno accanto all'altro in la memoria. Quindi q
punta all'indirizzo di memoria accanto a quello di b
- ma ciò che è in quell'indirizzo non è definito.
vostri invoca codice comportamento indefinito. Per la differenza tra puntatori usa 'ptrdiff_t' e l'identificatore appropriato per' printf'. –
È normale, quando fai puntatore = puntatore + 1, aggiunge 1 * sizeof (int *); –
@PierreEmmanuelLallemant: Credo che tu intenda '1 * sizeof (int)', non 'int *'. – ShadowRanger