Imprime la dirección o el puntero para el valor en C

80

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 consejos; Quiero imprimir el contenido del puntero. No quiero eliminar la referencia del puntero para obtener el valor al que apunta, solo quiero la dirección que ha almacenado el puntero.

Escribí el siguiente código y lo que necesito saber es si es correcto y si no, cómo puedo corregirlo.

Mientras publico 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:

Frank V
fuente
Lo que escribiste es correcto, ¿qué problema estás experimentando exactamente?
Luca Matteis
Como describí, estaba obteniendo resultados pero no tenía forma de saber si los resultados eran correctos o si me estaban dando basura. Don y otros a continuación (así como usted mismo) confirmaron que estos resultados son válidos.
Frank V

Respuestas:

29

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

Don Neufeld
fuente
1
No serán los mismos si el tipo de item1 es parte de una herencia múltiple y / o es un ancestro de Emp, dependiendo de cómo el compilador presenta cada una de las clases que componen el tipo de item1.
Jim Buck
2
@Jim: La etiqueta "C" sugiere lo contrario
Hasturkun
1
@Jim: Hasturkun tiene razón. Estoy trabajando en C. Debería haber publicado eso.
Frank V
39

Para imprimir la dirección de un puntero a otro:

para eliminar la referencia una vez e imprimir la segunda dirección:

Siempre puede verificar con el depurador, si está usando linux, usa dddy muestra la memoria, o simplemente gdb, verá la dirección de la memoria para que pueda comparar con los valores en sus punteros.

StefanB
fuente
16

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

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

sigjuice
fuente
¿Me imagino que son promovidos? No estoy seguro, ¿alguien puede aclararlo?
RastaJedi
4
Después de algunas investigaciones, no, no se promocionan automáticamente. De void *hecho, se requiere un yeso .
RastaJedi
10

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

Podrá acceder a la dirección del puntero doble ahaciendo:

Luca Matteis
fuente
printf("which contains this value: %c\n" **a);solo quería agregar eso ^. ^.
RastaJedi
4

resultado:

ptr: 0xbfb4027f, valor: A, y también dirección: 3216245375

4pie0
fuente
0

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

gbarry
fuente
3
a expensas de parecer ignorante, ¿podría explicar cómo se escribe esa rutina?
Faisal Vali
1
¿También esta respuesta puede ser más adecuada como comentario?
RastaJedi