Wydrukuj adres lub wskaźnik wartości w C

80

Chcę zrobić coś, co wydaje się dość proste. Otrzymuję wyniki, ale problem polega na tym, że nie mam możliwości sprawdzenia, czy wyniki są prawidłowe.

Pracuję w C i mam dwie wskazówki; Chcę wydrukować zawartość wskaźnika. Nie chcę wyłuskiwać wskaźnika, aby uzyskać wskazaną wartość, chcę tylko adresu, który przechowuje wskaźnik.

Napisałem następujący kod i muszę wiedzieć, czy jest poprawny, a jeśli nie, jak mogę go poprawić.

Podczas gdy to publikuję (i dlatego ważne jest, aby było poprawne) jest to, że ostatecznie muszę to zrobić dla wskaźnika do wskaźnika. To jest:

Frank V
źródło
To, co napisałeś, jest poprawne, jaki dokładnie problem masz?
Luca Matteis
Jak opisałem, uzyskiwałem wyniki, ale nie miałem możliwości dowiedzenia się, czy są one prawidłowe, czy też przynoszą mi śmieci. Don i inni poniżej (a także Ty) potwierdzili, że te wyniki są prawidłowe.
Frank V

Odpowiedzi:

29

To, co masz, jest poprawne. Oczywiście zobaczysz, że emp1 i item1 mają tę samą wartość wskaźnika.

Don Neufeld
źródło
1
Nie będą takie same, jeśli typ item1 jest częścią wielokrotnego dziedziczenia i / lub jest przodkiem Emp, w zależności od tego, jak kompilator przedstawia każdą z klas, które składają się na typ item1.
Jim Buck
2
@Jim: Znacznik „C” sugeruje inaczej
Hasturkun
1
@Jim: Hasturkun ma rację. Pracuję w C. Powinienem to opublikować.
Frank V
39

Aby wydrukować adres we wskaźniku do wskaźnika:

aby raz wyłuskać i wydrukować drugi adres:

Zawsze możesz zweryfikować za pomocą debuggera, jeśli używasz Linuksa dddi wyświetlasz pamięć, lub po prostu gdb, zobaczysz adres pamięci, dzięki czemu będziesz mógł porównać z wartościami w swoich wskaźnikach.

stefanB
źródło
16

Uważam, że byłoby to najbardziej poprawne.

printf()jest funkcją wariadyczną i muszą być przekazywane argumenty odpowiednich typów. Standard mówi, że %pbierze void *.

sigjuice
źródło
Wyobrażam sobie, że są promowani? Nie jestem pewien, czy ktoś może wyjaśnić?
RastaJedi
4
Po pewnych badaniach nie są one automatycznie promowane. Rzut do void *jest rzeczywiście wymagany.
RastaJedi
10

Ponieważ wydaje się, że rozwiązałeś już podstawowe wyświetlanie adresu wskaźnika, oto jak sprawdzić adres podwójnego wskaźnika:

Możesz uzyskać dostęp do adresu podwójnego wskaźnika a, wykonując:

Luca Matteis
źródło
printf("which contains this value: %c\n" **a);chciałem tylko to dodać ^. ^.
RastaJedi
4

wynik:

ptr: 0xbfb4027f, wartość: A, a także adres: 3216245375

4pie0
źródło
0

Byłem w tej sytuacji, zwłaszcza z nowym sprzętem. Proponuję napisać własny mały zrzut szesnastkowy. Będziesz mógł zobaczyć dane i adresy, pod którymi się znajdują, pokazane razem. To dobra praktyka i budująca pewność siebie.

gbarry
źródło
3
kosztem bycia ignorantem - czy mógłbyś wyjaśnić, jak można napisać taką rutynę?
Faisal Vali
1
Także ta odpowiedź może być bardziej odpowiednia jako komentarz?
RastaJedi