2010-07-11 11 views
9

vi este pedazo de código C# en uno de los artículos de MSDN:incremento del puntero y la precedencia de encadenamiento en 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]); 
    } 
} 

Soy bastante nuevo a los punteros. Entiendo la mayor parte de este código, pero sería genial si alguien puede ayudar a entender esta línea en el código anterior con más detalle:

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

Buena pregunta, ya que no sería válida en C++ –

Respuesta

8

eso es sólo una perezosos (otros dirían idiomática) manera de escribir

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

o, tal vez mejor de entender:

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

¡Bien! Entonces * p = 1, luego el puntero se mueve a la siguiente ubicación de memoria. Entonces el valor en esa ubicación se establece en 1 y luego se mueve a la siguiente ubicación. ¡Estupendo! ¡Gracias amigo! –

+0

Si encuentras mi respuesta útil, no olvides aceptarla, por favor. –

+0

sí ... solo estaba esperando los 10 minutos;) –

2

En C# *p++ = *p++ = 1; es equivalente a:

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

Así que los primeros 2 elementos de la matriz (que es lo que p señalaron originalmente) se inicializan a 1, y p se deja apuntando al tercer elemento (elemento 2 usando notación basada en cero).

Como nota adicional, tenga en cuenta que una declaración similar en C/C++ tendría un comportamiento indefinido ya que el puntero p se modifica más de una vez sin un 'punto de secuencia' intermedio. Sin embargo, C# evalúa la expresión de una manera bien definida.

+0

sí ... Desearía que no hubieran complicado tanto C# ... un poco confuso para principiantes .. –

+0

raze2dust: Si te hace sentir mejor, el uso de punteros es C# completamente no idiomático. Nunca he escrito (o incluso visto) código de producción que utiliza punteros. – Gabe

1

Los primeros tres números fib son 0, 1, 1 y eso es lo que hace el código. (Cero se omite aquí)

Sería más clara para escribir:

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

El primer número no es cero en la salida del programa. –

+0

Entonces no es la secuencia correcta de fibonacci. Como dije, se saltó aquí. – InsertNickHere

+0

Lo siento, pasé por alto la nota sobre cero. Lo siento. –

2

que necesita para romper las cosas:

*p++

esto está haciendo dos cosas : desreferencia p y un incremento de publicación. Es decir. muestre lo que está en la dirección p ahora (o asigne) y después de increméntelo (a la siguiente ubicación de memoria).

Por lo tanto, dos de estos permiten la asignación a las ubicaciones de memoria inicial y segunda (dejando p refiriéndose a la tercera).

C# permite asignaciones encadenadas: a = b = 2 asigna 2 a a y b.

NB No intente esto en C o C++, modificando lo mismo (p) más de una vez en una sola expresión no está definido. Pero C# define esto.

+0

+1 para la nota sobre C/C++ –

2

Esto significa que a las 0 y 1 posiciones de los valores de memoria asignados pone a 1.

Para una comprensión más clara: puntos p * a alguna dirección de memoria, que sea start, derecho a la otra dirección de la memoria , que es igual a start + sizeof(int)*100, deje que sea en d.

En este ejemplo, 1 se establecieron elementos en start y start + sizeof(int). Aumento de publicación (*p++) significa que al principio usamos p* y luego se incrementa con sizeof(int) valor, el segundo *p++ significa que ahora usamos *p + sizeof(int) y luego se incrementa una vez más y tenemos *p + sizeof(int)*2.

1

En el código anterior está generando 100 números en la serie Fibonacci.

en línea * p ++ = * p ++ = 1, Está inicializando los primeros 2 números en 1. es decir, llenando el número 1 en los lugares señalados por el puntero.

Puntero inicial apunta a 0. Cuando lo hace * p ++, esto significa que el puntero debe avanzar un lugar desde donde apunta.

Entonces, en este caso, el valor en la posición 1 se asigna al valor en la posición 2 que se asigna al valor "1". es decir, * p ++ = * p ++ = 1

Cuestiones relacionadas