64758 Image215

64758 Image215




Programowanie

To właśnie możliwość zmiany pozycji wskaźnika wpływa na możliwość napisania wielu algorytmów w sposób bardziej optymalny niż przy wykorzystaniu zwyczajnych tablic.

Po jakimś czasie pracy z C przekonasz sic. że symetria między tablicami i wskaźnikami jest potężną zaletą tego języka.

Arytmetyka wskaźników

Wskaźniki mają swoją własną arytmetykę, która opiera się głównie na ograniczeniach arytmetyki dotyczącej zwykłych zmiennych całkowitych.

Jak wspominałem, wskaźnik to adres w pamięci, pod którym znajduje się dany obiekt. Dodanie dowolnej liczby i do wskaźnika powoduje jego przesunięcie na element odległy o i elementów. Nie bajtów! O ile dla zmiennych jcdnobajtowych ilość bajtów jest równa ilości elementów, szczególnego znaczenia nabiera to w przypadku zmiennych o większym rozmiarze. Przykładowo: uint32_t tab32[5]; uint8_t *w3kaznik *■ tab32 J wskaźnik +« 2;

spowoduje zmianę fizycznie wpisanej do wskaźnika wartości o 8. Jest to równoważne z wskazaniem na drugą pozycję w tablicy, w której kużda komórka zajmuje 4 bajty.

Operacje, które na wskaźnikach są dozwolone, to:

Dodanie luli odjęcie ud wskaźnika dowolnej liczby całkowitej - powoduje przesunięcie o odpowiednią liczbę elementów;

Odjęcie dwóch wskaźników' p-ą znajdujących się w za kresie tej samej tablicy, jeśli p>q -zwraca ilość elementów między nimi;

Dozwolone są porównania wskaźników,

jednak jeśli wskazują one na inne tablice, wynik takiego działania jest nieokreślony.

Jedyną stałą, którą można formalnie wpisać do wskaźnika, tn 0. Niezdefiniowany (formalnie) jest także wynik porównania z inną liczbą stałą niż 0. W przypadku wskaźników 0 jest stosowane do oznaczenia nieprawidłowego adresu. Często zamiast stosować bezpośrednio 0 używamy zdefiniowanej w nagłówku <stdio.h> specjalnej stałej wartości NULL. W ten sposób zaznaczamy, że chodzi o wskaźnik.

Zabronione jest natomiast dodawanie do siebie dwóch wskaźników, ich mnożenie, wykonywanie na nich operacji bitowych oraz jakiekolwiek operowanie za pomocą liczb zmiennoprzecinkowych. Bez rzutowania nie wolno nawet nadać wskaźnikowi jednego typu wartości wskaźnika wskazującego na inny rodzaj zmiennej.

Wskaźnik jako parametr

Ponieważ w C parametry są przekazywane przez wartość, funkcja nic ma możliwości zapisania wartości do parametru. Jeśli możliwość zwrócenia wartości przez funkcję jest niewystarczająca, można jako parametr podać wskaźnik do zmiennej. W takim przypadku poprzez omówione operacje dosiępu do zmiennej wskazywanej przez wskaźnik mamy możliwość przesłania dodatkowej wartości poprzez parametr. Nie przejmuj się, jeśli opis ten wydaje się skomplikowany Wszystko stanie się łatwiejsze, gdy pojawią się przykłady.

+4-1, j++, —i oraz i—

Ciekawymi operatorami są operatory post- oraz preinkrementacji oraz dekrementacji. W przypadku wskaźników powodują zawsze przesunięcie o jedną pozycję. W przypadku zmiennych całkowitych zmianę o 1. Nie są dozwolone w przypadku zmiennych zmiennoprzecinkc wych. Wróćmy jednak do wskaźników, gdzie mają one największe zastosowanie:

Miejsce, gdzie operator zostanie umieszczony, może istotnie wpłynąć na przebieg obliczeń. Tak więc zapis:

*0-+pi)

spowoduje przesunięcie wskaźnika, a następnie dostęp do danej. Analogicznie:

*(pi+0

oznacza dostęp do danej, a następnie przesunięcie wskaźnika.

Zauważ, ze w języku maszynowym procesora AVR istnieją instrukcje adresowania pośredniego z postinkrementacją i predekrementacją. Będą one jednak wykorzystane tylko, jeśli wskaźnik jest typu oś/niobito wego.

(•p)++ a *(p++)

Kolejny raz mamy do czynienia z wpływem kolejności wykonywania działań na przebieg obliczeń. Pierwszy z tytułowych zapisów spowoduje zwiększenie o 1 wartości zmiennej wskazywanej przez p. Zapis drugi spowoduje dostęp do zmiennej wskazywanej przez p, a następnie przesunięcie wskaźnika o jedną pozycję. Zwracam uwagę na to, zc jednuargu-mentowy operator * ma taki sam priorytet jak ++. Jednak są to operatory prawostronnie łącz ne - wykonywane od prawej do lewej, tak więc: *pi-H- /*=*/ *(pi++)

*++pi /*-*/ *(-H-pi)

ABC... C

Standardowe funkcje obsługi łańcuchów

Prosty i przyjemny sposób wpisania do zmiennej łańcuchowej napisu jest możliwy tylko przy wstępnej inicjacji zmiennej (przykłady są w ramce o napisach). Niestety, w programie nie jest możliwe wykorzystywanie jakichkolwiek operatorów na łańcuchach. Trzeba zdać sobie sprawę, że w C operując nazwą zmiennej łańcuchowej, posługujemy się wskaźnikami do odpowiednich tablic. Dla kompilatora nie ma znaczenia, czy jest w nich napis, czy nic: char napisl □ = “he”; char napis2[] ■ “llo”; char wyr.ik[10]; wynik = napisl + napis2;

//Błąd! Dodajemy wskaźniki //jest to operacja zabroniona!

Tak samo porównywanie dwóch łańcuchów nic da spodziewanego efektu. Zgodnie ze standardem jest to zabronione, ponieważ posługujemy się wskaźnikami na dwie różne tablice. Jednak większość kompilatorów, na przykład takie porównanie1

char sl[] - “równy”; char s2[] * “równy”; if(si — s2)

potraktuje jako działanie prawidłowe. Jednak ważne jest to, że to nie napisy są porównywane!

Porównywane są wskaźniki, a więc dwa adresy w pamięci, które w tym przypadku na pewno nie są identyczne Zupełnie nie ma znaczenia, że zmienne zainicjowaliśmy takimi samymi wartościami.

Zaznaczyłem problem, czas pokazać rozwiązanie. Istnieją mianowicie standardowe funkcje pozwalające na operowanie napisami. Aby z nich korzystać, konieczne jest dołączenie do programu nagłówka <string.h>. Poniżej skrótowo omawiam działanie najważniejszych z nich. Jeśli potrzebne będą dokładniejsze informacje - zawsze możesz znaleźć je w dołączonym do WinAVR podręczniku.

strleniMcJ - podaje długość napisu (bez wliczania kończącego go znaku zerowego).

streat(dest, sre) - dopisuje na końcu łańcucha dest łańcuch src. całość zamyka znakiem zerowym.

strcbrtoc, valj - zwraca uchwyt do miejsca pierwszego wystąpienia znaku val albo NLLL, jeśli \al nie występuje w src.

strrchr/wc, ml) - jak wyżej, ale poszukuje ostatniego wystąpienia znaku.

stntrfsrc, s) - podobnie jak wyżej, ale odnajduje pierwsze wystąpienie całego ciągu znaków.

stremp/s/. s2) - porównuje ze sobą dwa napisy. Zwraca wartość 0, jeśli napisy są identyczne. Odpowiednio wartość ujemną lub dodatnią, jeśli sl jest mniejszy lub większy od s2.

Napis jest mniejszy (większy), gdy na pierwszej pozycji, na której pojawi się różnica między napisami kod ASCII znaku ma wartość liczbową mniejszą (większą).

strepy(dest, src) - kopiuje napis v/r do tablicy dest. dest musi mieć odpowiedni rozmiar, aby pomieścić src, oraz src nie może być częścią tablicy dest. Jeśli te warunki nie są spełnione, cały program może się „wysypać".

strrev/vj - zamienia kolejność znaków w napisie s (odwraca napis).

strcasecmp^J, s2> - funkcja analogiczna dc stremp, jednak przy porównaniu pomijana jest wielkość liter (ftinkcja niestandardowa, może nie występować poza GCC).

strlwr/snę) - zamienia duże litery w tablicy src na małe.

strupr(!s/*7 - zamienia małe litery w tablicy src na duże

str/cat, str/epy - odpowiedniki powyższych funkcji, jednak posiadają dodatkowy parametr umożliwiający wskazanie wielkości tablicy docelowej. Powinny być używane, jeśli nic mamy pewności czy łańcuch źródłowy zmieści się w docelowym. Dłuższy tekst zostanie przycięty.

strncasecmp, str/rcat, str/remp, str/icpy, strnlen - odpowiedniki funkcji opisanych wyżej, ale z podaną ilością znaków-, które maksymalnie brać pod uwagę z łańcucha źródłowego-

46 Październik2005 Elektronika dla Wszystkich


Wyszukiwarka

Podobne podstrony:
Stulecie “złotej kultury szlacheckiej” w Rosji rozpoczęło się w 1762 (jest to realna data zmiany poz
strona$ (2) 24 Napodstawie wykresów z rys. 14 i rys. 15 widać, że zmiany temperatury nie wpływają na
Związki zawodowe. •związki zawodowe- to organizacje pracowników, których ceiem jest wpływanie na pła
marketingBIZNES .czy nie? Ostatnie zmiany prawne silnie wpływają na reklamę aptek i
Punkty kluczowe są to specyficzne obszary ciała, z których można wpływać na napięcie mięsni ciała i
Zmiany w gospodarce światowej wpływające na zmiany w zarządzaniu FM: 1)    liberaliza
78568 skanuj0045 (63) 90 Formy organizacyjni• Są to prace wspierające główny proces kształcenia i wp
14 7 2.    Przenikanie to przejście substancji leczniczej przez skórę (wpływają na te
4. Wyjaśnij, co to jest rozpuszczalność. Podaj, jakie czynniki wpływają na szybkość
Cechy wypowiedzi publicystycznych Publicystyka to pewien sposób przekazywania myśli, emocji i wpływa

więcej podobnych podstron