"Decaimiento" se refiere a la conversión implícita de una expresión de un tipo de matriz a un tipo de puntero. En la mayoría de los contextos, cuando el compilador ve una expresión de matriz, convierte el tipo de expresión de "matriz de elementos N de T" a "puntero a T" y establece el valor de la expresión en la dirección del primer elemento de la matriz . Las excepciones a esta regla son cuando una matriz es un operando de cualquiera de los dossizeof
o &
los operadores, o la matriz es una cadena literal de ser utilizado como un inicializador en una declaración.
Asuma el siguiente código:
char a[80];
strcpy(a, "This is a test");
La expresión a
es del tipo "matriz de char de 80 elementos" y la expresión "Esta es una prueba" es del tipo "matriz de char de 16 elementos" (en C; en C ++ los literales de cadena son matrices de const char). Sin embargo, en la llamada a strcpy()
, ninguna expresión es un operando de sizeof
o &
, por lo que sus tipos se convierten implícitamente en "puntero a char", y sus valores se establecen en la dirección del primer elemento en cada uno. Lo que strcpy()
recibe no son matrices, sino punteros, como se ve en su prototipo:
char *strcpy(char *dest, const char *src);
Esto no es lo mismo que un puntero de matriz. Por ejemplo:
char a[80];
char *ptr_to_first_element = a;
char (*ptr_to_array)[80] = &a;
Ambos ptr_to_first_element
y ptr_to_array
tienen el mismo valor ; la dirección base de a. Sin embargo, son diferentes tipos y se tratan de manera diferente, como se muestra a continuación:
a[i] == ptr_to_first_element[i] == (*ptr_to_array)[i] != *ptr_to_array[i] != ptr_to_array[i]
Recuerde que la expresión a[i]
se interpreta como *(a+i)
(que sólo funciona si el tipo de matriz se convierte en un tipo de puntero), por lo tanto a[i]
y ptr_to_first_element[i]
funcionan de la misma. La expresión (*ptr_to_array)[i]
se interpreta como *(*a+i)
. Las expresiones *ptr_to_array[i]
y ptr_to_array[i]
pueden dar lugar a advertencias o errores del compilador según el contexto; definitivamente harán lo incorrecto si espera que lo evalúen a[i]
.
sizeof a == sizeof *ptr_to_array == 80
Nuevamente, cuando una matriz es un operando de sizeof
, no se convierte en un tipo de puntero.
sizeof *ptr_to_first_element == sizeof (char) == 1
sizeof ptr_to_first_element == sizeof (char *) == whatever the pointer size
is on your platform
ptr_to_first_element
es un simple puntero a char.
int a[10]; int b(void);
, entonces+a
es un puntero int y+b
es un puntero de función. Útil si desea pasarlo a una plantilla aceptando una referencia.