Skocz do zawartości

Poprawne zrozumienie wskaźników


Mastodont

Pomocna odpowiedź

Witam wszystkich, 

Jako, że moja głowa nie potrafi korzystać z rozwiązań, których działania nie pojmuje, proszę o potwierdzenie moich wniosków na temat wskaźników. 

Fragment kodu: 

void loop() 
{
int a = 10;
int *b = &a;
 Serial.print(F("0x")); Serial.println((int)b, HEX);
  Serial.print(F("0x")); Serial.println((int)&b, HEX);
   Serial.print(F("0x")); Serial.println((int)*b, HEX);
  Serial.print(F("0x")); Serial.println((int)a, HEX);
  Serial.print(F("0x")); Serial.println((int)&a, HEX);
}

(b)        0x8FA Kiedy przypisujemy int *b = &a, to b otrzymuje adres a, gdyż b jest wskaźnikiem
             przechowującym ( wskazującym na) adres innej zmiennej; 
(&b)      0x8F8 to jest adres wskaźnika b
(*b)       0xA to jest wartość a wyłuskana z wskaźnika b
(a)         0xA to jest po prostu wartość a
(&a)       0x8FA  to jest adres a

Czy jest to poprawny tok rozumowania?

Link do komentarza
Share on other sites

6 godzin temu, Mastodont napisał:

Czy jest to poprawny tok rozumowania?

Jak najbardziej.

Proponuję w następnym etapie zapoznać się z funkcjami sprintf i printf - niesamowicie ułatwiają życie 🙂

np.:

printf("%x %p\n", a, &a);

 

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

@Mastodont tak dobrze myślisz, w ramach uzupełnienia:

adres wskaźnika to też zmienna na którą możesz mieć wskaźnik. Typ wskaźnika to np int * jak w zmiennej b, możesz zrzutować wskaźnik zmieniając tym samym wielkość bloku danych jaki bierzesz pod uwagę. Więcej w tym artykule:

 

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

12 minut temu, Mastodont napisał:

Czyli jak rozumiem, jeśli mamy z góry ustaloną tablice z danymi, to za pomocą wskaźników, możemy operować na adresach, co pozwala na więcej, niż dany typ zmiennej jest w stanie pomieścić. 

Trochę nie mogę załapać, ale ogólnie wskaźniki pozwalają na dużo bo jeden wskaźnik może wskazywać w danym momencie na co chcesz (możesz go rzutować) przydaje się np. wtedy jeśli masz jakąś funkcje w której obrabiasz zmienną, a masz 10 takich zmiennych tego samego typu, no możliwości są bardzo duże, choć mi osobiście jeszcze się nie zdarzyło użyć tablicy wskaźników 😉

Link do komentarza
Share on other sites

char *letters[] =
 {
  ".-","-...","-.-.","-..",".",
  "..-.","--.","....","..",
  ".---","-.-",".-..","--","-.",
  "---",".--.","--.-",".-.",
  "...","-","..-","...-",".--",
  "-..-","-.--","--.."
 }; 

Kawałek kodu, który ma za zadnie stworzyć tablice do alfabetu Morse'a. 

Moje pytanie, czemu char, a nie na przykład tablica int bez wskaźnika?

Czy ten zapis mam rozumieć jako stwórz 26 elementową tablice, w której są zapisane adresy tych stałych(kropek i kresek)?

Link do komentarza
Share on other sites

15 minut temu, Mastodont napisał:
char *letters[] =
 {
  ".-","-...","-.-.","-..",".",
  "..-.","--.","....","..",
  ".---","-.-",".-..","--","-.",
  "---",".--.","--.-",".-.",
  "...","-","..-","...-",".--",
  "-..-","-.--","--.."
 }; 

 

Moje pytanie, czemu char, a nie na przykład tablica int bez wskaźnika?

Bo to są ciągi a nie pojedyńcze zmienne więc int nie może tu być zastosowany... każda kropla/kreska to jeden znak a masz ich kilka w cudzysłowiu...

  • Lubię! 2
Link do komentarza
Share on other sites

20 minut temu, Mastodont napisał:

Moje pytanie, czemu char, a nie na przykład tablica int bez wskaźnika?

https://www.tutorialspoint.com/cprogramming/c_strings.htm

char[] = char*

char* [] = char**

Nie jest to tablica znaków, tylko tablica stringów (ciągów znaków).

Edytowano przez H1M4W4R1
  • Lubię! 2
Link do komentarza
Share on other sites

27 minut temu, Mastodont napisał:
 

 

Czy ten zapis mam rozumieć jako stwórz 26 elementową tablice, w której są zapisane adresy tych stałych(kropek i kresek)?

Ja tylko dodam że to jest właśnie dobry przykład użycia tablicy wskaźników (której jeszcze nie używałem 😜) to jest tablica 26 wskaźników które wskazują na ciągi (taka tablica tablic)

Link do komentarza
Share on other sites

Dnia 14.10.2022 o 21:59, Mastodont napisał:
char *letters[] =
 {
  ".-","-...","-.-.","-..",".",
  "..-.","--.","....","..",
  ".---","-.-",".-..","--","-.",
  "---",".--.","--.-",".-.",
  "...","-","..-","...-",".--",
  "-..-","-.--","--.."
 }; 

Kawałek kodu, który ma za zadnie stworzyć tablice do alfabetu Morse'a. 

Moje pytanie, czemu char, a nie na przykład tablica int bez wskaźnika?

Czy ten zapis mam rozumieć jako stwórz 26 elementową tablice, w której są zapisane adresy tych stałych(kropek i kresek)?

Wtrącę małe pomocne narzędzie, czyli stronę potrafiącą wizualnie prezentować struktury danych w C - https://pythontutor.com/c.html. Można sobie obejrzeć jak wygląda taka tablica:

tabliczka.thumb.png.55b166be2281ccbdb4c088f86f706f47.png

Każdy taki tekst, tj. C string, to tablica liczb (wszystko w komputerze jest liczbą) typu char, zakończa liczbą 0. Także stworzyłeś tutaj wiele takich tablic, a adresy do nich (czyli ich początku) zapisałeś w tablicy letters.

  • Lubię! 2
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.