2009-12-04 9 views
6

¿Qué está pasando a continuación no es un nombre de matriz siempre un puntero al primer elemento en C?¿No es una matriz/nombre de matriz siempre un puntero al primer elemento en C?

int myArray[10] = {0}; 

printf("%d\n", &myArray); /* prints memadress for first element */ 
printf("%d\n", myArray); /* this prints a memadress too, shows that the name is a pointer */ 

printf("%d\n",sizeof(myArray)); /* this prints size of the whole array, not a pointer anymore? */ 
printf("%d\n",sizeof(&myArray)); /* this prints the size of the pointer */ 
+2

Para 'printf' valores de puntero, debe usar el especificador de formato'% p'. Estás usando '% d', lo cual no tiene sentido. – AnT

+0

Parece que las preguntas frecuentes de C han disminuido, pero usted busca "c faq arrays" en Google y accede a la edición en caché. – Artelius

+0

@AndreyT ¿qué quiere decir sin sentido, lo obtiene en decimal con% d y hexadecimal con% p, a la derecha, pero su punto puede ser memoria está en hexa por def? –

Respuesta

17

El nombre de la matriz es el nombre de la matriz. El nombre de la matriz es un identificador que identifica todo el objeto de la matriz. No es un puntero a nada.

Cuando nombre de la matriz se usa en una expresión del tipo de matriz se automáticamente implícitamente convertir al tipo-puntero a elemento en casi todos los contextos (esto se refiere a menudo como "decaimiento tipo de matriz"). El puntero resultante es un valor temporal completamente independiente. No tiene nada que ver con la matriz en sí. No tiene nada que ver con el nombre de la matriz.

Las dos excepciones cuando la conversión implícita no tiene lugar son: operador sizeof y operador unitario & (dirección-de). Esto es exactamente lo que probaste en tu código.

+0

Pero no es un identificador como con ints, dobles, etc., por ejemplo, no se puede hacer así: int myArray1 [] = {0}; int myArray2 [] = {0}; myArray2 = myArray1; - esto sería como decir 1 = 3? –

+0

Es un identificador, simplemente no se puede asignar. Otro identificador al que no se puede asignar es este: 'const int a = 0;', aunque no realmente por el mismo motivo. –

+0

@ Chris_45: Es el identificador "like ints", excepto que el contexto del operador de asignación no se excluye del conjunto de contextos donde tiene lugar el "decaimiento del tipo de matriz". El resultado es que las matrices son valores no modificables (como dijo Steve). – AnT

3

No, una matriz es que primer elemento (y el resto). No se convierte en un puntero hasta que lo pasa como argumento a una función.

1

arrayname apuntará a todos los elementos de la matriz. Esa es la razón por la que puede hacer (arrayname + 5) para apuntar al quinto elemento de la matriz.

+0

Señala al primer elemento, no a todos. –

+0

lo que quiero decir aquí es que arrayname apunta a todo el objeto, no a ningún elemento de la matriz. –

0

Un nombre de matriz no es un puntero, pero se puede tratar como un puntero al primer elemento de la matriz.

3

Una matriz no es un puntero. Sin embargo, si un nombre de matriz se utiliza en una expresión en la que no es objeto ni el operador o el operador &sizeof, se evaluará a un puntero a su primer elemento.

+0

Pero, ¿cómo es esto cierto? int * point; point == myArray; punto == y myArray [0]; –

+0

Porque en ambos casos, 'myArray' es * no * el sujeto de' & 'o' sizeof', por lo que se evalúa como un puntero a su primer elemento, es decir, '& myArray [0]'. – caf

4

Tenga cuidado con los tipos.

  • El tipo de myArray es int[10].
  • El tipo de &myArray es int (*)[10] (puntero a int[10]).
  • Cuando se evalúa, el tipo de myArray es int *. Es decir. el tipo del valor de myArray es int *.
  • sizeof no evalúa su argumento. Por lo tanto, sizeof(myArray) == sizeof(int[10]) != sizeof(int *).

Corolario:

  • myArray y &myArray son los tipos de puntero incompatibles, y no son intercambiables.

No se puede asignar correctamente &myArray a una variable del tipo int *foo.

0

qué nombreArray ++ yu llegado a saber que arrayname a la vez representa todo el conjunto y no sólo el elemento inicial ....por defecto mantiene la dirección de inicio del primer elemento

Cuestiones relacionadas