Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Podobne dokumenty
Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Lab 9 Podstawy Programowania

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania komputerów

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Wskaźniki. Informatyka

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

KURS C/C++ WYKŁAD 6. Wskaźniki

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Podstawy programowania w języku C++

Podstawy programowania skrót z wykładów:

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

Język C zajęcia nr 11. Funkcje

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Wskaźniki. Programowanie Proceduralne 1

Programowanie w języku C++

DYNAMICZNE PRZYDZIELANIE PAMIECI

Wykład 1: Wskaźniki i zmienne dynamiczne

Wykład 3 Składnia języka C# (cz. 2)

ZASADY PROGRAMOWANIA KOMPUTERÓW

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Języki i metodyka programowania. Wskaźniki i tablice.

Wskaźniki. Przemysław Gawroński D-10, p Wykład 1. (Wykład 1) Wskaźniki / 9

Podstawy programowania w języku C++

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Wskaźniki w C. Anna Gogolińska

Podstawy programowania. Wykład Co jeszcze... Przypomnienia, uzupełnienia. Krzysztof Banaś Podstawy programowania 1

Tablice, funkcje - wprowadzenie

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Język C++ Różnice między C a C++

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Zmienne, stałe i operatory

Podstawy Programowania 2 Wskaźniki i zmienne dynamiczne. Plan. Wskaźniki - krótka powtórka. Wskaźniki - krótka powtórka Wartości wskaźników.

//zmienne globalne int *pa, *pb; //wskaźniki globalne void main(void) { clrscr(); printf("\n podaj wartosc liczby a\n"); scanf("%d",&a); pa=&a;

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Stałe, tablice dynamiczne i wielowymiarowe

Wykład 4: Klasy i Metody

Tablice, funkcje, wskaźniki - wprowadzenie

. Podstawy Programowania 2. Wskaźniki i zmienne dynamiczne. Arkadiusz Chrobot. 25 lutego 2019

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1

Wstęp do wskaźników w języku ANSI C

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Podstawy programowania. Wykład: 8. Wskaźniki. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Typy danych. Przemysław Gawroński D-10, p lutego Wykład 1. (Wykład 1) Typy danych 25 lutego / 11

zmienne stanowią abstrakcję komórek pamięci: programista może przechowywać dane w pamięci, nie martwiąc się o techniczne szczegóły (np.

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Techniki Programowania wskaźniki

6 Przygotował: mgr inż. Maciej Lasota

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Wstęp do Programowania, laboratorium 02

Podstawy programowania. Wykład PASCAL. Zmienne wskaźnikowe i dynamiczne. dr Artur Bartoszewski - Podstawy prograowania, sem.

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

Funkcja (podprogram) void

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Spis treści JĘZYK C - WSKAŹNIKI, DYNAMICZNY PRZYDZIAŁ PAMIĘCI. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Język ANSI C. część 11. Jarosław Gramacki Instytut Informatyki i Elektroniki

Podstawy programowania w języku C++

Wykład nr 3. Temat: Wskaźniki i referencje. Edward Morgan Forster

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy PRAWA PRZYJACIÓŁ KLASY. Dostęp z zewnątrz: Dostęp z wewnątrz:

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

Podstawy programowania w języku C++

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

W dowolnym momencie można zmienić typ wskaźnika.

Tablice w argumentach funkcji. Tablicy nie są przekazywane po wartości Tablicy są przekazywane przez referencje lub po wskaźniku

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Laboratorium 6: Dynamiczny przydział pamięci. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

PARADYGMATY PROGRAMOWANIA Wykład 4

Wprowadzenie do programowania w języku C

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Biblioteka standardowa - operacje wejścia/wyjścia

Uzupełnienie dot. przekazywania argumentów

Podstawy programowania. Wykład: 7. Funkcje Przekazywanie argumentów do funkcji. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

2 Przygotował: mgr inż. Maciej Lasota

Struktury. Przykład W8_1

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

Podstawy programowania. Podstawy C# Tablice

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

Transkrypt:

Podstawy programowania. Wykład 6 Wskaźniki Krzysztof Banaś Podstawy programowania 1

Adresy zmiennych Język C pozwala na operowanie adresami w pamięci stąd, między innymi, kwalifikowanie C jako języka relatywnie niskiego poziomu, bliskiego asemblerowi, językowi maszynowemu Operator adresu & zwraca adres początku obszaru pamięci powiązanego ze zmienną adres zmiennej typu T jest typu "wskaźnik do T" adres jest liczbą o reprezentacji zależnej od aktualnego środowiska wykonania programu standard C nie gwarantuje, że adres zmiennej będzie można reprezentować za pomocą zmiennej określonego typu arytmetycznego (np. różnych wariantów liczb całkowitych) adresy w systemach 32 bitowych zazwyczaj można rzutować na zmienne typu unsigned integer (liczba całkowita bez znaku) w systemach 64 bitowych powinno to być long unsigned integer printf("zmienna a: %d, jej adres: %lu\n", a, &a); Krzysztof Banaś Podstawy programowania 2

Wskaźniki Język C pozwala na przechowywanie adresów w zmiennych a także na wykonywanie operacji na zmiennych przechowujących adresy o tym na zakończenie wykładów Deklaracje i definicje zmiennych przechowujących adresy określają typ zmiennej jako wskaźnik wymagają określenia do zmiennej jakiego typu jest to wskaźnik, np. int * wskaznik_do_int; double * double_p; wyjątkiem jest wskaźnik typu void * czysty_wskaznik_do_pamieci; wykorzystanie zmiennych zadeklarowanych jako void * wymaga najczęściej wcześniejszego rzutowania na wskaźnik do zmiennych konkretnego typu printf("%c", * ((char *) czysty_wskaznik_do_pamieci)); Krzysztof Banaś Podstawy programowania 3

Wskaźniki Zmienna typu "wskaźnik do T" pozwala uzyskać dostęp do obszaru pamięci na który wskazuje służy do tego operator wyłuskania (przekierowania, dereferencji) float* float_p = &f_1; // f_1 musi być zmienną typu float float f_2 = *float_p; // podstaw do f_2 to na co wskazuje float_p efekt powyższych operacji jest identyczny jak: float f_2 = f_1; Wynik operatora wyłuskania jest miejscem w pamięci, co oznacza, że wyrażenie postaci (* zmienna_wsk) jest l wartością (może być argumentem lewostronnym przypisania): *zmienna_wsk = 1; Uwaga na notację: *zmienna_wsk++ // zmiana wartości wskaźnika // arytmetyka wskaźników częste źródło błędów (*zmienna_wsk)++; // zmiana wartości w komórce wskazywanej Krzysztof Banaś Podstawy programowania 4

Wskaźniki Możliwość przypisania wskaźnikowi dowolnej wartości oznacza, że możemy sprawić, żeby wskazywał na dowolny obszar pamięci może wskazywać np. na obszar kodu lub obszar stałych, co w przypadku modyfikacji wartości w komórkach, na które wskazuje prowadzi do trudnych do wykrycia błędów kodu Dlatego wskaźniki powinny zawsze być inicjowane, tak żeby wskazywały na komórki zawierające dane do modyfikacji w przypadku braku takich lokalizacji w pamięci w momencie definicji wskaźnika dobrze jest inicjować wartością NULL NULL jest technicznie wartością 0 z założenia wskaźnik o wartości NULL nie może wskazywać na żaden obszar pamięci inicjowanie wartością NULL gwarantuje błąd w przypadku każdej próby użycia tak zainicjowanego wskaźnika do wyłuskania Krzysztof Banaś Podstawy programowania 5

Wskaźniki Jedną z najważniejszych ról wskaźników w C jest umożliwienie przekazywania z funkcji większej liczby obliczonych wartości, niż jedna zwracana przez funkcję Odbywa się to przez przekazanie do funkcji argumentu będącego adresem adres jest przekazany przez wartość i skopiowany do odpowiedniego argumentu formalnego funkcji posługując się odpowiednim typem wskaźnikowym funkcja może modyfikować wartość komórki pamięci o adresie przekazanym jako argument Częstą praktyką jest zwracanie przez funkcję kodu sukcesu lub niepowodzenia (błędu) przekazywanie wyniku przetwarzania danych wejściowych poprzez wskaźniki do zmiennych Krzysztof Banaś Podstawy programowania 6

Wykorzystanie wskaźników // funkcja oblicza pierwiastki równania kwadratowego int rownanie_kwadratowe( // funkcja zwraca kod sukcesu lub następujące kody... double a, double b, double c, // współczynniki równania kwadratowego double* x1_p, double* x2_p // wskaźniki do miejsc. gdzie mają zostać ); // umieszczone obliczone pierwiastki równania void main(void ) { double a=1, b=5, c=4, x1, x2; rownanie_kwadratowe(a, b, c, &x1, &x2); } int rownanie_kwadratowe( double a, double b, double c, double* x1_p, double* x2_p ) { double pierwiastek_1, pierwiastek_2;... // obliczenie pierwiastków, obsługa sytuacji wyjątkowych *x1_p = pierwiastek_1; *x2_p = pierwiastek_2; } Krzysztof Banaś Podstawy programowania 7

Wykorzystanie wskaźników // funkcja zwiększa o 1 wartość zmiennej posługując się wskaźnikiem void funkcja_1( float * float_1_p // wskaźnik do zmiennej konwencja: [in/out] ); // konwencja informuje, że wskaźnik jest użyty do // przekazania efektu działania funkcji void main(void ) { float f = 1.0; funkcja_1(&f); } // funkcja zwiększa o 1 wartość zmiennej posługując się wskaźnikiem void funkcja_1( float * float_1_p // wskaźnik do zmiennej konwencja: [in/out] ){ (*float 1_p)++; } Krzysztof Banaś Podstawy programowania 8

Wskaźniki i tablice Druga istotna rola wskaźników w C wynika z utożsamienia tablic i wskaźników dokładniej nazwa tablicy jest wskaźnikiem do jej pierwszego elementu a == &a[0] W C nigdy nie przesyła się całych tablic jako argumentów funkcji zawsze przesyłany jest, przez wartość (!), wskaźnik do tablicy, czyli adres początku tablicy oznacza to, że wewnątrz wywoływanej funkcji zawsze można dokonywać modyfikacji elementów przesyłanej jako argument tablicy void funkcja( int * a ){ // identyczne z void funkcja( int a[] ){ a[0] =... ; a[1]++ ; // dla każdego wskaźnika można // stosować notację indeksową } Krzysztof Banaś Podstawy programowania 9

Wykorzystanie wskaźników #define SCALAR int // float, double algorytm identyczny void sortowanie_babelkowe(scalar tablica[], int rozmiar) { int i, j; for (i = 0; i<rozmiar-1; i++){ for (j=0; j<rozmiar-1-i; j++){ if (tablica[j] > tablica[j+1]) przestaw(&tablica[j], &tablica[j+1]); } } } // alternatywa: przestaw(tablica, j, j+1); przestaw(scalar *scalar_1_p, SCALAR *scalar_2_p); { SCALAR temp = *scalar_1_p; *scalar_1_p = *scalar_2_p; *scalar_2_p = temp; } Krzysztof Banaś Podstawy programowania 10

Operator sizeof Standard C nie definiuje dokładnie rozmiarów zmiennych wszystkich typów wbudowanych rozmiary mogą być uzależnione od sprzętu (typu procesorów), systemu operacyjnego, środowiska wykonania itp. C udostępnia operator sizeof umożliwiający zwrócenie rozmiaru (w bajtach) konkretnej zmiennej lub wszystkich zmiennych konkretnego typu: int a; size_t rozmiar_a = sizeof( a ); // (a) jest wyrażeniem size_t rozmiar_int = sizeof( int ); // ta forma wymaga nawiasów Typ size_t jest zdefiniowany w pliku stddef.h Operator sizeof może zostać użyty do obliczenia liczby elementów tablicy: int array_size = sizeof array / sizeof array[0]; Krzysztof Banaś Podstawy programowania 11

Wskaźniki i zmienne dynamiczne Trzecia istotna rola wskaźników w C wynika z mechanizmów zarządzania pamięcią zmienne definiowane standardowo mogą mieć dwa sposoby przechowywania w obszarze statycznym istniejąc przez cały czas wykonania programu na stosie jako zmienne automatyczne, istniejące przez czas wykonywania określonego fragmentu kodu zmienna będąca wskaźnikiem może wskazywać na dane znajdujące się poza obszarem statycznym i poza stosem taki obszar pamięci nazywany jest obszarem dynamicznym lub stertą przydział obszaru pamięci na stercie dokonywany jest dynamicznie za pomocą wywołania specjalnych procedur zarządzania pamięcią Krzysztof Banaś Podstawy programowania 12

Zarządzanie pamięcią Standardowa biblioteka C dostarcza kilka procedur zarządzania pamięcią dynamiczną: funkcje alokowania (przydzielania, rezerwowania) pamięci: malloc: void *malloc(size_t size); // argument: rozmiar w bajtach calloc: void *calloc(size_t nmemb, size_t size); // argumenty: // liczba obiektów, rozmiar pojedynczego obiektu realloc: void *realloc(void *ptr, size_t size); // argumenty: // wskaźnik do istniejącego obiektu, nowy rozmiar pamięci funkcje zwracają wskaźnik do zaalokowanego obszaru pamięci lub wskaźnik NULL w przypadku niepowodzenia calloc inicjuje obszar zerami, realloc pozostawia wartości istniejące zaalokowana pamięć jest dostępna dla programu do momentu jej zwolnienia (dealokacji) Krzysztof Banaś Podstawy programowania 13

Zarządzanie pamięcią Standardowa biblioteka C dostarcza kilka procedur zarządzania pamięcią dynamiczną: funkcja dealokowania (zwalniania) obszaru pamięci: free: void free(void *ptr); funkcja musi otrzymać jako argument wskaźnik uzyskany z funkcji alokowania pamięci (lub wskaźnik NULL wtedy nie robi nic) zwalnianie niezaalokowanej pamięci lub podwójne zwalnianie pamięci to jedne z najczęstszych błędów wykonania w C alokowanie i niezwalnianie pamięci (wycieki pamięci) jest przyczyną trudnych do wykrycia błędów (zwłaszcza w przypadku programów o długotrwałym działaniu) istnieją specjalne programy, których celem jest wykrywanie wycieków pamięci: poprzez przeglądanie kodu źródłowego lub testowanie kodu binarnego Krzysztof Banaś Podstawy programowania 14

Zarządzanie pamięcią Standardowa biblioteka C dostarcza kilka procedur zarządzania pamięcią dynamiczną: dynamiczne alokowanie pamięci najczęściej stosowane jest dla tablic, których rozmiar znany jest dopiero w trakcie wykonania programu int* tab_int = NULL; // tab_int[0]=1; błąd wykonania tab_int = malloc(n*sizeof(int)); // domyślna konwersja na (int *)... // obszar dostępności (widzialności) tablicy free( i_p );... // tab_int[0]=1; błąd wykonania (mimo widzialności nazwy) nowe wersje standardu C dopuszczają definiowanie tablic o zmiennym rozmiarze (element opcjonalny): int tab_int[n]; umieszczając w kodzie funkcję alokowania pamięci powinno się od razu umieścić funkcję zwalniania zaalokowanej pamięci najlepiej jeśli obie operacje są realizowane w tej samej funkcji Krzysztof Banaś Podstawy programowania 15

Wskaźniki Bezpieczne użycie wskaźników oznacza: inicjowanie w momencie definicji przypisywanie tylko wartości adresów zmiennych przeznaczonych do modyfikacji poprzez wskaźnik unikanie arytmetyki wskaźników dokonywanie operacji arytmetycznych na wskaźnikach prowadzi w przypadku błędu do trudno wykrywalnych usterek kodu stosowanie wszędzie, gdzie to odpowiednie notacji indeksowej np. operowanie na tablicach przesłanych jako argumenty funkcji za pomocą indeksów, a nie arytmetyki wskaźników Ze względu na łatwość popełniania błędów przy stosowaniu wskaźników, wiele języków nie wprowadza pojęcia wskaźnika poprawne i bezpieczne wykorzystanie wskaźników prowadzi do czytelnego i efektywnego kodu Krzysztof Banaś Podstawy programowania 16