punteros - Imprima la dirección que contiene un puntero en C
que es un puntero en c (6)
Quiero hacer algo que parezca bastante simple. Obtengo resultados pero el problema es que no tengo forma de saber si los resultados son correctos.
Estoy trabajando en C y tengo dos punteros; Quiero imprimir el contenido del puntero. No quiero desreferenciar el puntero para obtener el valor apuntado, solo quiero la dirección que el puntero ha almacenado.
Escribí el siguiente código y lo que necesito saber es si es correcto y si no, ¿cómo puedo corregirlo?
/* item one is a parameter and it comes in as: const void* item1 */
const Emp* emp1 = (const Emp*) item1;
printf("/n comp1-> emp1 = %p; item1 = %p /n", emp1, item1 );
Mientras publico esto (y la razón por la cual es importante que sea correcto) es que eventualmente necesito hacer esto para un puntero a puntero. Es decir:
const Emp** emp1 = (const Emp**) item1;
Como parece que ya ha resuelto la visualización de la dirección del puntero básico, aquí le mostramos cómo verificaría la dirección de un puntero doble:
char **a;
char *b;
char c = ''H'';
b = &c;
a = &b;
Podrías acceder a la dirección del doble puntero a
haciendo:
printf("a points at this memory location: %p", a);
printf("which points at this other memory location: %p", *a);
Creo que esto sería lo más correcto.
printf("%p", (void *)emp1);
printf("%p", (void *)*emp1);
printf()
es una función variadica y debe pasar argumentos de los tipos correctos. El estándar dice que %p
tiene void *
.
He estado en esta posición, especialmente con hardware nuevo. Te sugiero que escribas tu propia rutina de volcado hexadecimal. Podrá ver los datos y las direcciones en las que están, que se muestran todos juntos. Es una buena práctica y un generador de confianza.
Lo que tienes es correcto. Por supuesto, verá que emp1 y item1 tienen el mismo valor de puntero.
Para imprimir la dirección en el puntero al puntero:
printf("%p",emp1)
para eliminar la referencia una vez e imprimir la segunda dirección:
printf("%p",*emp1)
Siempre puede verificar con el depurador, si utiliza Linux ddd
y visualiza la memoria, o simplemente gdb
, verá la dirección de la memoria para que pueda compararla con los valores de los punteros.
char c = ''A'';
printf("ptr: %p,/t value: %c,/t and also address: %zu",&c, c,&c);
resultado:
ptr: 0xbfb4027f, valor: A, y también la dirección: 3216245375