Zupełnie out-of-order nagrałem dodatkową miniserię podcastów (a w zasadzie videocastów) o pointerach (wskaźnikach) w C/C++. Seria trwa łącznie ponad 4 godziny i jest rozbita na 8 odcinków, w których staram się pokazać/wytłumaczyć czym jest pointer (adres+metadane), jakie narzędzia na poziomie składni udostępnia język do operowania na pointerach, jak i po co castować pointery (jest i krótka dygresja o strict aliasing rule), po co ich używać, a także jak napisać programik który wylistuje regiony pamięci używane przez aplikację.

Lista odcinków:
Pointery #1 (30 min) - Odcinek pierwszy, w którym staram się wytłumaczyć czym jest adres i pamięć procesu.
Pointery #2 (54 min) - Odcinek drugi, w którym omawiam składnie pointerów.
Pointery #3 (21 min) - Odcinek trzeci o arytmetyce na pointerach (ważne) i castowaniu.
Pointery #4 (26 min) - Odcinek czwarty o castowaniu, void*, "stringach", etc.
Pointery #5 (28 min) - Odcinek piąty o dostępie do "surowego" zapisu danej zmiennej (float'a) w pamięci, oraz o tym dlaczego struktury są wyrównywane (i o operacjach atomowych i nie-atomowych na zmiennych).
Pointery #6 (33 min) - Odcinek szósty o alokacji i uwalnianiu pamięci w C i C++, a także o popularnych błędach z tym związanych, oraz o operowaniu na blokach pamięci (memset, memcpy, memove, memcmp).
Pointery #7 (22 min) - Odcinek siódmy, w którym wspominam o pointerach w strukturach danych, o tym jak ich używać (składniowo), oraz o tym, że nie powinno się zapisywać pointerów do pliku (zamiast tego zapisuje się indeksy, offsety, czy identyfikatory).
Pointery #8 (36 min) - Odcinek ostatni, w którym pokazuje jak napisać program listujący zaalokowane (i wolne) regiony pamięci w kontekscie naszego procesu.
UPDATE: Pointery #9 (31 min) - Odcinek uzupełniający, w którym pokazuje cztery metody alokacji dynamicznej tablic 2D, oraz o tym jak takowe tablice przekazać do funkcji (i jakie dane należy przekazać razem z nimi).

Dodatkowo, osoby zainteresowane zachęcam do obejrzenia odcinku ReverseCraft o tym co znajduje się w pamięci procesu:
ReverseCraft #3 - Pamięć, proces i PE (32 min) - Trzeci odcinek kursu, w którym omawiam wirtualną przestrzeń procesu, mechanizmy nią kierujące, oraz co się w niej znajduje. Dodatkowo wspominam o mechaniźmie wczytywania pliku PE (czy to modułu (biblioteki) DLL czy modułu EXE) do pamięci procesu. Materiały uzupełniające.

Oraz zachęcam do rzucenia okiem na przykładową implementacje struktury danych (aka wykorzystanie pointerów w praktyce):
Code #3 - linked list: dodawanie, przechodzenie (13 min) - Jednokierunkowa linked lista: co to, dodawanie elementów, przechodzenie listy.
Code #4 - linked list: usuwanie elementu (12 min) - Jednokierunkowa linked lista: usuwanie elementu.
Code #5 - linked list: API, iteratory (10 min) - Jednokierunkowa linked lista: tworzenie API do przechodzenia tablicy, część 1 z 3: iteratory.
Code #6 - linked list: API, zrzut do tablicy (14 min) - Jednokierunkowa linked lista: tworzenie API do przechodzenia tablicy, część 2 z 3: zrzut do tablicy (arraya), zarówno alokowanej dynamicznie, jak i dostarczonej przez usera.
Code #7 - linked list: API, callback (8 min) - Jednokierunkowa linked lista: tworzenie API do przechodzenia tablicy, część 3 z 3: callback do funkcji podanej przez usera.

Dodatkowe, mniej związane, materiały:
FAQ #3 - Asmloader internals (16 min) - Czyli o tym jak działa asmloader od wewnątrz.
Zachęcam również do przejrzenia źródeł HiperDrop.

GG.

Comments:

2011-07-17 21:25:35 = marcin
{
Ty chyba nie musisz spać :)
}
2011-07-17 22:09:59 = Paweł Goleń
{
No właśnie, zgadzam się z przedmówcą. Czy możesz mi wytłumaczyć JAK znajdujesz na to wszystko czas?! :)
}
2011-07-18 00:22:37 = WhiteLightning
{
Przyłączam się do pytania, jak to robisz że pracując na etacie, majac inne zainteresowania, masz czas tworzyc tyle ciekawych postow i podcastow, w dodatku trzymajacych poziom?
}
2011-07-18 03:29:01 = olo16
{
Człowiek sobie myśli "pointer, jaki jest, każdy widzi, ile można powiedzieć o pointerach?", a okazuje się że można całkiem sporo i to różnych rzeczy a nie ciągłego powtarzania.

Naprawdę, dobra robota, jak zwykle ;) .
}
2011-07-18 08:25:57 = marcin
{
Jedna z hipotez mówi, iż GYM to nie jedna osoba, ale cały zespół. Na wzór innego tworu, jakim był LEM. Przynajmniej tak twierdził P.K.Dick.

Wracają do tematu, rewelacyjne wykłady.
}
2011-07-18 10:52:43 = Karton
{
@marcin
Mi się wydaje, że Gynvael napisał program kopiujący go do kompa.
W ten sposób on ma czas jeść, spać, czy przebywać z dziewczyną¹ i jednocześnie robić to wszytko co robi.

¹Która dziewczyna pozwala na siedzenie przed kompem całymi dniami?
Myślę, że to ona podsunęła pomysł kopii.
}
2011-07-18 15:18:26 = Arvangen
{
Gynvael nie istnieje - jest jak św.Mikołaj dla koderów ( albo jak Slash w South Parku ).

A może to po prostu stara dobra bilokacja?
}
2011-07-19 12:55:23 = Gynvael Coldwind
{
@marcin, Pawel, WhiteLightning, Karton, Arvangen
Widac to kwestia punktu widzenia. Mi osobiscie sie wydaje, ze sporo czasu marnuje i moglbym jednak wiecej rzeczy robic. Hehe, niemniej jednak ciesze sie, ze z Waszego punktu widzenia nie wyglada to tak zle jak z mojego :D

Btw, nie dziewczyna, zona :)

@olo16
:D
}
2011-07-19 22:32:06 = Nism0
{
Hi.

Fajnie że trzymasz tempo podcastów i postów Gyn, jest co czytać ;) Szkoda tylko że ostatnio mało się pojawia twoich "gazetkowych" publikacji. Ad seria podcastów : heh, what can I say, keep the fire burnig (jak to kiedyś "znajomy" mi powiedział ;D ) Gw !

PS : To others : Gyn ma swojego klona, ale cii, żeby się nie dowiedział że o tym wspomniałem (Gynvael nie widzi tej wiadomości ;D )
}
2011-08-03 17:24:01 = .
{
Nikomu nie przyszło do głowy, że Gyn to Ubik?
}
2011-08-03 22:47:24 = Salv
{
Gyn się już dawno temu sklonowal ;)
}
2011-08-08 22:15:48 = mijagi
{
Graaaaatz : - )
}
2011-09-14 10:05:57 = HAL9000
{
Nie wiem jak u innych ale w moim przypadku instrukcję
[code]memcpy(d, (void*)s, 4);[/code]
należy zastąpić następującą wersją
[code]memcpy(d, &s, 4);[code]
lub na siłę
[code]memcpy(d, (void*)&s, 4);[/code]
w przypadku gdy s nie jest wskaźnikiem a zwykłym obiektem jakiegoś typu ;-)

}

Add a comment:

Nick:
URL (optional):
Math captcha: 1 ∗ 10 + 6 =