Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Jerzy F. Kotowski 1 Informatyka I Wykład 10 WSKAŹNIKI I ADRESY.

Podobne prezentacje


Prezentacja na temat: "Jerzy F. Kotowski 1 Informatyka I Wykład 10 WSKAŹNIKI I ADRESY."— Zapis prezentacji:

1 Jerzy F. Kotowski 1 Informatyka I Wykład 10 WSKAŹNIKI I ADRESY

2 WSKAŹNIKI I ADRESY - definicje n n Składnia linii deklaracji wskaźnika type_name *identifier; n n Dla większości typów T, T* jest wskażnikiem do T. Oznacza to, że zmienna typu T* może przechowywać adres obiektu typu T. n n Przykład: float *p_f; n n Sprawa się komplikuje jeżeli T jest obiektem typu tablica lub funkcja. Kiedyś o tym będzie. Należy przyjść wyspanym!!

3 Nowe operatory jednoargumentowe Operator wskazania i wyłuskania n n Operator wskazania & ampersand n n Zwraca adres swojego argumentu n n Składnia: & l_value n n Przykład:int x, *p_i; p_i = &x; n n Można tak: int x, *p_i = &x; n Operator wyłuskania * n Odwołanie do obiektu poprzez wskaźnik (dereferencja) n Składnia: * adres n Przykład: int x = 5, y, *p_i = &x; y = *p_i; *p_i = 6; n To są całkiem inne gwiazdki!!

4 ADRESY i TABLICE double Ula[100]; double *p_d; p_d = &Ula[0]; n n Nazwa tablicy jest adresem do jej zerowego elementu p_d = Ula; n n Co to jest?: *Ula n n Dereferencja do obiektu pod adresem Ula: Ula[0] n Uwaga!! Nie można napisać Ula = p_d; n Ula nie jest wskaźnikiem tylko adresem. n Analogie: x = 2;OK! 2 = x;ERROR! n Nazwa tablicy jest stałym adresem

5 Arytmetyka adresów i wskaźników Operator podstawiania n n Kilka razy to już było: wskaźnik = adres; n n Niejawna konwersja adresów: char x; int *p_i; p_i = &x;ERROR!!! p_i = (int *) &x;OK! n n Adresy wymagają jawnej konwersji n Wskaźnik typu void n Składnia void *ident; n char *p_c; int *p_i = (int *) p_c; n Alternatywa: char *p_c; int *p_i; void *p; p = p_c; p_i = p; n Dereferencja nie ma sensu:*p

6 Arytmetyka adresów i wskaźników Operatory inkrementacji i dekrementacji n n Składnia: ++ l_value tzn. argumentem musi być wskaźnik a nie adres n n Przykład: double Ala,*p = &Ala; p++; n n Zmiana wartości wskaźnika o jeden obiekt n n Przykład: long Ela[4] = {2,4,5,8}, *p = Ela, *q = &Ela[3]; p++;*p: 4 q--;*q: 5

7 Arytmetyka adresów i wskaźników Operatory logiczne n n W kontekście z adresami można używać operatorów logicznych n n Operatory przyrównania ==!= n n Operatory relacji <<= >>= n Przykład long s, A[10], *p=A; long *q=&A[9], *r=&A[7];.………… s=0; while(p<=q) if(p!=r) s+=*p++;

8 Arytmetyka adresów i wskaźników Komentarz n n Dwa operatory jednoargumentowe: *p++ n n Zwiększamy wskaźnik!! to znaczy: *p++ *(p++ ) n n Tego się nie wymyśli łatwo samemu w oparciu o reguły łączności i priorytety! n n (*p)++ - Zwiększenie wartości pod wskazaniem n n A to jest proste: *--p--*p ponieważ wszystkie operatory jednoargumentowe są prawostronnie łączne inf_10_1

9 Arytmetyka adresów i wskaźników Przykład n n Kopiownie łańcucha wraz ze znakiem końca \0 char A[5]=Ala; char B[5]; char *p=A, *q=B; while(*q++=*p++); n n Wpierw skopiujemy znak \0 a potem przetestujemy n n 2 pary nawiasów n Funkcja kopiuj (strcpy) void kopiuj(char *d,char *s) { while(*d++=*s++); } n s - source n d - destination n Przykład wywołania kopiuj(B,A) inf_10_1

10 Arytmetyka adresów i wskaźników Dodawanie adresu do liczby całkowitej n n Składnia: adres + liczba n n Wynikiem jest adres przesunięty względem argumentu o liczba obiektów n n Działanie przemienne n n liczba może być ujemna n n int Ala[10]; int *p = A+5, *q = p-2; p A[5], q A[3] Najważniejszy wzór języka C a[i] *(a+i) n Te zapisy są zawsze równoważne n Jest to definicja [ ], tzn. operatora indeksowego n Prosta konsekwencja: a[i] *(a+i) *(i+a) i[a] inf_10_1

11 Wariacje na temat iloczynu skalarnego dwóch wektorów int A[N], B[N],i,i_p; coś podstawiamy do A i B i_p = 0; n n Wariacja I - klasyka for(i=0;i

12 Arytmetyka adresów i wskaźników Odejmowanie dwóch adresów n n Składnia: adr1 - adr2 n n Wynikiem jest liczba określająca odległość między adresami mierzoną w obiektach n n Adresy muszą być tego samego typu n n Najlepiej jak wskazują na elementy tej samej tablicy n Nie ma więcej operatorów. n Problem: jak trafić w środek pomiędzy dwa adresy p i q. Nie można napisać r = (p+q)/2; n Rozwiązanie r = p + (q-p)/2;

13 OSTATNI Przykład n n Funkcja zwracająca długość łańcucha int str_len(char *p) { char *q=p; while(*q) q++; return q - p;// ! } n n Odejmowanie return q - p; // ! inf_10_3 n Przykłady wywołań char Ala[10]=Ala; char *p = Ala i Ola; int d; n d = str_len(Ala); n d = str_len(p); n d = str_len(Ala ma kota); KONIEC!


Pobierz ppt "Jerzy F. Kotowski 1 Informatyka I Wykład 10 WSKAŹNIKI I ADRESY."

Podobne prezentacje


Reklamy Google