Para entender la diferencia, tenemos que entender dos diferentes contextos .
- En valor contextos, el nombre de una matriz de tipo
T
es equivalente a un puntero para escribir T
, y es igual a un puntero a primer elemento de la matriz.
- En objeto contextos, el nombre de una matriz de tipo
T
no se reduce a un puntero.
¿Qué es object context?
En a = b;
, a
se encuentra dentro del contexto del objeto. Cuando tomó la dirección de una variable, se usa en el contexto del objeto. Finalmente, cuando usa el operador sizeof
en una variable, se usa en el contexto del objeto. En todos los demás casos, una variable se usa en contexto de valor.
Ahora que tenemos este conocimiento, cuando hacemos:
void f(int arr[4]);
Es exactamente equivalente a
void f(int *arr);
Como has descubierto, podemos omitir el tamaño (4 anterior) de la declaración de la función. Esto significa que no puede saber el tamaño de la "matriz" pasada a f()
.Más tarde, cuando lo hace:
int a[]={1,2,3,4};
f(a);
En la llamada a la función, el nombre a
está en el contexto de valor, por lo que se reduce a un puntero a int
. Esto es bueno, porque f
espera un puntero a int
, por lo que la definición y el uso de la función coinciden. Lo que se pasa a f()
es el puntero al primer elemento de a
(&a[0]
).
En el caso de
int a[]={1,2,3,4};
int b[4] = a;
El nombre b
se utiliza en un contexto de objeto, y no se reduce a un puntero. (Por cierto, aquí a
es en un contexto de valor, y se reduce a un puntero.)
Ahora, int b[4];
asigna pena de almacenamiento de 4 int
s y le da el nombre b
a ella. a
también se le asignó un almacenamiento similar. Entonces, en efecto, la asignación anterior significa, "Quiero que la ubicación de almacenamiento sea la misma que la ubicación anterior". Esto no tiene sentido.
Si desea copia el contenido de a
en b
, entonces se podría hacer:
#include <string.h>
int b[4];
memcpy(b, a, sizeof b);
O, si desea un puntero b
que apuntaba a a
:
int *b = a;
Aquí, a
está en contexto de valor y se reduce a un puntero a int
, por lo que podemos asignar a
a un int *
.
Por último, al inicializar una matriz, puede asignarle valores explícitos:
int a[] = {1, 2, 3, 4};
Aquí, un 4 elementos, ha inicializado a 1, 2, 3 y 4. También puede hacer :
int a[4] = {1, 2, 3, 4};
Si hay menos elementos de la lista que el número de elementos de la matriz, a continuación, el resto de los valores se toman a ser 0:
int a[4] = {1, 2};
conjuntos a[2]
y a[3]
a 0.
El título de la pregunta debe ser reescrito, el actual es excesivamente genérico y minúsculo. –