eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaWskaźniki i ich rzutowanie (Język C)Re: Wskaźniki i ich rzutowanie (Język C)
  • Data: 2011-06-27 15:53:35
    Temat: Re: Wskaźniki i ich rzutowanie (Język C)
    Od: Konop <k...@g...pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    W dniu 2011-06-27 07:44, slawek7 pisze:
    > Cześć.
    > Chciałbym Was prosić o pomoc w zrozumieniu wskaźników i ich
    > rzutowania.
    > Niby proste, ale jakoś tego nie rozumiem. Jak rozumieć takie zapisy i
    > dlaczego tak jest to pisane:

    Wskaźnik to jest po prostu zmienna (albo stała ;)), która zawiera ADRES
    jakiejś zmiennej/stałej w pamięci. W sumie adres zmiennej int niczym nie
    różni się od adresu zmiennej char, ALE - zaraz to wyjaśnię ;)..

    > 1. int *p=(int *)&w;

    Deklarujesz zmienną p, której typ to "wskaźnik na int". Teraz
    przypisujesz jej wartość równą adresowi zmiennej w (ten & oznacza, że
    brany pod uwagę jest adres elementu za nim). No i pytanie, jakiego typu
    jest adres w (&w)? Może to być:
    wksaźnik na char (char *)
    wskaźnik na int (int *)
    i wiele wiele innych - ogólnie to nie wiadomo... dlatego robi się
    normalne rzutowanie, gdzie typem docelowym jest "wskaźnik na int" (int
    *) czyli typ taki, jaki ma zmienna p.

    I teraz małe wtrącenie - czym się różni adres zmiennej int od zmiennej
    np. char? NICZYM!! Ale język C dopuszcza zapisy takie jak na przykład
    *(p + 1). W tym kontekscie będzie to wskaźnik na następego inta w
    pamięci!!! Czyli, w przypadku AVRów, gdzie int ma 16 bitów, jeśli
    zmienna w jest pod adresem powiedzmy 0x100, to
    p = 0x100
    (p + 1) = 0x102!!!!
    Gdyby p miało typ char *, to byłoby to 0x100 i 0x101... rozumiesz??

    > 2.
    > unsigned int nCols;
    > unsigned int nRows;
    > unsigned char *pFont;
    > unsigned char *pChar;
    > unsigned char *FontTable[] = {(unsigned char *)FONT6x8,
    > (unsigned char *)FONT8x8,
    > (unsigned char *)FONT8x16};
    > i teraz
    > pFont = (unsigned char *)FontTable[1]; // skoro FontTable[] jest typu
    > unsigned char to po co jeszcze rzutować?

    Nie jest typu unsigned char, tylko typu "wskaźnik na unsigned char",
    moim zdaniem rzutowanie nie jest potrzebne, co nie znaczy, że nie wolno
    go stosować!!! Może z pewnych względów komuś lepiej było tak zapisać?
    Albo ktoś uważał, że taki kod jest o wiele czytelniejszy??

    > nCols = pgm_read_byte(&*pFont);
    > nRows = pgm_read_byte(&*(pFont + 1)); // tych zapisów nie rozumiem
    > & oraz *

    Adres elementu wskazywanego przez pFont oraz adres elementu
    następnego... Moim zdaniem możesz usunąć &* i nic się nie zmieni ;)...
    Nie potrafię Ci powiedzieć DLACZEGO ktoś zastosował taki zapis,
    natomiast nie jest on błędny! Jest jednoznaczny, może tylko
    niepotrzebnie zagmatwany... .

    > FontTable deklarowane są jako: unsigned char FONT8x16[] PROGMEM =
    > {.... itd
    >
    > Oczywiście jest to napisane dla AVR i kompilowane w AVR-GCC


    --
    Pozdrawiam
    Konop

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: