preguntas simples están muy bien, creo que está bien establecido que el SO está destinado a ser para todos los niveles, no solo una élite.
No hay null
en C (a menos que usted mismo lo defina). La inicialización de un puntero nulo se puede hacer en una de las dos formas siguientes:
int *p = 0;
int *p = NULL;
Si desreferenciar p
después de eso, es muy probable que obtener una violación de acceso (yo creo que es un comportamiento no definido de acuerdo a la norma, así que, realmente, podría pasar cualquier cosa, incluso la aniquilación total del universo, incluso podría seguir funcionando bien, pero no confiaría en eso).
para obtener un puntero a un entero real, sólo tiene que utilizar:
int a = 7;
int *p = &a;
utilizando el operador de dirección.
Re a su edición, no es raro en absoluto, solo necesita visualizarlo. Imaginemos que todas las variables se crean comenzando en la ubicación de la memoria 100 y los enteros y los punteros tienen una longitud de 4 bytes. Rompiendo sus dos situaciones a su forma más simple:
int x = 2;
int *px = 0; int *px = &x;
+-----+ +-----+
px(100): | 0 | x(100) | 2 |
+-----+ +-----+
px(104) | 100 |
+-----+
A continuación, se ejecuta el comando
*px = 7;
en un intento de cambiar la variable a la que apunta px
.
En el lado izquierdo, intentará escribir el valor 7 en la ubicación de memoria 0.Eso es algo malo; muy pocos sistemas le permitirán hacer eso sin fallar, incluso menos lo permitirán sin ningún efecto adverso (algunas versiones de HP-UX realmente funcionaron bien).
En el lado derecho es donde debe pasar. El valor recogido desde px
es 100, por lo que el valor 7 se escribe en esa ubicación de memoria, cambiando x
según lo previsto.
A menudo encuentro imágenes (incluso las primitivas de arte ASCII, ya que no soy Rubens o Botticelli) ayudan a aclarar los conceptos. Espero que haya aclarado un poco para ti.
Estás recibiendo un bloqueo porque int * tmpPtr = 0; es un puntero NULL y no apunta a un segmento de memoria que contiene un int. Básicamente, estás diciendo que este puntero apunta a nada y no puedes copiar enteros que ocupan espacio de memoria en algo que no tiene espacio. int * tmpPtr = &tmp; Está asignando la DIRECCIÓN de la memoria ocupada por tmp a su puntero. Aquí está diciendo que su puntero apunta a la memoria asignada a tmp. Ahora, Copy puede copiar datos en ese espacio porque su puntero apunta a algo que puede usar. –
Sí, eso hace que tenga sentido absoluto! ¡Gracias por la explicación! –