Podstawy informatyki. Wykład nr 1 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Podobne dokumenty
Podstawy informatyki 2. Podstawy informatyki 2. Wykład nr 1 ( ) Dane podstawowe. Politechnika Białostocka. - Wydział Elektryczny

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

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

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

dr inż. Jarosław Forenc

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

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

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

Spis treści JĘZYK C - TABLICE JEDNOWYMIAROWE. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF05Z

Informatyka 2. Informatyka 2. Wykład nr 1 ( ) Dane podstawowe. - Wydział Elektryczny. Politechnika Białostocka. Program wykładu (1/2)

Lab 9 Podstawy Programowania

Informatyka 1. Plan dzisiejszych zajęć. zajęcia nr 1. Elektrotechnika, semestr II rok akademicki 2008/2009

Wykład 1: Wskaźniki i zmienne dynamiczne

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

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

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

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

Język C zajęcia nr 11. Funkcje

DYNAMICZNE PRZYDZIELANIE PAMIECI

dr inż. Jarosław Forenc

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

Wskaźniki w C. Anna Gogolińska

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

Wskaźniki. Informatyka

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

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

Stałe, tablice dynamiczne i wielowymiarowe

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

Spis treści JĘZYK C - TABLICE DWUWYMIAROWE, OPERACJE NA TABLICACH. Metodyki i techniki programowania

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

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

Dynamiczny przydział pamięci (język C) Dynamiczne struktury danych. Sortowanie. Klasyfikacja algorytmów sortowania. Algorytmy sortowania

if (warunek) instrukcja1; if (warunek) instrukcja1; else instrukcja2; a > b - a większe od b if (warunek) instrukcja1; a <= b - a mniejsze lub równe b

Podstawy programowania komputerów

Programowanie w języku C++

Podstawy programowania w języku C++

Podstawy programowania. Wykład: 12. Struktury, unie, pola bitowe. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Programowanie obiektowe W3

ZASADY PROGRAMOWANIA KOMPUTERÓW

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

Spis treści JĘZYK C - TABLICE DWU- I WIELOWYMIAROWE, OPERACJE NA TABLICACH. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Język C, tablice i funkcje (laboratorium)

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

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

Powyższe wyrażenie alokuje 200 lub 400 w zależności od rozmiaru int w danym systemie. Wskaźnik wskazuje na adres pierwszego bajtu pamięci.

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

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Spis treści JĘZYK C - TABLICE DWUWYMIAROWE, OPERACJE NA TABLICACH. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu

Podstawy Programowania C++

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:

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Wykład 4: Klasy i Metody

Tablice, funkcje - wprowadzenie

Zmienne i struktury dynamiczne

Wskaźniki. Programowanie Proceduralne 1

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

Spis treści JĘZYK C - PRZEKAZYWANIE PARAMETRÓW DO FUNKCJI, REKURENCJA. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu

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

Spis treści JĘZYK C - PRZEKAZYWANIE PARAMETRÓW DO FUNKCJI, REKURENCJA. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu

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

Zmienne, stałe i operatory

Uzupełnienie dot. przekazywania argumentów

Język ANSI C tablice wielowymiarowe

6 Przygotował: mgr inż. Maciej Lasota

tablica: dane_liczbowe

Język C, tablice i funkcje (laboratorium, EE1-DI)

Wykład 8: klasy cz. 4

IX. Wskaźniki.(3 godz.)

Tablice, funkcje, wskaźniki - wprowadzenie

4. Tablica dwuwymiarowa to jednowymiarowa tablica wskaźników do jednowymiarowych tablic danego typu.

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

dr inż. Jarosław Forenc

Spis treści JĘZYK C - OPERATORY RELACYJNE I LOGICZNE, WYRAŻENIA LOGICZNE, INSTRUKCJA WARUNKOWA IF. Informatyka 1

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

1 Podstawy c++ w pigułce.

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

Podstawy programowania w języku C++

Podstawy programowania w języku C++

Struktury czyli rekordy w C/C++

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

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

Wykład II Tablice (wstęp) Przykłady algorytmów Wstęp do języka C/C++

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

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

Techniki Programowania wskaźniki

2 Przygotował: mgr inż. Maciej Lasota

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

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Spis treści PLIKI BINARNE W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF23

Spis treści JĘZYK C - PLIKI BINARNE. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF30

Wymiar musi być wyrażeniem stałym typu całkowitego, tzn. takim, które może obliczyć kompilator. Przykłady:

Wykład 5: Klasy cz. 3

Spis treści JĘZYK C - INSTRUKCJA WARUNKOWA IF, OPERATORY RELACYJNE I LOGICZNE, WYRAŻENIA LOGICZNE, ZAGNIEŻDŻANIE IF-ELSE.

Struktury Struktura polami struct struct struct struct

Podstawy Programowania

Transkrypt:

Podstawy informatyki Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr II, studia niestacjonarne Rok akademicki 2006/2007 Wykład nr 1 (09.03.2007)

Wykład nr 1 2/34 Dane podstawowe dr inŝ. Jarosław aw Forenc Politechnika Białostocka, Wydział Elektryczny, Katedra Elektrotechniki Teoretycznej i Metrologii ul. Wiejska 45D, 15-351 Białystok WE-204 e-mail: jarekf@pb.edu.pl tel. (0-85) 746-93-97 http://we.pb.edu.pl/~jforenc konsultacje: Dydaktyka - slajdy prezentowane na wykładzie poniedziałek, godz. 9:00-10:00, WE-204 środa, godz. 10:00-11:00, WE-204 środa, godz. 16:00-17:00, WE-204 piątek, godz. 19:00-20:00, WE-204 (st. zaoczne) sobota, godz. 14:00-15:00, WE-204 (st. zaoczne, co 2-gi zjazd)

Wykład nr 1 3/34 Program wykładu 1. Tablice i wskaźniki w języku C. Dynamiczny przydział pamięci. 2. Pliki w języku C. Typy plików, operacje na plikach. 3. Wprowadzenie do metod numerycznych. Błędy w obliczeniach numerycznych. 4. Operacje na wektorach i macierzach. 5. Rozwiązywanie układów równań liniowych: metody dokładne i iteracyjne. 6. Metody poszukiwania pierwiastków funkcji nieliniowych: bisekcji, regula falsi, siecznych. 7. Metody całkowania numerycznego: prostokątów, trapezów, parabol. 8. Algorytmy stosowane w komputerowej analizie obwodów elektrycznych. Środowisko SPICE. 9. Ogólna struktura i zasada działania systemów komputerowych. Klasyfikacja komputerów. System operacyjny.

Wykład nr 1 4/34 Literatura (1/2) Język C/C++: 1. B.W. Kernighan, D.M. Ritchie: Język ANSI C. WNT, Warszawa, 2004. 2. A. Sopek: W głąb języka C. Helion, Gliwice, 1993 (http://helion.pl/online/wglab/wglab.zip) 3. J. Grębosz: Symfonia C++ standard. Wydawnictwo Edition 2000, Kraków, 2005. 4. K. Barteczko: Praktyczne wprowadzenie do programowania obiektowego w języku C++. Wydawnictwo Lupus, Warszawa, 1994. 5. A. Zalewski: Programowanie w językach C i C++ z wykorzystaniem pakietu Borland C++. Wydawnictwo Nakom, Poznań, 2000. 6. B. Stroustrup: Język C++. WNT, Warszawa, 2004.

Wykład nr 1 5/34 Literatura (2/2) Inne: 1. D. Kincaid, W. Cheney: Analiza numeryczna. WNT, Warszawa, 2006. 2. Z. Fortuna, B. Macukow, J. Wąsowski: Metody numeryczne. WNT, Warszawa, 2006. 3. B. Baron, Ł. Piątek: Metody numeryczne w C++Builder. Helion, Gliwice, 2004. 4. A. Dobrowolski: Pod maską SPICE a. Metody i algorytmy analizy układów elektronicznych. Wydawnictwo BTC, Warszawa, 2004. 5. J. Ogrodzki: Komputerowa analiza układów elektronicznych. Wydawnictwo Naukowe PWN, Warszawa, 1994. 6. L.O. Chua, Pen-Min Lin: Komputerowa analiza układów elektronicznych: algorytmy i metody obliczeniowe. WNT, Warszawa, 1981.

Wykład nr 1 6/34 Wykład a pracownia Wykład Pracownia 1 2 3 4 5 6 7 8 9 Tablice i wskaźniki w języku C. Dynamiczny przydział pamięci. Pliki w języku C. Typy plików, operacje na plikach. Wprowadzenie do metod numerycznych. Błędy w obliczeniach numerycznych Operacje na wektorach i macierzach. Rozwiązywanie układów równań liniowych: metody dokładne i iteracyjne. Metody poszukiwania pierwiastków funkcji nieliniowych: bisekcji, regula falsi, siecznych. Metody całkowania numerycznego: prostokątów, trapezów, parabol. Algorytmy stosowane w komputerowej analizie obwodów elektrycznych. Środowisko SPICE. Ogólna struktura i zasada działania systemów komputerowych. Klasyfikacja komputerów. System operacyjny. 1 2 3 4 5 6 7 8 9 Zajęcia organizacyjne. Środowisko DEV-C++, tworzenie analiza i uruchomianie programów w języku C. Typy, zmienne, stałe, operatory i wyraŝenia arytmetyczne. Operatory relacyjne i logiczne, instrukcje warunkowe oraz sterujące, funkcje w języku C. Typ strukturalny, konstruowanie struktur prostych oraz złoŝonych, dostęp do składowych, wskaźniki do struktur. Tablice jedno- i wielowymiarowe, wskaźniki, operacje na wskaźnikach, dynamiczny przydział pamięci - instrukcje: malloc(), calloc(), free(). Operacje na plikach tekstowych, instrukcje: fscanf(), fprintf(). Operacje na plikach binarnych, instrukcje: fread(), fwrite(). Metody poszukiwania miejsc zerowych funkcji. Metody całkowania numerycznego: metoda prostokątów, trapezów, parabol. Operacje na wektorach i macierzach. Metody rozwiązywania układów równań liniowych.

Wykład nr 1 7/34 Zaliczenie wykładu Kolokwium pisemne termin zostanie ustalony pod koniec semestru liczba podejść: min. 2

Wykład nr 1 8/34 Plan wykładu nr 1 Tablice w języku C - przypomnienie wiadomości Wskaźniki co to jest wskaźnik? deklaracja wskaźnika operacje na wskaźnikach Wskaźniki a tablice Dynamiczny przydział pamięci funkcje calloc, malloc i free operatory new i delete

Wykład nr 1 9/34 Tablice jednowymiarowe tablica jest to ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu int tab[5]; deklarując tablicę musimy podać: typ elementów tablicy, nazwę tablicy oraz liczbę elementów tablicy: średnik rozmiar tablicy nazwa tablicy typ elementów tablicy rozmiar tablicy musi być dodatnią stałą całkowitoliczbową, a ponadto musi to być wartość znana juŝ w fazie kompilacji (nie moŝe to być zmienna) powyŝsza deklaracja definiuje tablicę pięciu elementów typu int, jest to tablica jednowymiarowa, czyli tzw. wektor: kaŝdy element tablicy ma swój numer zwany indeksem, pierwszy element ma indeks 0 (zero), zaś ostatni N-1, gdzie N - rozmiar tablicy jako indeks moŝe występować wyraŝenie, ale w wyniku musi ono dawać liczbę całkowitą nazwa tablicy jest adresem jej pierwszego elementu (o indeksie 0) w pamięci komputera

Wykład nr 1 10/34 Tablice jednowymiarowe Odwołanie do elementów tablicy: odwołania do elementów tablicy (odczytanie lub zapisanie wartości) wykonuje się za pomocą dwuargumentowego operatora indeksowania [ ]: Przykład: tab[1]=5; - zapisanie do drugiego elementu tablicy tab wartości 5 x=tab[1]; - odczytanie drugiego elementu z tablicy tab i przypisanie jego wartości zmiennej x przy odwołaniach do elementów tablicy kompilator nie sprawdza, czy piszemy lub czytamy poza obszarem pamięci przydzielonej tablicy, np. int tab[5]; tab[5]=10; - deklaracja tablicy - błąd!!!, nie istnieje element o indeksie 5, ale kompilator nie zasygnalizuje błędu, tylko w obszarze za tablicą zapisze wartość 10

Wykład nr 1 11/34 Tablice dwuwymiarowe Deklaracja tablicy dwuwymiarowej: deklarując tablicę dwuwymiarową musimy podać: typ elementów tablicy, nazwę tablicy oraz liczbę wierszy i kolumn tablicy float tab[3][4]; przedstawiona deklaracja definiuje tablicę dwunastu elementów typu float, składającą się z trzech wierszy i czterech kolumn tablica dwuwymiarowa nazywana jest macierzą odwołując się do elementów tablicy dwuwymiarowej musimy podać dwa indeksy: numer wiersza i numer kolumny, na przecięciu których znajduje się dany element średnik liczba kolumn tablicy liczba wierszy tablicy nazwa tablicy typ elementów tablicy Przykład: tab[1][2]=10; x=tab[1][2]; - zapisanie wartości - odczytanie wartości

Wykład nr 1 12/34 Inicjalizacja elementów w tablicy po zadeklarowaniu tablicy wartość jej elementów jest nieokreślona inicjalizacja elementów tablicy jest to nadanie wartości jej elementom od razu przy deklaracji inicjalizacja taka polega na umieszczeniu w deklaracji po znaku równości, ujętej w nawiasy klamrowe, listy wartości kolejnych jej elementów, oddzielonych od siebie przecinkami (lista ta moŝe zawierać równieŝ wyraŝenia) Przykład: int a[3]={5,7,1}; int b[2][3]={{3,6,2},{4,1,0}}; int b[2][3]={3,6,2,4,1,0}; obie deklaracje tablicy b oznaczają dokładnie to samo poszczególne wiersze macierzy moŝna wyróŝnić dodatkowymi nawiasami klamrowymi (pierwsza postać)

Wykład nr 1 13/34 Inicjalizacja elementów w tablicy tablice moŝna inicjalizować tylko przy deklaracji jeśli wartości podanych w trakcie inicjalizacji jest mniej niŝ wynosi rozmiar tablicy, to pozostałe elementy tablicy wypełniane są zerami Przykład: int b[2][3]={3,6,2,4}; 0 1 0 1 2 3 6 2 4 0 0 elementy uzupełnione zerami int b[2][3]={0}; - wypełnienie całej tablicy zerami tablica zadeklarowana bez podania rozmiaru, a zainicjowana ma ilość elementów równą ilości inicjatorów: int a[]={2,3,1,4}; jest równowaŝne int a[4]={2,3,1,4};

ś ś Podstawy informatyki (st. niestacjonarne, 2006/2007) Wykład nr 1 14/34 Wskaźniki - gdzie juŝ występowa powały? Funkcja scanf: funkcja scanf wymaga podania adresów zmiennych pod którymi będą zapamiętane dane odczytane z klawiatury, np. int a, b; float c; char txt[10]; scanf( %d %d %f %s, &a, &b, &c, txt); Struktury: przy omawianiu struktur wspominane jest, Ŝe jeśli posługujemy się wskaźnikami na struktury, to do odwołania do pól struktury stosujemy operator pośredniego wyboru pola: -> struct punkt { int x, y; } p1, *p2; p2 = &p1; p1.x = 10; /* operator bezpo redniego wyboru pola */ p2->x = 10; /* operator po redniego wyboru pola */

Wykład nr 1 15/34 Co to jest wskaźnik? Wskaźnik jest zmienną mogącą zawierać adres obszaru pamięci, a w szczególności adres innej zmiennej (obiektu) Rozpatrzmy następujące deklaracje zmiennych i sposób przechowywania ich w pamięci komputera: int a; float b; char c, d; int tab[4]; int e; double f; wszystkie zmienne przechowywane są w pamięci komputera i zaleŝnie od typu zmiennej zajmują określoną liczbę bajtów kaŝda zmienna oprócz nazwy, której uŝywa programista, ma takŝe adres komputer nie posługuje się nazwami zmiennych tylko ich adresami

Wykład nr 1 16/34 Co to jest wskaźnik? Wskaźnik jest zmienną mogącą zawierać adres obszaru pamięci, a w szczególności adres innej zmiennej (obiektu) Rozpatrzmy następujące deklaracje zmiennych i sposób przechowywania ich w pamięci komputera: int a; float b; char c, d; int tab[4]; int e; double f; w powyŝszym przykładzie poszczególne zmienne mają następujące adresy: a 100 (int, 4 bajty) b 104 (float, 4 bajty) c 108 (char, 1 bajt) d 109 (char, 1 bajt) e 126 (int, 4 bajty) f 130 (double, 8 bajtów) tab 110 (tablica, int, 4 4 bajty)

Wykład nr 1 17/34 Wskaźniki Deklaracja wskaźnika: adres określa miejsce w pamięci, nie mówi natomiast nic na temat rozmiaru wskazywanego obiektu deklarując wskaźnik (zmienną wskazującą) musimy podać typ obiektu na jaki on wskazuje deklaracja zmiennej wskazującej wygląda tak samo jak deklaracja kaŝdej innej zmiennej, tylko Ŝe jej nazwa poprzedzona jest symbolem gwiazdki (*): typ *nazwa_zmiennej; lub typ* nazwa_zmiennej; Przykład: int *ptr; powyŝszy zapis oznacza deklarację zmiennej wskaźnikowej na typ int mówimy, Ŝe zmienna ptr jest typu: wskaźnik na zmienną typu int, a zatem moŝe przechowywać adresy zmiennych a i e typu int z wcześniejszego przykładu

Wykład nr 1 18/34 Wskaźniki do przechowywania adresu zmiennej f typu double trzeba zadeklarować zmienną typu: wskaźnik na zmienną typu double, czyli np. double *ptrd; moŝna konstruować wskaźniki na dane dowolnego typu łącznie z typami wskaźnik na... lub wskaźnik na wskaźnik na... char **wsk; w powyŝszym przykładzie wsk jest typu wskaźnik na wskaźnik na typ char moŝna deklarować tablice wskaźników Uwaga: deklaracja wskaźnika wydziela tylko obszar pamięci dla przechowywania wskaźnika, tj. adresu (dla komputerów PC są to 2 lub 4 bajty, zaleŝnie od tego czy adresy są bliskie - near, czy dalekie - far), nie jest natomiast przydzielany obszar dla danych, na które ma wskazywać wskaźnik

Wykład nr 1 19/34 Wskaźniki Przypisywanie wskaźnikom adresów innych zmiennych: adresy zmiennych, które moŝna przypisać wskaźnikom, tworzy się za pomocą jednoargumentowego operatora pobierania adresu & (znanego z funkcji scanf): int a = 10; - deklaracja zmiennej typu int i nadanie jej wartości 10 int *ptr; ptr = &a; - deklaracja wskaźnika na zmienną typu int - przypisanie zmiennej ptr adresu zmiennej a (od tej chwili zmienna ptr wskazuje na zmienną a; a - zmienna typu int, &a - adres zmiennej a) Odwołanie do zmiennej poprzez jej adres: mając adres zmiennej moŝna dostać się do jej wartości uŝywając tzw. operatora wyłuskania (odwołania pośredniego) oznaczanego przez gwiazdkę (*) *ptr = 20; - jest równowaŝne z tym, Ŝe zmiennej a z powyŝszego przykładu przypisujemy wartość 20

Wykład nr 1 20/34 Wskaźniki Odwołanie do zmiennej poprzez jej adres: jeśli ptr jest wskaźnikiem na jakiś obiekt, to *ptr jest obiektem (zawartością pamięci pod adresem zawartym w ptr, interpretowaną zgodnie z typem obiektu, na który wskazuje ptr) Przykład: int a = 10; /* a - zmienna typu int */ int *ptr = &a; /* ptr - wskaźnik na zmienną typu int */ int **ptr1 = &ptr; /* ptr1 - wskaźnik na wskaźnik na zmienną typu int */ a = 20; /* przypisanie zmiennej a wartości 20 */ *ptr = 20; /* j.w. */ *(*ptr1) = 20; /* j.w. */ efekt końcowy wykonania trzech ostatnich instrukcji jest taki sam

Wykład nr 1 21/34 Wskaźniki Uwaga: zmiennej wskaźnikowej moŝna nadać wartość zerową, co oznacza, Ŝe wskaźnik na nic nie wskazuje - naleŝy stosować wtedy stałą o nazwie NULL int *ptr; ptr = NULL;

Wykład nr 1 22/34 Wskaźniki - przykład #include <stdio.h> int main() { int a = 10; /* deklaracja Wartosc zmiennej zmiennej typu int a */ a = 20 int *ptr; /* deklaracja wskaznika na zmienna typu int */ printf("wartosc zmiennej a a = %d\n",a); printf("adres zmiennej a &a = %d\n",&a); ptr = &a; /* zmiennej ptr przypisujemy adres zmiennej a */ printf("adres zmiennej a ptr = %d\n",ptr); printf("wartosci zmiennej a *ptr = %d\n",*ptr); *ptr = 20; /* zmiana wartosci zmiennej a */ printf("wartosci zmiennej a *ptr = %d\n",*ptr); printf("wartosc zmiennej a a = %d\n",a); Wartosc zmiennej a a = 10 Adres zmiennej a &a = 2293644 Adres zmiennej a ptr = 2293644 Wartosci zmiennej a *ptr = 10 Wartosci zmiennej a *ptr = 20 } return 0; Przykładowe operacje na wskaźnikach

Wykład nr 1 23/34 Wskaźniki Operacje na wskaźnikach: na wskaźnikach dopuszczalne są następujące operacje: przypisywanie wartości innych wskaźników oraz zera (NULL) dodawanie do wartości wskaźnika liczb całkowitych obliczanie róŝnicy wskaźników porównywanie wartości wskaźnika z zerem (wartością stałej NULL) porównywanie wskaźników między sobą przekształcanie wskaźników (konwersje wskaźnikowe) dodanie do wskaźnika lub odjęcie wartości całkowitej 1 oznacza zwiększenie lub zmniejszenie adresu o wartość zaleŝną od tego na jaki typ wskazuje wskaźnik jeśli mamy zadeklarowany wskaźnik: typ *ptr; to wyraŝenie (ptr + n) wskazuje na obszar odległy o n * sizeof(typ) bajtów od adresu zawartego w ptr

Wykład nr 1 24/34 Wskaźniki a tablice nazwa tablicy jest adresem pierwszego elementu tablicy int tab[5] = {10,15,37,16,25}; tab - nazwa tablicy będąca adresem jej pierwszego elementu *tab - wartość pierwszego elementu tablicy (10) - równowaŝny zapis: tab[0] *(tab+1) - wartość drugiego elementu tablicy (15) - równowaŝny zapis: tab[1] *(tab+2) - wartość trzeciego elementu tablicy (37) - równowaŝny zapis: tab[2]... ogólnie: tab[i] jest równowaŝne: *(tab+i)

Wykład nr 1 25/34 Wskaźniki a tablice w zapisie *(tab+i) nawiasy są konieczne, gdyŝ operator * ma bardzo wysoki priorytet Przykład: int tab[5] = {10,15,37,16,25},x; x = *(tab+2); printf( x = %d,x); /* x = 37 */ x = *tab+2; printf( x = %d,x); /* x = 12 */ x = *(tab+2); jest równowaŝne x = tab[2]; x = *tab+2; jest równowaŝne x = tab[0] + 2;

Wykład nr 1 26/34 Dynamiczny przydział pamięci deklaracja tablicy w języku C wymaga, aby jej rozmiar był znany juŝ na etapie kompilacji programu w przypadku, gdy rozmiar tablicy będzie znany dopiero podczas wykonania programu, pamięć naleŝy przydzielić dynamicznie do tego celu słuŝą funkcje dynamicznego przydziału pamięci: calloc malloc i zwalniania pamięci: free działanie powyŝszych funkcji polega na przydzielaniu i zwalnianiu bloków pamięci w obszarze stosu zmiennych dynamicznych

Wykład nr 1 27/34 Dynamiczny przydział pamięci CALLOC void *calloc(size_t n, size_t size); stdlib.h funkcja calloc przydziela blok pamięci o rozmiarze n*size (czyli blok pamięci mogący pomieścić tablicę n-elementów podanego rozmiaru size) i zwraca wskaźnik do tego bloku jeśli pamięci nie moŝna przydzielić, to funkcja zwraca wartość NULL przydzielona pamięć jest inicjowana zerami MALLOC void *malloc(size_t size); stdlib.h funkcja malloc przydziela blok pamięci o rozmiarze określonym parametrem size i zwraca wskaźnik do tego bloku jeśli pamięci nie moŝna przydzielić, to funkcja zwraca wartość NULL przydzielona pamięć nie jest inicjowana

Wykład nr 1 28/34 Dynamiczny przydział pamięci zwracaną przez funkcje calloc i malloc wartość wskaźnika naleŝy rzutować na właściwy typ, np. przydział pamięci na 10 elementową tablicę elementów typu int: int *tab; tab = (int *) calloc(10,sizeof(int)); /*... */ free(tab); do elementów takiej tablicy odwołujemy się tak samo jak do elementów zwykłej tablicy (ale tylko w przypadku tablic jednowymiarowych!!!) przydzieloną pamięć naleŝy po wykorzystaniu zwolnić funkcją free FREE void *free(void *ptr); stdlib.h funkcja free zwalnia blok pamięci wskazywany parametrem ptr wartość ptr musi być wynikiem wcześniejszego wywołania funkcji calloc lub malloc

Wykład nr 1 29/34 Dynamiczny przydział pamięci - przykład Podaj ilosc liczb: 5 #include <stdio.h> #include <stdlib.h> Podaj liczbe nr 1: 1 Podaj liczbe nr 2: 2 int main() Podaj liczbe nr 3: 3 { int *tab, i, n, x; Podaj liczbe nr 4: 4 float suma = 0.0; Podaj liczbe nr 5: 5 Srednia 5 liczb wynosi 3.000000 printf("podaj ilosc liczb: "); scanf("%d",&n); tab = (int *) calloc(n,sizeof(int)); if (tab == NULL) { printf("nie mozna przydzielic pamieci.\n"); exit(-1); } for (i=0; i<n; i++) /* wczytanie liczb */ { printf("podaj liczbe nr %d: ",i+1); scanf("%d",&x); tab[i] = x; } for (i=0; i<n; i++) suma = suma + tab[i]; printf("srednia %d liczb wynosi %f\n",n,suma/n); } free(tab); return 0; Przydział pamięci na n-liczb typu int, wczytanie liczb, obliczenie średniej

Wykład nr 1 30/34 Dynamiczny przydział pamięci w programie z poprzedniego slajdu moŝna zrezygnować ze zmiennej x i liczby wczytywać bezpośrednio do tablicy tab - pętla wczytująca liczby będzie miała wtedy postać: for (i=0; i<n; i++) /* wczytanie liczb */ { printf("podaj liczbe nr %d: ",i+1); scanf("%d",&tab[i]); } wczytywanie liczb moŝna zapisać jeszcze w inny sposób ((tab+i) jest adresem i-tego elementu tablicy): for (i=0; i<n; i++) /* wczytanie liczb */ { printf("podaj liczbe nr %d: ",i+1); scanf("%d",(tab+i)); }

Wykład nr 1 31/34 Operatory new i delete (C++) Operator new: w najprostszym przypadku zastosowanie operatora new ma postać: typ *ptr = new typ; operator ten alokuje obszar pamięci niezbędny dla przechowywania obiektu typu typ i zwraca wskaźnik na początek tego obszaru jeśli alokacja pamięci nie jest moŝliwa, to zwracana jest wartość NULL typ wskaźnika jest odpowiednio dopasowany do typu obiektu, więc nie są konieczne Ŝadne konwersje wskaźnikowe pamięć przydzielona przez operator new istnieje do zakończenia programu lub do chwili zwolnienia tej pamięci za pomocą operatora delete Operator delete: w najprostszym przypadku operator delete ma postać: delete ptr; gdzie ptr jest wskaźnikiem wskazującym na obiekt stworzony przez new

Wykład nr 1 32/34 Operatory new i delete (C++) - przykład #include <stdio.h> *ptr = 10 int main() { int *ptr; ptr = new int; if (ptr == NULL) { printf("blad przydzialu pamieci.\n"); return 1; } *ptr = 10; printf("*ptr = %d\n",*ptr); delete ptr; } return 0; Przydział pamięci operatorem new i zwolnienie operatorem delete

Wykład nr 1 33/34 Operatory new i delete (C++) operatory new i delete stosuje się zazwyczaj przy tworzeniu dynamicznych tablic oraz przy tworzeniu dynamicznych struktur danych (stos, kolejka, lista) utworzenie tablicy n elementów typu typ ma postać: typ *ptr = new typ[n] wartością powyŝszego wyraŝenia jest wskaźnik na typ (a nie na tablicę elementów typu typ) jako rozmiar tablicy n moŝna podać dowolne wyraŝenie, a nie tylko wyraŝenie stałe niestety nie moŝna w ten sposób tworzyć dynamicznych tablic wielowymiarowych usuwając tablicę, trzeba podać, Ŝe chodzi o tablicę, a nie o pojedynczy element: delete [] ptr; gdzie ptr jest wskaźnikiem zwróconym przez operator new podczas tworzenia dynamicznej tablicy

Wykład nr 1 34/34 Operatory new i delete (C++) - przykład Podaj ilosc liczb: 5 #include <stdio.h> #include <stdlib.h> Podaj liczbe nr 1: 1 Podaj liczbe nr 2: 2 int main() Podaj liczbe nr 3: 3 { int *tab, i, n; Podaj liczbe nr 4: 4 float suma = 0.0; Podaj liczbe nr 5: 5 Srednia 5 liczb wynosi 3.000000 printf("podaj ilosc liczb: "); scanf("%d",&n); tab = new int[n]; if (tab == NULL) { printf("nie mozna przydzielic pamieci.\n"); exit(-1); } for (i=0; i<n; i++) /* wczytanie liczb */ { printf("podaj liczbe nr %d: ",i+1); scanf("%d",&tab[i]); } for (i=0; i<n; i++) suma = suma + tab[i]; printf("srednia %d liczb wynosi %f\n",n,suma/n); } delete [] tab; return 0; Przydział pamięci na n-liczb typu int, wczytanie liczb, obliczenie średniej