Imprimir la Dirección que contiene un Puntero en C


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 corregir se.

/* 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 estoy publicando esto (y la razón por la que es importante que sea correcto) es que eventualmente necesito hacer esto para un puntero a un puntero. Es decir:

const Emp** emp1 = (const Emp**) item1; 
Author: Matt, 2009-06-29

6 answers

Lo que tienes es correcto. Por supuesto, verás que emp1 y item1 tienen el mismo valor de puntero.

 25
Author: Don Neufeld,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-28 22:53:17

Para imprimir la dirección en puntero a puntero:

printf("%p",emp1)

Para desreferenciar una vez e imprimir la segunda dirección:

printf("%p",*emp1)

Siempre puede verificar con debugger, si está en linux use ddd y muestre memoria, o simplemente gdb, verá la dirección de memoria para que pueda comparar con los valores en sus punteros.

 36
Author: stefanB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-28 22:53:28

Creo que esto sería lo más correcto.

printf("%p", (void *)emp1);
printf("%p", (void *)*emp1);

printf() es una función variádica y se deben pasar argumentos de los tipos correctos. El estándar dice %p toma void *.

 14
Author: sigjuice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-15 01:40:30

Dado que ya parece haber resuelto la visualización básica de la dirección del puntero, así es como verificaría la dirección de un doble puntero:

char **a;
char *b;
char c = 'H';

b = &c;
a = &b;

Usted sería capaz de 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);
 9
Author: Luca Matteis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-28 23:17:24
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 dirección: 3216245375

 4
Author: 4pie0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-09 10:34:03

He estado en esta posición, especialmente con el nuevo hardware. Te sugiero que escribas tu propia rutina. Podrá ver los datos y las direcciones en las que se encuentran, todos juntos. Es una buena práctica y un generador de confianza.

 0
Author: gbarry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-29 03:18:07