Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

(uint8_t*)s wskazniki, rzutowanie, rola "gwiazdki"

endju999 16 Kwi 2018 20:20 297 5
  • #1 16 Kwi 2018 20:20
    endju999
    Poziom 3  

    Witam, mam problem ze zrozumieniem wskazników w nastepującej funkcji:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    chodzi mi głównie o wyrażenie (uint8_t*)s. Rozumiem, że jest to rzutowanie zmiennej s na typ uint8_t. Jakie jest zastosowanie gwiazdki w tym rzutowaniu. Z góry dzięki

    0 5
  • Pomocny post
    #2 16 Kwi 2018 20:51
    tszczesn
    Specjalista-oldradio

    Jest to rzutowanie na wskaźnik do zmiennej typu uint8_t, a nie na zmienną. Ta gwiazdka to oznaczenie wskaźnika. Samo z siebie nic nie robi, powoduje tylko, że kompilator nie rzuca ostrzeżeniem lub błędem.

    0
  • #3 16 Kwi 2018 21:06
    endju999
    Poziom 3  

    Dziękuję, to wiele wyjaśnia. Czyli rozumiem, że do funkcji HAL_UART_Transmit() zostaje przekazany adres. Gdyby było (uint8_t*)*s wówczas przekazywana by była wartość zmiennej na którą wskazuje wskaznik s.

    0
  • #4 17 Kwi 2018 00:04
    tszczesn
    Specjalista-oldradio

    Tak.
    Rzutowanie typów jest zasadniczo dla programisty, bo o ile w przypadku bezpośrednich zmiennych mają one różne typy i w związku z tym rozmiary, to kompilator i tak wie jak konkretna zmienna została zadeklarowana. Ale użycie zmiennej typu X w miejscu gdzie ma być typ Y oznacza prawdopodobną pomyłkę programisty i rzutowanie mówi kompilatorowi, że świadomie używa się innego typu. Szczególnie dotyczy to adresów (wskaźników), które są zawsze takie same, niezależnie od tego na jaki typ wskazują.

    0
  • #5 17 Kwi 2018 08:54
    kinggustav
    Poziom 20  

    Dawno się nie zajmowałem językiem C, ale coś mi się tu nie zgadza. O ile pamiętam to *s jest wartością, a (uint8_t*) wskaźnikiem do określonego typu, czyli
    (uint8_t*)*s nadal będzie wskaźnikiem, a nie wartością. Pokręciłem coś?

    0
  • #6 17 Kwi 2018 14:08
    AndrzejKor
    Poziom 11  

    Oj będzie wskaźnikiem, ale ...
    uint8_t* s;
    :
    wyrażenie (uint8_t*)*s spowoduje, że : wartość wskazywana przez s zostanie przekonwertowana
    na wskaźnik do zmiennej typu uint8_t - i co tu się stanie to Bóg jeden wiedzieć raczy, ale będzie to
    niespodzianka raczej. O ile kompilator tego nie oprotestuje.
    uint8_t ma 8 bitów jak nazwa wskazuje i taka liczba zostanie uzupełniona do 32? bitów zerami i przekazana jako
    wskaźnik (Będzie to adres z zakresu 0 do 0xFF). Na co wskaże na to bęc.

    Z ukłonami
    Andrzej Korycki

    0