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;
6 answers
Lo que tienes es correcto. Por supuesto, verás que emp1 y item1 tienen el mismo valor de puntero.
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.
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 *
.
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);
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
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.
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