2010-08-01 7 views
8

int (* p) [4];int (* p) [4]?

¿Indicador "p" a la matriz de 4 enteros? o que ??

y ¿cómo puedo llamar "nuevo" para este puntero?

+0

Como puede ver en la respuesta a continuación. Esta declaración de rey de tipo es confusa y no intuitiva y, como tal, es mejor evitarla (a menos que desee agregar comentarios excesivos).Si usa otras construcciones, puede obtener los mismos resultados de una manera más legible (como std :: vector <> o boost :: array) –

+0

@Martin: 'std :: vector <>' es un animal completamente diferente de ' int (* p) [4] '! – Seth

+2

@Seth: Pero 'int (* p) [4]' probablemente sea mejor reemplazado por un 'estándar std :: vector std :: >' bidimensional o un std :: vector unidimensional 'con aritmética de indexación manual o un 'boost :: multi_array '. – fredoverflow

Respuesta

7

¿Indicador "p" a una matriz de 4 enteros?

¡Correcto!

¿Cómo puedo llamar "nuevo" para este puntero?

Por ejemplo, p = new int[7][4].

+3

Err .. fue +1 hasta la edición. Nuevo int [7] [4] le da un solo bloque 28 ints wide. –

+0

humm ... así que creo que p apunta a 4 punteros enteros, cada uno apunta a una matriz de 4 enteros, es correcto ?? –

+3

@Billy: no hay nada de malo en mi ejemplo. El tipo de 'new int [7] [4] '* is *' int (*) [4] '. Tal vez es más obvio con un typedef?' Typedef int row [4]; row * p = new row [7]; 'This is exactly equivalente a mi código, solo más legible. ¿Argumentaría que esto también está mal? – fredoverflow

3

El online CDECL evaluator es un recurso útil para este tipo de preguntas:


cdecl 

C gibberish ↔ English 

int (*p)[4]; 

    declare p as pointer to array 4 of int 
+0

+1 ¡Eso es genial! – fredoverflow

+0

... excepto que 'int (* p) [4];' no _declare_ 'p', pero __defines__ it. (Al menos está en C++, de lo que se trata esta pregunta. Como Johannes señaló una vez, en C y C++ algunas áreas difieren en lo que es una definición y qué es una declaración) – sbi

+0

@sbi: Bien, pero cada definición también es una declaración ;) "Sintaxis del declarante C" es un término bien aceptado. – fredoverflow

6

int (*p)[4] es, de hecho, un puntero a un array de cuatro int s.

Puede asignar dinámicamente un objeto de tipo "puntero a una matriz de cuatro int" de la siguiente manera.

int (**ptr)[4] = new (int (*)[4]); 

Nota, no hay espacio para ningún int s está atribuida; solo el puntero mismo

Puede asignarse un conjunto de 4 enteros de la siguiente manera:

int *ptr = new int[4]; 

Lo que no se puede hacer (sin conversión explícita) es asignar un puntero a una matriz de asignación dinámica de 4 int a un puntero de tipo int (*)[4]. Siempre que asigne una matriz a través del new, incluso si usa un typedef, el tipo de la nueva expresión es un puntero al primer elemento de la matriz; el tamaño de la matriz no se conserva en el tipo de la expresión new.

Esto se debe a que las expresiones new[] pueden asignar matrices donde el tamaño de la matriz se elige en tiempo de ejecución, por lo que no siempre sería posible (o incluso deseable) codificar el tamaño de la matriz en el tipo de la nueva expresión.

Como se ha sugerido, puede asignar dinámicamente una matriz de una matriz de 4 int. El tamaño de la primera matriz se pierde a partir de la información de tipo y lo que se obtiene es un puntero al primer elemento de la matriz (de tamaño 1) de las matrices de cuatro int.

int (*p)[4] = new int[1][4]; 

A pesar de que es una matriz de sólo 1 (arrays de 4 int), que todavía tienen que utilizar delete[] desasignar p.

delete[] p; 
+2

Por supuesto, uno nunca debe estar realmente en una posición que necesite llamar 'delete' manualmente. – GManNickG

+0

bien, ¿qué pasa con int (* p) [4] = new int [4] [4] ... dow puedo llamar a delet en él ?? Intento: para (int i = 0; i <4; i ++) delete [] p [i]; delete [] p; pero no funciona :( –

+2

@Farah_online: no importa qué tamaño tenga la matriz, siempre se eliminan las matrices con 'delete [] p;' So 'p = new int [1] [4]; '...' borrar [] p' y 'p = new int [4] [4];' ... 'borrar [] p'. Llamar a delete en un miembro de la matriz (' delete [] p [i] ' o 'eliminar p [i]') no es válido. –

Cuestiones relacionadas