Cómo trabaja el operador sizeof en c

Quería saber cómo funciona el tamaño del operador en C. En el código de abajo, estoy esperando obtener la salida 1 pero obteniendo 4. Desde que p apunta a la primera ubicación y en la primera ubicación hay carácter y su tamaño debería ser uno.

main() { char a[9]="amit"; int *p=&a; printf("%d",sizeof((char *)(*p))); } 

No, estás pidiendo el tamaño de un puntero de carácter que es 4 en tu implementación.

Esto se debe a que está cambiando el puntero int p referenciado a un puntero char luego pregunta por el tamaño de eso.

Romperlo:

 sizeof((char *)(*p)) | \__/ | \_ Dereference p to get an int. \___________/ \_____ Convert that to a char * (size = 4). 

Si desea tratar el primer carácter de su int (que es, después de todo, una matriz de caracteres que ha lanzado de todos modos), debe usar:

 sizeof(*((char*)(p))) 

Ese es el puntero int , devuelto a un puntero char , y luego desreferenciado.

Rompiendo eso

 sizeof(*((char *)(p))) | \________/ | \_ Get a char * from p (an int *) \___________/ \_____ Dereference that to get a char (size = 1). 

Está obteniendo el tamaño del resultado del reparto (char *) , que es un char * con un tamaño de 4. Por supuesto, podría haber dicho:

  printf( "%d", sizeof(a[0]) ); 

y uno más bien se pregunta por qué no lo hiciste?

Para la pregunta anterior la respuesta es 4.
Aquí está el tipo de conversión de un puntero entero a un puntero de carácter.
Eso significa que ahora el puntero entero está sosteniendo caracteres.
Para el operador predeterminado sizeof el argumento es int.
Cuando se pasa como sizeof((char *)(*p)) entonces se trata como sizeof('a') . Esta char a es promovida a un int. Es por eso que obtienes 4.

Sí, en un sistema de 32 bits, el fragmento de código debe mostrar que el tamaño de p es 4. En un bit de 16 bits mostraría 2 (no se usa mucho en el mundo de las aplicaciones en estos días, pero se puede usar en un mundo integrado basado en El requisito de un sistema). Ha realizado una conversión a un char , esto afectará la representación de los datos pero no la memoria ocupada por el puntero que apunta a sus datos.