1 / 19

Algorytmy i struktury danych

Algorytmy i struktury danych. wskaźniki przekazywanie parametrów do i z funkcji typowe błędy. Wskaźniki. 4. Y. 4. 1. X. 5. 5. 2. p. p = &Y;. *p = 4;. int Y = 1, X = 2; X = 5; int *p = &X;. Niezainicjowane wskaźniki. Y. 1. X. 2. p. p1.

medea
Download Presentation

Algorytmy i struktury danych

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Algorytmy i struktury danych wskaźniki przekazywanie parametrów do i z funkcji typowe błędy

  2. Wskaźniki 4 Y 4 1 X 5 5 2 p • p = &Y; • *p = 4; int Y = 1, X = 2; X = 5; int *p = &X;

  3. Niezainicjowane wskaźniki Y 1 X 2 p p1 • int *p1=NULL;// błąd czasu wykonania int Y = 1, X = 2; int *p = &X; • int *p1; • *p1 = 3;

  4. Wskaźnik vs. wskazanie Y 1 2 X p1 2 p2 int Y = 1, X = 2; int *p1 = &Y, *p2 = &X ; • *p1 = *p2; • p1 = p2;

  5. Tablice i wskaźniki w C++ 1 7 2 4 8 11 7 2 const int MAX = 12; int Array[MAX] = {1,7,2,4,8,11,7,2}; int *p = Array; • p++;

  6. Arytmetyka wskaźników w C++ int Array[100]; int *Ptr; Array[10] = 3; Ptr = Array + 10; // wskazanie na 10 (11)- //element tablicy Ptr = & Array[10]; // j.w. *Ptr = 3; *(Ptr-3) = 5; // to samo co Ptr[-3] = 5; // UWAGA Ptr[-3] musi byc w obrebie tablicy Ptr-Array = = 10 // Odejmowanie ma sens dla jednej tablicy

  7. Dynamiczna alokacja pamięci int *Ptr = new int[100]; // wymagane delete Ptr; Ptr[1] = 10; Ptr[100] = 10; // blad naruszenie zakresu ++Ptr; // potencjalny problem przy zwalnianiu int *Ptr1 = Ptr; Ptr1++; delete Ptr; // zwolnienie pamieci Ptr = NULL; // zaznaczenie wskaznika jako pusty

  8. Troche przykładów const int MAX=100; int Array[MAX], *Ptr; for (i=0; i<MAX; i++) Array[i] = i; for (i=0, Ptr=Array; i<MAX; i++, Ptr++) *Ptr = i; for (Ptr=Array; Ptr<Array+MAX; Ptr++) *Ptr = 0; for (Ptr=Array+MAX-1; Ptr>=Array; Ptr--) *Ptr = 0;

  9. Typy wskaźników int I, *pInt= &I; long L, *pLong = &L; I = L; // OK *pInt = *pLong; // OK pInt = pLong; // blad rozne typy pInt = I; // bez sensu long ** ppLong; // czasem tak trzeba … ppLong = &pLong; // Ok **ppLong = 10; // L = 10; pLong = pInt; // blad rozne typy

  10. Wskaźniki i referencje int y=0, x=0, *ptr = &x, &ref = x; *ptr = 3; // x = 3; ref = 3; // x = 3; ++ptr; // przesuniecie wskaznika (tutaj bez sensu) ++ref; // ++x; ptr = &x; // ref = x oznaczaloby x = x; *ptr = y; // x = y; ptr = &y; // od tej pory wskazujemy na y ref = y; // x = y; const int & ref = x;// umozliwia tylko odczyt int & ref; // blad, niezainicjowana referencja nie ma sensu

  11. Stałe wskaźniki i wskaźniki do stałych int Array[100]; int *Ptr = Array; int *const cPtr = Array; // takie same wlasciwosci jak Array const int*PtrToC = Array; const int*const cPtrToC Array; *(Ptr ++) = 1; // mozna wszystko cPtr++; // blad *cPtr = 1; // ok, nie mozna tylko zmieniac wskaznika *(cPtr+3) = 1; // ok, nie mozna tylko zmieniac wskaznika cPtr[3] = 1; // ok, nie mozna tylko zmieniac wskaznika *PtrToC = 1; // blad x = *(PtrToC++); // ok, przez wskaznik mozna tylko czytac x = = PtrToC[3]; // ok, przez wskaznik mozna tylko czytac x = *(cPtrToC+5); // ok, czytamy i nie zmieniamy wskaznika

  12. Przekazywanie parametru void fun(int y) { } int X = 2; fun(X); 2 X Fun y 2 5 y = 5;

  13. Przekazywanie wskaźnika void fun(int * pInt) { // partametr - wskaźnik } void fun(int ArrayInt[]) {// partametr – tablica } int A[10] = {2}; fun(A); 2 5 A Fun pInt *pInt = 5; pInt++;

  14. Przekazywanie wskaźnika do wskaźnika • int *pInt = A; • fun(&pInt); pInt ppInt void fun(int ** ppInt) { // mozliwosc zmiany wskaznika } int A[10] = {2}; 2 A 5 Fun **ppInt = 5; (*ppInt)++; *(ppInt++);

  15. Przekazywanie referencji do wskaźnika • int *pInt = A; • fun(pInt); pInt refPInt void fun(int * &refPInt) { // mozliwosc zmiany wskaznika } int A[10] = {2}; 2 A 5 Fun * refPInt = 5; refPInt ++;

  16. Zwrot wskaźnika • int *pInt = A+1; pInt int*fun(int * pIntL) { // wskaznik zwracany jako wynik } int A[10] = {7,2}; 7 2 A 5 • pInt = fun(pInt); // pInt = fun(A+1); Fun *pIntL = 5; pIntL pIntL++; return pIntL;

  17. Zestawienie metod void fun(int x); // zwykły parametr void fun(int * x); // partametr - wskaźnik void fun(int array[]); // partametr - tablica int * fun(int * x); // wskaznik zwracany jako wynik void fun(int ** x); // mozliwosc zmiany wskaznika int fun(int *&x); // mozliwosc zmiany wskaznika typedef int *intPtr; // to samo z oddzielnym typem int fun(intPtr &x);

  18. Podsumowanie void fun(int x); // nie można zmienić x void fun(int * x); // nie można zmienić wskaźnika void fun(int Array[]); // partametr - tablica int * fun(int * x); // funkcja zwraca zmieniony // wskaznik long fun(int ** x); // nieco niewygodne int fun(int *&x); // F. moze zmienic argument fun(pInt); // Problem:z wywołania niewyni- // ka, że f. moze zmienic argument

  19. Typowe błędy //niezainicjowany wskaznik int *ptr; *ptr = 1; // potencjalny upadek systemu //niewazny wskaznik (podwojne zwolnienie); int *ptr1,*ptr2; ptr1 = ptr2 = new int[100]; delete ptr1[]; ptr1=NULL; *ptr2 = 5; // potencjalny upadek systemu delete ptr2; // przerwanie programu //wyciek pamieci ptr1 = new int[10]; ptr2 = new int[100]; ptr1 = ptr2; // stracona tablica int[10]

More Related