2015-06-11 20 views
6

puntatori sono un argomento difficile certo, ma mi sono imbattuto in questo frammento e non riesco proprio a capire quale sia il p[-1] è:Pointer array in C?

#include <stdio.h> 
int main(void) { 
    int t[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, *p = t; 

    p += 2; 
    p += p[-1]; 
    printf("%d",*p); 
    return 0; 
} 
+0

Per prima cosa, aggiungi 2 al puntatore p, quindi punta a 2 indirizzi più avanti di prima (quindi ora punta all'indirizzo di 't [2]'). Ora si accede a un indirizzo prima di quello a cui sta puntando, facendo in modo che indichi l'indirizzo contenente '2' (o' t [1] '). – moffeltje

risposta

9

Ogni volta che vedere un'espressione come a[b] in C, si può pensare mentalmente che stia accadendo *(a + b).

Quindi, è solo "il contenuto dell'elemento prima di quello p sta puntando proprio ora".

Da p è a t + 2, p[-1] riferisce a t[2 + (-1)] cioè t[1].

1
p += p[-1]; 

può essere scritta come

p = p + *(p-1); 

A quel punto, p punti al 3 ° elemento della matrice (valore 3) e *(p-1) è 2.

Quindi, è equivalente a

p = p+2; 

e la stampa *p sarebbe stampare 5.

+0

Ragazzi fantastici, grazie! È stato veloce! Ora mi sento un po 'stupido! Ma grazie un milione per le spiegazioni approfondite! – SplineO