2010-07-11 15 views
9

ho visto questo pezzo di codice C# in uno degli articoli MSDN:Pointer incremento e la precedenza concatenamento in C#

using System; class Test 
{ 
    public static unsafe void Main() 
    { 
     int* fib = stackalloc int[100]; 
     int* p = fib; 
     *p++ = *p++ = 1; 
     for (int i=2; i<100; ++i, ++p) 
     *p = p[-1] + p[-2]; 
     for (int i=0; i<10; ++i) 
     Console.WriteLine (fib[i]); 
    } 
} 

Sono abbastanza nuovo per i puntatori. Capisco la maggior parte di questo codice, ma sarebbe bello se qualcuno può aiutarmi a capire questa riga nel codice di cui sopra in modo più dettagliato:

*p++ = *p++ = 1 
+0

Buona domanda, poiché non sarebbe valido in C++ –

risposta

8

Questo è solo un pigro (altri direbbero idiomatica) modo di scrivere

*p++ = 1; 
*p++ = *p++; 

o, forse meglio comprendere:

*p=1; 
p++; 
*p=1; 
p++; 
+0

Ok! Quindi * p = 1, quindi il puntatore si sposta nella posizione di memoria successiva. Quindi il valore in quella posizione è impostato su 1 e quindi passa alla posizione successiva. Grande! Grazie amico! –

+0

Se trovi utile la mia risposta, non dimenticare di accettarla, per favore. –

+0

sì .. aspettavo solo i 10 minuti;) –

2

In C# *p++ = *p++ = 1; è equivalente a:

Quindi i primi 2 elementi dell'array (che è quello che p indicava in origine) sono inizializzati su 1 e p viene lasciato verso il terzo elemento (elemento 2 con notazione basata su zero).

Come nota a parte, un'istruzione simile in C/C++ avrebbe un comportamento indefinito poiché il puntatore p viene modificato più volte senza un "punto di sequenza" intermedio. Tuttavia, C# valuta l'espressione in un modo ben definito.

+0

sì .. Vorrei che non avessero complicato C# così tanto .. un po 'confuso per i principianti .. –

+0

raze2dust: Se ti fa sentire meglio, l'uso dei puntatori è C# interamente non idiomatico. Non ho mai scritto (o visto) codice di produzione che utilizza i puntatori. – Gabe

1

I primi tre numeri di fib sono 0, 1, 1 e questo è ciò che fa il codice. (Zero viene saltato qui)

Sarebbe più chiaro a scrivere:

*p++=1; // second fib 
*p++=1; // third fib. 
+0

Il primo numero non è zero nell'output del programma. –

+0

Quindi non è la sequenza corretta di Fibonacci. Come ho detto, è saltato qui. – InsertNickHere

+0

Mi dispiace, ho trascurato la nota sullo zero. Scusate. –

2

avete bisogno di rompere le cose:

*p++

Questo sta facendo due cose : dereferenziamento p e un incremento post. Cioè mostra ciò che è all'indirizzo p ora (o assegnagli) e dopo incrementalo (nella posizione di memoria successiva).

Quindi due di questi consentono l'assegnazione alle posizioni di memoria iniziale e di seconda memoria (lasciando il numero p riferito al terzo).

C# permette assegnazioni concatenati: a = b = 2 assegna 2 sia a e b.

NB non provare questo in C o C++, la modifica della stessa cosa (p) più di una volta in una singola espressione non è definita. Ma C# lo definisce.

+0

+1 per la nota su C/C++ –

2

Ciò significa che a 0 e 1 posizioni dei valori memoria allocata impostati a 1.

Per comprensione più chiara: punti p * per qualche indirizzo di memoria, che sia start, diritto alla un altro indirizzo di memoria , che equivale a start + sizeof(int)*100, lasciare che sia en d.

In questo esempio su 1 sono stati impostati gli elementi su start e start + sizeof(int). Post incremento (*p++) significa che inizialmente utilizziamo p* e quindi incrementa con il valore sizeof(int), il secondo *p++ significa che ora utilizziamo *p + sizeof(int) e poi aumenta di nuovo e abbiamo *p + sizeof(int)*2.

1

Nel codice precedente si generano 100 numeri in serie Fibonacci.

sulla linea * p ++ = * p ++ = 1, Si stanno inizializzando i primi 2 numeri su 1. , ad esempio il numero di riempimento 1 in punti puntati dal puntatore.

Inizialmente il puntatore punta a 0. Quando si esegue * p ++, questo significa che il puntatore deve essere spostato in avanti di un punto da dove è puntato.

Quindi in questo caso il valore in posizione 1 viene assegnato al valore alla posizione 2 che viene assegnato al valore "1". vale a dire * p ++ = * p ++ = 1