Aquí tengo un puntero ptra una matriz arrde 4 enteros. ptrapunta a toda la matriz. ptr[0]o *ptrapunta 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]creaptrcomo un puntero a una matriz completa de cuatrointvalores. 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 matrizptres un puntero a la matriz 4 de int .ptr[0], como*ptrdefiende 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.ptraquí es de tipopointer to an array of 4 int elementsy 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
arry lo*ptrtiene. 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.ptrahora apunta aarr, como un puntero doble. Podemos acceder a elementos delarruso deptr[0][x]wherexpodría ser0a4.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,ptrse inicializa con&arr, así*ptres*&arry eso es justoarr. Tenga en cuenta que el almacenamiento intermedio de&arrinptrhace 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