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ć.
/* 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 );
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:
const Emp** emp1 = (const Emp**) item1;
c
pointers
memory-address
Frank V
źródło
źródło
Odpowiedzi:
To, co masz, jest poprawne. Oczywiście zobaczysz, że emp1 i item1 mają tę samą wartość wskaźnika.
źródło
Aby wydrukować adres we wskaźniku do wskaźnika:
printf("%p",emp1)
aby raz wyłuskać i wydrukować drugi adres:
printf("%p",*emp1)
Zawsze możesz zweryfikować za pomocą debuggera, jeśli używasz Linuksa
ddd
i wyświetlasz pamięć, lub po prostugdb
, zobaczysz adres pamięci, dzięki czemu będziesz mógł porównać z wartościami w swoich wskaźnikach.źródło
Uważam, że byłoby to najbardziej poprawne.
printf("%p", (void *)emp1); printf("%p", (void *)*emp1);
printf()
jest funkcją wariadyczną i muszą być przekazywane argumenty odpowiednich typów. Standard mówi, że%p
bierzevoid *
.źródło
void *
jest rzeczywiście wymagany.Ponieważ wydaje się, że rozwiązałeś już podstawowe wyświetlanie adresu wskaźnika, oto jak sprawdzić adres podwójnego wskaźnika:
char **a; char *b; char c = 'H'; b = &c; a = &b;
Możesz uzyskać dostęp do adresu podwójnego wskaźnika
a
, wykonując:printf("a points at this memory location: %p", a); printf("which points at this other memory location: %p", *a);
źródło
printf("which contains this value: %c\n" **a);
chciałem tylko to dodać ^. ^.char c = 'A'; printf("ptr: %p,\t value: %c,\t and also address: %zu",&c, c,&c);
wynik:
źródło
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.
źródło