Aquí tengo un puntero ptr
a una matriz arr
de 4 enteros. ptr
apunta a toda la matriz. ptr[0]
o *ptr
apunta al primer elemento de la matriz, por lo que sumar 1 a ptr[0]
da la dirección del segundo elemento de la matriz.
No puedo entender por qué usar sizeof(ptr[0])
da el tamaño de toda la matriz, 16 bytes, no el tamaño del primer elemento, 4 bytes, (como ptr[0]
apunta al primer elemento de la matriz).
int arr[4] = {0, 1, 2, 3};
int (*ptr)[4] = &arr;
printf("%zd", sizeof(ptr[0])); //output is 16
int *ptr = arr;
? Eso lo haría apuntar al inicio (primer elemento de) la matriz, que es equivalente a&arr[0]
.int *ptr = arr;
? En realidad no.int (*ptr)[4]
creaptr
como un puntero a una matriz completa de cuatroint
valores. Una sintaxis de puntero como esa es necesaria para asignar dinámicamente matrices multidimensionales verdaderas. Las "matrices bidimensionales" creadas conmalloc()
bucles anidados y descritas erróneamente como matrices multidimensionales son realmente matrices 1-d de punteros a múltiples matrices 1-d. Ver stackoverflow.com/questions/42094465/…Respuestas:
Escriba confusión.
ptr[0]
es una matrizptr
es un puntero a la matriz 4 de int .ptr[0]
, como*ptr
defiende el puntero a una matriz .sizeof(ptr[0])
es el tamaño de una matriz.Con
sizeof(ptr[0])
,ptr[0]
no incurre en la conversión de "una expresión con tipo '' puntero a tipo '' que apunta al elemento inicial del objeto de matriz". (c11dr §6.3.2.1 3). Consizeof
,ptr[0]
es una matriz.fuente
&ptr[0][0]
tieneint *
tipoptr[0]
(convertido implícitamente aint *
) evaluaría la dirección del primer elemento int.printf("someforamt", ptr[0] , ptr[0]+1)
hace algo diferente asizeof(ptr[0])
. Enptr[0]
el primer caso pasa por una conversión implícita. Consizeof(ptr[0])
,ptr[0]
no lo hace.ptr
aquí es de tipopointer to an array of 4 int elements
y el tipo de matriz tiene un tamaño 16 en su plataforma (sizeof (int) * (número de elementos)).porque el sistema de tipo C tiene tipos de matriz. Aquí ambos
arr
y lo*ptr
tiene. Lo que declaras que tienes. Para obtener sizeof int aquí debe sizeof (ptr [0] [0]) - donde ptr [0] se evalúa como matriz.fuente
con
int (*ptr)[4] = &arr ;
usted tiene un puntero a una matriz de cuatro enteros y apunta a arr.ptr
ahora apunta aarr
, como un puntero doble. Podemos acceder a elementos delarr
uso deptr[0][x]
wherex
podría ser0
a4
.Entonces
sizeof(ptr[0])
es igual quesizeof(arr)
fuente
Por definición,
ptr[0]
es lo mismo*(ptr + 0)
que a su vez es lo mismo que*ptr
. Además,ptr
se inicializa con&arr
, así*ptr
es*&arr
y eso es justoarr
. Tenga en cuenta que el almacenamiento intermedio de&arr
inptr
hace no realiza ninguna descomposición de matriz, por lo que la equivalencia se mantiene y no información de tipo se pierde.Tenga en cuenta que todo esto se calcula en tiempo de compilación, solo para evitar este escollo adicional.
fuente