Witam ponownie.
W tym wykładzie chcę zademonstrować nasze
wyzwanie dla arytmetyki wskaźnikowej i używania stałego modyfikatora.
Przywołajmy bloki kodu. Mam zamiar stworzyć nowy projekt. Nazwijmy ten przykład
arytmetyczny z jednym wskaźnikiem.
Więc to, co tutaj zrobimy, to
tak naprawdę ustalimy długość łańcucha za pomocą arytmetyki punktowej.
Więc pierwszą rzeczą, którą chcę zrobić, jest utworzenie deklaracji funkcji.
To zwróci długość łańcucha. Więc będzie miał int
jako typ zwracany. Nazwę to długością łańcucha, a
to będzie wymagało tylko wskaźnika, ale będzie to wskaźnik stały.
Nie chcemy zmieniać wartości tego, na co wskazuje.
Oznacza to, że użylibyśmy stałej jako pierwszego słowa kluczowego,
a następnie określilibyśmy typ, którym jest znak.
I powiedzielibyśmy gwiazda i możemy nazwać to, co tylko zechcemy, sznurek.
Powtarzam jeszcze raz, gdybyśmy zamiast tego umieścili tutaj stałą, oznaczałoby
to, że adres wskaźnika, wartość wskaźnika
nie może się zmienić.
Ale znowu, jest to trochę zbędne i tak naprawdę nie trzeba
tego robić, ponieważ przekazujemy wartość, przekazując wartość przez kopię.
Więc i tak masz kopię adresu, więc nie ma znaczenia, czy go tam zmienisz.
Ale ważne jest, aby zmienić to, na co wskazujesz. Jeśli nie chcesz, aby wartość tego,
co wskazujesz, zmieniała się, na pewno chcesz to robić stale, a to
jest ważne.
Więc teraz wszystko, co musimy zrobić, to stworzyć nasz plik main.
stwórz nasz plik main. Wszystko, co zamierzamy zrobić
w naszym main, to wywołać string
length, funkcję długości łańcucha z różnymi łańcuchami.
Wydrukujmy więc i pamiętajmy, że zwraca on liczbę całkowitą, więc możemy powiedzieć procent d i
wypisujemy po prostu długość kilku przekazanych przez nas ciągów.
Więc nazwiemy string length i po
prostu przekażemy kilka stałych łańcuchów, więc możemy po prostu
wstawić je w podwójne cudzysłowy. Nie musimy nawet tworzyć wskaźników.
Możesz utworzyć wskaźnik i przypisać go, a następnie przekazać, ale musisz
tylko upewnić się, że jest to stała.
Ale ponieważ jest to łatwiejsze przy mniejszej ilości kodu, możemy po prostu powiedzieć test długości łańcucha.
Ponownie, jest to stały ciąg literału.
Przetestujemy to z kilkoma innymi.
Po nim wstawimy spację. Dodajmy kilka nowych linii.
Tutaj nazwiemy długość łańcucha. I faktycznie nazwijmy to pustym ciągiem,
upewnij się, że ustawiliśmy zero. A potem
w trzecim powiemy długość struny, powiemy
po prostu jason.
Nawiasem mówiąc, kiedy je utworzysz i przekażesz łącza o
długości łańcucha, automatycznie dodają do nich terminator zerowy.
Dowiadujemy się tego, kiedy deklarujemy wskazówki.
To jedna z zalet. Jeśli zamierzasz utworzyć wskaźnik i
będzie to literał, nie chcesz określać rozmiaru.
Chciałbyś zrobić coś takiego jak znak, jeśli jest to tablica,
ponieważ tablica jest tablicą jest wskaźnikiem. Ale gdybyśmy nie
chcieli określić rozmiaru, moglibyśmy powiedzieć litera
p, a następnie w tym miejscu moglibyśmy po prostu powiedzieć jason.
Pamiętaj, że lekcja, w której jeśli nie określimy rozmiaru tablic znaków,
automatycznie doda terminator zerowy i utworzy rozmiar za Ciebie.
W ten sposób nie popełnisz żadnych błędów. Jeśli umieścisz rozmiar wewnątrz tablicy,
możesz nie mieć wystarczającej ilości terminatora null.
To samo dzieje się, gdy przekazujemy literał do długości łańcucha,
terminator zerowy jest dodawany na jego końcu.
Mogliśmy więc utworzyć te zmienne na
początku i zrobić coś takiego, a następnie przekazać
w każdej z nich.
Ale nie chciałem tracić czasu na tworzenie zmiennych. Więc po prostu to zrobię.
Teraz naprawdę ważna dla tego kodu jest funkcja.
Więc utworzymy naszą długość łańcucha. Pamiętaj, zwraca liczbę całkowitą
i będzie stałą. Możemy więc po prostu powiedzieć ciąg gwiazd znaków.
Zauważysz również, że nazwa zmiennej deklaracji funkcji
nie musi być zgodna. Mógłbym umieścić to jako struny i to też jest w porządku.
Teraz w tej funkcji musimy utworzyć wskaźnik lokalny, ponieważ wskaźnik lokalny
będzie wskazywał koniec ciągu. A kiedy już mamy
adres końca łańcucha, możemy odjąć adres początku łańcucha.
Przekazywany jest adres początku łańcucha.
Ciąg będzie automatycznie wskazywał na pierwszy element tablicy lub
pierwszy adres tablicy.
Więc jeśli utworzymy lokalny wskaźnik i będziemy
chcieli ponownie utworzyć kolejną stałą gwiazdę typu char
i powiemy tylko ostatni adres, a co powiesz na to.
To będzie równe początkowemu adresowi łańcucha, a następnie będziemy go zwiększać
za każdym razem w naszej pętli.
Więc teraz mamy ostatni adres. Ponownie, jest to zmienna
lokalna, która będzie przechowywać adres tuż przed zakończeniem zerowym.
Więc teraz możemy napisać naszą pętlę while.
A nasza pętla while zakończy działanie, gdy zobaczymy terminator zerowy.
Teraz możemy to zrobić na dwa różne sposoby.
Moglibyśmy porównać postacie. Moglibyśmy więc powiedzieć coś w
stylu while star last address, ponieważ musimy usunąć referencje,
że nie jest
równe odwrotnemu ukośnikowi zero, można zrobić coś takiego,
ale to trochę dużo kodu. Jedyne, co naprawdę musimy zrobić,
to powiedzieć, że
gwiazda jest pod ostatnim adresem. Ponieważ jeśli wyłuskujemy
terminator zerowy, będzie on równy
zero, a zero będzie równe fałszowi.
Wiemy, że wartości logiczne mają jedynkę jest prawdziwe zero jest fałszem.
Więc jeśli jest fałszywa, wyskoczy. Więc wszystko, co
musisz zrobić, to umieścić gwiazdkę jako ostatni adres.
Ponownie, spowoduje to usunięcie wskaźnika.
A kiedy wskaże ostatni adres, będzie wskazywał na terminator zerowy.
Teraz musimy się upewnić, że zmodyfikowaliśmy ostatni adres, tak aby ostatecznie wskazywał na terminator zerowy.
Tutaj wszystko, co możemy zrobić, to powiedzieć plus plus ostatni adres.
Więc każda iteracja pętli while będzie zwiększać adres, aż
zobaczy zero.
Zero reprezentuje terminator zerowy.
Więc końcowy wynik po wykonaniu pętli
while jest zakończony, ostatni adres będzie wskazywał na adres terminatora zerowego.
Następnie możemy odjąć adres terminatora zerowego od adresu,
który został przekazany, naszego ciągu, a to da nam naszą długość.
Więc to wszystko, co musimy zrobić w następnej linii. Możemy po prostu powiedzieć, że
zwracamy nasz ostatni
adres i faktycznie chcemy
odjąć adres, więc nie musimy niczego usuwać ani używać
operatora pośredniego, ostatni adres minus łańcuch. Więc ciąg jest przekazywany, w
ogóle go nie modyfikujemy.
To wskazuje na pierwszą postać. To wskazywałoby na J.
To byłby adres lub po raz pierwszy dzwonimy w linii ósmej, byłby to adres s.
Ostatni adres będzie wskazywał na adres ostatniego t.
Właściwie jeszcze jeden, terminator zerowy. Jeśli powiemy ostatni adres
minus adres s, to da nam długość.
I to właśnie zamierzamy wrócić.
Mam więc nadzieję, że to ma sens.
Ponownie, w linii 17. tworzymy zmienną
lokalną, ponieważ musimy śledzić ostatni adres, adres
terminatora zerowego.
Po tym, gdy pętla jest wykonywana, ostatni adres będzie wskazywał
po t, terminator zerowy.
Wtedy możemy po prostu odjąć ostatni adres od ciągu, adres ciągu
wskazuje na s, kiedy przychodzi, nie modyfikujemy tego.
Zobaczmy więc, co się stanie, jeśli to zwróci nam prawidłową długość.
Kiedy to uruchomimy, powinniśmy zobaczyć długość tych ciągów, które przekazaliśmy.
Więc widzimy 17 0 i 5.
Zobaczmy 1 2 3 4 5 6 7 8 9
10 11 12 13, musisz policzyć spację, 14 15
16 17. Zgadza się, wstawiliśmy
cudzysłowy, które jest puste, więc powinno wynosić zero, a następnie Jason
powinien mieć 5, a więc 17 0 i 5, to prawda.
Więc to, co tutaj zrobiliśmy, to
użyliśmy arytmetyki wskaźnika, aby uzyskać ostatni adres plus
operator inkrementacji, a następnie wskazaliśmy
naszą arytmetykę, aby uzyskać długość, odejmując ostatni adres minus łańcuch.
Całkiem schludnie. Próbuję zademonstrować potęgę
arytmetyki punktowej, jej notacyjną wygodę.
Jak możesz łatwo zwiększać, zmniejszać, aby
dostać się do różnych miejsc w tablicy
znaków i usunąć znaki. W tym przypadku po prostu pobieramy adresy, a następnie
używamy ich do pomniejszenia o siebie nawzajem, aby uzyskać długość.
Mam więc nadzieję, że to było pomocne. Upewnij się, że rozumiesz wszystko, o czym właśnie wspomniałem.
Ponownie, koncepcja stałej, koncepcja plus plus, koncepcja warunku, jeśli
wyłuskujemy adres, a to wskazuje na
terminator zerowy, jest to zero, więc wtedy wyskakuje, a następnie
koncepcja odejmowania dwóch adresów. Dziękuję Ci.