2011-01-07 30 views
15
int* myPointer = new int[100]; 

// ... 

int firstValue = *(myPointer + 0); 
int secondValue = myPointer[1]; 

¿Hay alguna diferencia funcional entre *(myPointer + index) y myPointer[index]? ¿Cuál se considera una mejor práctica?diferencia entre * (Índice + Puntero) y el puntero []

+8

Olvidaste: 'int thirdValue = 2 [myPointer];' Lo cual también funciona alocadamente. –

+0

@Martin ¿En serio? Huh. Aprende algo nuevo todos los días, supongo. – Maxpm

+3

@Maxpm - [La subscripción de matriz es conmutativa en C] (http://c-faq.com/aryptr/joke.html) – jww

Respuesta

30

Funcionalmente, son idénticos.

Semánticamente, la referencia a un puntero dice "Aquí hay una cosa, pero realmente se preocupan por lo X espacios más", mientras que el acceso a la matriz dice "Aquí hay un montón de cosas, que se preocupan por el Xth uno".

En la mayoría de los casos, preferiría la forma de matriz.

+2

¿Alguien votó esto? Desearía que la gente comentara y me dijera qué pasa con mi respuesta. –

+0

No era yo, pero en este caso no es el 'Xth' pero el' X + 1th'. –

+5

@Fritschy: Bueno, como programadores, supongo que contamos desde 0;) –

11

No, son funcionalmente equivalentes.

En primer lugar, index se amplía hasta el tamaño de tipo que luego se agregó a la base myPointer, luego el valor se extrae de esa ubicación de memoria.

La "mejor práctica" es la más legible, que suele ser, pero no necesariamente siempre, la variante myPointer[index].

Eso es porque normalmente está interesado en un elemento de la matriz, no en la ubicación de la memoria para eliminar la referencia.

3

No hay diferencia funcional que conozca, pero el formulario myPointer[1] es finalmente más legible y es menos probable que incurra en errores de codificación.

DC

La forma *(myPointer + 1) no permite que se cambie el tipo de puntero a un objeto y, por tanto, al acceder a la sobrecarga del operador [].

también la depuración es mucho más difícil

int *ints[10]; 
int myint = ints[10]; 

es más fácil de recogida visualmente que

int *ints; 
int myint = *(ints + 10); 

también el compilador puede insertar gama comprobación para detectar el error en tiempo de compilación.

DC

+0

+1 - punto clave re 'operador []' sobrecarga. –

+0

Pero cuando necesita la dirección, la forma 'ints + 10' es mejor que' & ints [10] '. – ruslik

+0

Si necesita la dirección no le importa el operador sobrecargado [], y evitarla es más seguro. –

0

Código más legible y más fácil de mantener es el mejor código.

En cuanto a la pieza funcional ... No hay diferencia. Ambas veces estás "jugando con la memoria".

1

No hay diferencia funcional. La decisión de utilizar cualquiera de los dos formularios generalmente se toma en función del contexto en el que se está utilizando. Ahora, en este ejemplo, la forma de matriz es más fácil de usar y leer y, por lo tanto, es la elección obvia. Sin embargo, supongamos que está procesando una matriz de caracteres, por ejemplo, consumiendo las palabras en una oración. Dado un puntero a la matriz puede que le resulte más fácil de usar la segunda forma como en el siguiente fragmento de código:

int parse_line(char* line) 
{ 
    char* p = line; 
    while(*p) 
    { 
     // consume 
     p++; 
    } 
    ... 
} 
18

No hay diferencia entre

*(array+10); //and 
array[10]; 

pero adivinen qué?desde + es associative

*(10 + array); //is all the same 
10[array]; //! it's true try it ! 
+1

Esto es cierto porque '+' es conmutativa. La operación '+' también es asociativa, pero aquí no es importante. – rcode

0

En realidad, cuando una matriz 'a' se inicializa un puntero a su ubicación primer recuerdo es decir .. a [0] se devuelve el cual no es más que una;

Así que si lo hace 'a + 1' en realidad es un puntero a una [1]

si lo hace 'a + 2' es en realidad un puntero a una [2]

si haces 'a + 3' en realidad es un puntero a [3] ,

así que si lo haces * (a + 1) obtendrás el valor de un [1] y similar para otros valores también . si lo hace * (a) realmente obtienes un [0], Así que creo que es bastante claro ahora cómo funciona ...

Cuestiones relacionadas