Witam i witam ponownie.
Jesteśmy w nowej sekcji. Ta sekcja nazywa się wskaźniki.
To chyba najważniejsza część kursu.
To także prawdopodobnie najtrudniejsza część kursu. Pojęcie wskaźników
ic jest podchwytliwym, podstępnym pojęciem.
Ale zamierzamy przejść przez to naprawdę wolno.
Będziemy prowadzić wiele wykładów i krok po kroku.
Zaczniemy od najwyższego poziomu i będziemy wchodzić w coraz więcej szczegółów.
Musisz zrozumieć wskazówki, jeśli chcesz w pełni wykorzystać
język c. Więc to jest bardzo ważne.
Zacznijmy więc od góry i porozmawiajmy o tej koncepcji pośrednictwa, która
jest zasadniczo tą samą koncepcją co wskaźnik.
Wskaźniki są więc bardzo podobne do koncepcji pośrednictwa.
W swoim codziennym życiu stosujesz pośrednictwo. Na przykład, jeśli
opiszę, co oznacza pośrednictwo, to byłoby tak,
jakbyś musiał kupić coś nowego, nowy produkt w swojej firmie.
Załóżmy na przykład, że musisz kupić nowy wkład atramentowy do drukarki.
Jeśli pracujesz w dużej firmie, prawdopodobnie będziesz musiał
przejść przez określony dział, aby
kupić nowe zakupy. Więc prawdopodobnie udałbyś się do działu zakupów.
Prawdopodobnie zadzwoniłbyś do kogoś w celu
zakupu i poprosiłby o zamówienie nowego wkładu.
Ich zadaniem byłoby znalezienie lokalnego sklepu,
który oferuje rzeczywisty przedmiot, który chcesz zamówić.
A to oznacza, że nie wybierasz się i nie zamawiasz tego produktu bezpośrednio samodzielnie.
Prosisz kogoś, żeby zrobił to za Ciebie.
A potem, dzięki swojej wiedzy i wiedzy na temat tego,
kto ma ten produkt w magazynie, zwracają go
do Ciebie.
Więc to jest poziom pośrednictwa dotyczący ciebie. Nie idź dalej i po
prostu idź do sklepu i go kup. Idziesz do działu zakupów, dział
tej osoby wie, że idzie i robi wszystko za Ciebie.
To jest ta sama koncepcja wskaźnika w programowaniu.
W językach programowania pośrednictwo to możliwość odniesienia się do czegoś przy
użyciu nazwy, odwołania lub kontenera zamiast samej wartości.
Używamy formy interakcji, używając nazw zmiennych.
Nie używamy adresu pamięci do uzyskiwania dostępu do danych.
Używamy nazwy zmiennej.
Najbardziej powszechną formą pośrednictwa jest operowanie wartością poprzez
jej adres pamięci.
Więc oprócz bardzo krótkiego
opisu pośredniego, używającego nazwy zmiennej do reprezentowania adresu pamięci, możesz również
manipulować wartością poprzez jej adres pamięci, używając samego adresu.
sam adres.
Tak więc wskaźnik zapewnia pośredni sposób dostępu do wartości określonego elementu danych.
Jest to zmienna, której wartością jest adres pamięci i
jest to niezbędne do zrozumienia.
Do tej pory nauczyliśmy się zmiennych, które zawierają
określone typy danych, liczby,
znaki, liczby podwójne, zmiennoprzecinkowe z liczbami wymiernymi.
Teraz będziemy mieć zmienną, która
nie przechowuje żadnych danych tego typu.
Typ magazynów danych to adres pamięci.
Adres pamięci będzie reprezentowany jako liczba całkowita, liczba
szesnastkowa, ale nadal
będzie to adres pamięci.
Będzie to więc wartość
adresu i innej lokalizacji pamięci, jeśli jest to istniejąca
zmienna lub nowa lokalizacja, którą przydzielasz dynamicznie.
Tak więc, jak istnieją powody, dla których warto udać się
do działu zakupów w celu zamówienia
nowych wkładów, nie musisz na przykład wiedzieć, w którym sklepie są zamawiane.
Istnieją również dobre powody, dla których warto używać
wskaźników oraz c. Aby użyć tych zmiennych, które reprezentują adres, adres pamięci.
O adresach pamięci rozmawialiśmy na samym początku kursu.
I jak za każdym razem, gdy uruchamiasz program i tworzysz zmienne, są one przechowywane w pamięci.
A ta pamięć ma określony adres. Musisz znać adres, aby odzyskać
te dane, tak jak musisz znać adres domu, jeśli zamierzasz gdzieś jechać,
lub adres lokalizacji.
Zatem używanie wskaźników w programie jest jednym z najpotężniejszych narzędzi dostępnych w języku c.
Dlatego ważne jest, aby zrozumieć.
Każdy program w c, który jest treściwy, będzie używał wskaźników.
Musisz więc zrozumieć tę koncepcję.
A dla programistów, którzy zaprogramowali bardziej nowoczesne języki,
takie jak java lub cis, niekoniecznie musisz
się tym martwić, ponieważ
cała alokacja pamięci i nie ma
prawdziwej koncepcji wskaźników.
Chociaż pod maską
java używa wskaźników, ponieważ mają kopie odniesień.
To ten sam rodzaj koncepcji. Ale w c
masz jawnie zmienną, która reprezentuje adres.
Wskaźniki są również jednym z najbardziej zagmatwanych pojęć języka c.
Często są nadużywani,
nie są w pełni rozumiani, zwłaszcza przez nowych programistów.
Dlatego ważne jest, abyś zrozumiał tę koncepcję na początku i
miał jasny obraz tego, co się dzieje, gdy
wchodzisz w coraz bardziej zaawansowaną koncepcję wskaźników c i coraz bardziej zaawansowaną koncepcję wskaźników.
Więc jeśli nie rozumiesz tego na początku,
ucz się, studiuj, ucz się, ćwicz pisanie kodu ze wskaźnikami.
Kompilator musi znać typ danych przechowywanych w
zmiennej, na którą wskazuje. Jest to więc jak
zwykła zmienna i musisz określić typ danych podczas tworzenia wskaźnika.
Kompilator musi wiedzieć, że jest to ten sam powód dla
zmiennych, musi wiedzieć, ile danych ma przydzielić, nawet jeśli wskazujesz na niektóre dane.
Każdy wskaźnik będzie powiązany z określonym typem zmiennej.
Może być używany tylko do wskazywania na
zmienne tego typu, podamy przykład, gdy mówimy o definiowaniu wskaźnika.
Na przykład wskaźniki typu wskaźnik
do niego mogą wskazywać tylko na zmienne typu int.
Ponownie, zmienna ma
wartość adresu, to jest wskaźnik.
Ten adres może zawierać wartość gdzieś w pamięci.
Wskaźniki typu pointer to float mogą wskazywać tylko na zmienne typu float.
Oto przykład
ilustrujący koncepcję wskaźnika.
Nie przejmuj się tutaj składnią.
Omówiliśmy to pokrótce w poprzednich wykładach, ten znak ampersand i ta gwiazdka, nie
musisz się tym koniecznie martwić. Chciałbym, żebyście tutaj zwrócili
uwagę na to, jak wskaźnik ma adres, a ten adres
może zawierać wartość, ale znajdować się gdzie indziej w pamięci.
W tym przykładzie tworzymy zwykłą liczbę, utworzyliśmy
milion razy, a następnie widzisz tę składnię z gwiazdką, która oznacza,
że jest to wskaźnik. Omówimy to szczegółowo.
Widoczny jest również znak ampersand, który oznacza, że jest to adres.
Więc w tym przykładzie, kiedy tworzymy ten wskaźnik typu int
p number, przypisujemy adres. Pamiętaj, że wskaźniki mogą przechowywać tylko adresy.
A jak to jest w rzeczywistości ułożone
w pamięci, masz numer
nazwy zmiennej, a liczba ma wartość 99.
Numer ma również adres w pamięci.
Ten adres w pamięci jest wartością wskaźnika.
Więc liczba p jest wskaźnikiem wskazującym na adres 1008.
1008 ma wartość 99, zawiera również
numer zmiennej.
Więc to jest to, do czego zmierzamy. Jeśli nie jest to jasne, musisz patrzeć na
to przez godzinę i upewnić się, że to rozumiesz.
Ponownie, punkt jest wskaźnikiem, który ma wartość do
adresu, to właśnie przechowuje.
Następnie możesz faktycznie uzyskać dostęp do wartości w tym adresie, używając określonej składni.
Po co więc używać wskaźników, po co w ogóle poruszać tę koncepcję,
dlaczego nie możemy po prostu
użyć istniejących typów danych, których używamy i tablicy znaków, gdy chcemy używać ciągów.
Cóż, dostęp do danych za pomocą samych zmiennych jest bardzo ograniczający.
Dzięki wskaźnikom możesz uzyskać dostęp do dowolnej lokalizacji, możesz na przykład traktować
dowolną pozycję pamięci jako zmienną, a następnie możesz wykonywać działania
arytmetyczne również ze wskaźnikami, co ułatwia pracę.
Wskaźniki w c ułatwiają używanie tablic i
ciągów znaków, i to również przejdziemy, to kolejna zaleta używania wskaźników.
Wskaźniki pozwalają odnosić się do tej samej przestrzeni i pamięci w wielu lokalizacjach.
Oznacza to, że możesz zaktualizować pamięć w
jednym miejscu, a zmianę można zobaczyć z innego miejsca w programie.
Jest to rodzaj korzystania z danych globalnych, ale wciąż posiadających hermetyzowane funkcje.
Możesz także zaoszczędzić dużo miejsca w pamięci, mając możliwość współużytkowania komponentów
w strukturach danych.
Pamiętaj więc, że kiedy wynaleziono c, wynaleziono c w latach 70-tych.
Idea c miała być bardzo wydajna i mieć niski poziom.
Idea bezpośredniego dostępu do pamięci przez wskaźniki jest
bardzo wydajna,
a także bardzo szybka.
Wskaźniki pozwalają także funkcjom modyfikować dane przekazywane im
jako zmienne. Jest to przekazywane przez odniesienie. Będziemy mieć wykład na ten temat.
Tutaj możesz przekazywać argumenty do funkcji za pomocą wskaźników.
A następnie wewnątrz funkcji, kiedy zmienisz te
dane, zmiana zostanie odzwierciedlona poza tą funkcją.
Nie musimy więc już korzystać z danych globalnych.
Możemy użyć danych wewnątrz funkcji, przekazać te dane
jako wskaźnik, a następnie te dane poza tą
funkcją zostaną przydzielone. Więc nie ma wady używania
zmiennych globalnych, w których wszystko jest ściśle powiązane, możesz
ograniczyć to tylko do danych, które potrzebują tylko funkcji, które muszą znać te dane.
Jak wspomniałem, można go również wykorzystać do optymalizacji programu, aby działał szybciej
i zużywał mniej pamięci niż w
innym przypadku, co jest
ważną koncepcją, szczególnie w osadzonych programach czasu rzeczywistego.
Wskaźniki pozwalają nam również uzyskać wiele wartości z funkcji.
Rozmawialiśmy o funkcjach, w jaki sposób można przekazywać funkcje danych.
Rozmawialiśmy również o tym, jak możesz zwrócić dane.
Wiemy, że w tej chwili z funkcji można zwrócić tylko jedną wartość.
Ale jeśli używasz wskaźników, możesz w rzeczywistości zwrócić wiele wartości z funkcji.
I o tym porozmawiamy. To duża zaleta.
Porozmawiamy również o dynamicznej alokacji pamięci.
Teraz, kiedy tworzymy pamięć dla programu, kompilator
robi to niejawnie, kiedy deklarujesz zmienną.
Jeśli deklarujesz zmienną int, automatycznie tworzy ona na przykład 4 bajty dla tej zmiennej.
Gdy używasz tablic i określasz rozmiar tablicy,
ten rozmiar jest przydzielany w czasie kompilacji.
Więc jeśli próbujesz przechowywać więcej danych, masz spieprzone, twój
program nie zadziała.
Ale gdybyś miał możliwość stworzenia takiej
ilości pamięci, ile potrzebujesz w czasie wykonywania, byłoby
to ogromne. A wskazówki pozwalają ci to zrobić.
Umożliwiają tworzenie dynamicznej alokacji pamięci w czasie wykonywania.
O tym też będziemy rozmawiać.
Wskaźniki pozwalają nam projektować i rozwijać bardziej złożone struktury danych.
A struktura danych to coś, co przechowuje dane.
Przykładami struktur danych są stos pamięci cue lub połączona lista.
I możemy je stworzyć o wiele łatwiej za pomocą wskaźników.
Wskaźniki zapewniają bezpośredni dostęp do pamięci, ponownie, wydajnie i szybko.
Więc wskazówki będą wielką koncepcją. Będziemy mieć wiele wykładów na temat wskaźników.
Chcę, żebyście się skupili i zwracajcie uwagę, kiedy mówię o tych wszystkich koncepcjach,
ponieważ jest to ważne i niezbędne do zrozumienia języka programowania c.
Powodzenia i zaczynajmy. Dziękuję Ci.