¿Ambos enunciados significan lo mismo que p apunta a la ubicación de la dirección 10? En la compilación, la primera inicialización da alguna advertencia. ¿Cuál es el significado de eso?
#include <stdio.h> int main() { int *p = 10; int *q = (int *)10; return 0; }producción:
warning: initialization of 'int *' from 'int' makes pointer from integer without a cast [- Wint-conversion]Ambos casos convierten el número entero 10 en un tipo de puntero que se utiliza para inicializar un int * . El elenco en el segundo caso hace explícito que este comportamiento es intencional.
Si bien se permite la conversión de un número entero a un puntero, el operador de asignación (y, por extensión, la inicialización) no permite específicamente esta conversión, por lo que se requiere una conversión para que sea conforme. Sin embargo, muchos compiladores aún permitirán esto y simplemente emitirán una advertencia (como aparentemente lo hace).
Tenga en cuenta, sin embargo, que intentar usar un puntero al que se le asigna un valor numérico específico probablemente provocará un bloqueo, a menos que esté en un sistema integrado que admita la lectura o escritura de direcciones de memoria específicas.
int *p = 10; es incorrecto (violación de la restricción), y el compilador debe generar un mensaje de diagnóstico. El compilador podría rechazar el programa y no hay comportamiento definido si no lo hace. La regla es que el inicializador de un puntero debe ser un valor de puntero compatible o una constante de puntero nulo.
int *q = (int *)10; significa convertir el entero 10 en un puntero. El resultado está definido por la implementación y podría ser una representación de trampa, lo que significa que la inicialización provoca un comportamiento indefinido si la ejecución llega a esta línea.
int y apuntador a un entero int* son tipos diferentes. El 10 en la primera línea es un int que está tratando de asignar a un puntero de tipo int. De ahí la advertencia. (en X86 ambos comparten el mismo tamaño, pero considere que en este punto es mayormente una coincidencia).
Al convertir el int en un puntero, como lo hace en la segunda línea, le está diciendo al compilador: "Oye, sé que estos son tipos diferentes, pero sé lo que estoy haciendo, así que adelante, trata el valor 10 como un puntero porque realmente quiero apuntar a la memoria con una dirección de 10". (en casi todos los casos, usted no podrá utilizar la dirección de memoria 10)