Wskaźniki i struktury. Programowanie C, LA Anna Gogolińska

Podobne dokumenty
Wskaźniki w C. Anna Gogolińska

Dynamiczne struktury danych: listy

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

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

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

Programowanie komputerowe. Zajęcia 7

Wykład 1: Wskaźniki i zmienne dynamiczne

Rysunek 1 Przykładowy graf stanów procesu z dyskretnymi położeniami.

Podstawy programowania komputerów

Algorytmy tekstowe na przykładzie KMP

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

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

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

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

ZASADY PROGRAMOWANIA KOMPUTERÓW

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

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

Wskaźniki. Programowanie Proceduralne 1

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

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

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

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

Lab 9 Podstawy Programowania

Tablice, funkcje - wprowadzenie

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

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

Struktury. Przykład W8_1

Techniki Programowania wskaźniki

Język C++ zajęcia nr 2

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

Programowanie komputerowe. Zajęcia 4

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

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

Teoria informacji i kodowania Ćwiczenia Sem. zimowy 2016/2017

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:

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

Języki i techniki programowania Ćwiczenia 2

Podstawy Programowania 2 Dwukierunkowa lista liniowa. Plan. Wstęp. Implementacja. Notatki. Notatki. Notatki. Notatki.

Laboratorium 5: Tablice. Wyszukiwanie binarne

. Podstawy Programowania 2. Jednokierunkowa lista liniowa. Arkadiusz Chrobot. 28 marca 2017

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.

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

Programowanie w C++ Wykład 4. Katarzyna Grzelak. 19 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 37

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

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

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

Stałe, tablice dynamiczne i wielowymiarowe

Wstęp do programowania

IX. Wskaźniki.(3 godz.)

Wstęp do programowania

Programowanie strukturalne i obiektowe. Funkcje

Podstawy Programowania 2 Jednokierunkowa lista liniowa. Plan. Jednokierunkowa lista liniowa. Jednokierunkowa lista liniowa. Notatki. Notatki.

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

Wstęp do programowania

6 Przygotował: mgr inż. Maciej Lasota

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

. Podstawy Programowania 2. Dwukierunkowa lista liniowa. Arkadiusz Chrobot. 7 kwietnia 2019

Algorytmy i język C++

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

Podstawy programowania obiektowego

Aplikacje w środowisku Java

Wykład 8: klasy cz. 4

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

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

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

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

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Procesy i wątki. Krzysztof Banaś Obliczenia równoległe 1

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

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Wykład 5: Klasy cz. 3

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

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

Tablice, funkcje, wskaźniki - wprowadzenie

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

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

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Futex (Fast Userspace Mutex) Łukasz Białek

Wskaźniki. Informatyka

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

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

Proste algorytmy w języku C

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

Podstawy programowania

07DRAP - Zmienne losowe: dyskretne i ciągłe

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Deklaracja struktury w C++

Przeciążenie (przeładowanie nazw) funkcji

Dynamiczne struktury danych

Referencje do zmiennych i obiektów

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

Podstawy programowania. Podstawy C# Tablice

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

Transkrypt:

Wskaźniki i struktury Programowanie C, LA Anna Gogolińska

Wskaźniki i struktury Jednym z ól struktury może być wskaźnik na zmienną tyu tej struktury. Deklaracja jest z użyciem formy: ty *. Poza tym olem, struktura może (i owinna) zawierać inne ola już niekoniecznie wskaźniki. struct lista{ ; int klucz; double klucz2; struct lista * wsk; W takiej sytuacji zazwyczaj tworzy się nową zmienną orzez wskaźnik i rzydzielenie mu amięci. struct lista * ; = (struct lista*) malloc(sizeof(struct lista )); Dla orównania wskaźnik na int (ełna analogia): int * w = (int *)malloc(sizeof(int));

Tworzenie Można sobie wyobrazić, że oniższe instrukcje tworzą: struct lista * ; = (struct lista*)malloc(sizeof(struct lista)); klucz1 klucz2 wsk Zaraz o stworzeniu (rzydzieleniu amięci) ola w strukturze są uste, należy nadać im wartości. Robi się to jak w rzyadku zwykłych wskaźników (dodanie * owoduje że odwołujemy się do obiektu wskazywanego rzez wskaźnik) oraz jak w rzyadku struktur z użyciem.

Nadanie wartości (*).klucz1 = 2; (*).klucz2 = 3.2; 2 3.2 (*).wsk = NULL; NULL Zais ten jest jednak niewygodny (należy używać nawiasów onieważ. ma wyższy riorytet niż *). Dlatego zastąiono zais (*). rzez -> (myślnik i znak większości). Oba zaisy są równoważne. ->klucz1 = 5; ->klucz2 = 7.1; ->wsk = NULL; 5 7.1 NULL

Listy Jeśli mamy już jedną zmienną (jak n. z orzednich slajdów) i stworzymy drugą możemy ustawić, aby nowo utworzona wskazywała na (a nie na NULL jak jest to w rzyadku na orzednim slajdzie). W ten sosób będziemy mieć dwie ołączone zmienne. struct lista * nowy = (struct lista*) malloc(sizeof(struct lista )); nowy->klucz1 = 2; nowy->klucz2 = 5.4; nowy->wsk = ; nowy 2 5.4 5 7.1 NULL

Listy dodawanie elementów A gdyby owtórzyć czynność z orzedniego slajdu i stworzyć trzecią zmienną, która będzie wskazywać na orzednio stworzoną? Aby kod mógł być uniwersalny (a nie ciągle zmieniać nazwy iewszej zmiennej w szeregu) należy ustalić jedną zmienną, która zawsze będzie wskazywać na oczątek ciągu zmiennych w naszym rzyadku będzie to. Po dodaniu kolejnego elementu z rzodu należy rzestawić na ten element. struct lista * nowy = (struct lista*) malloc(sizeof(struct lista )); nowy->klucz1 = 2; nowy->klucz2 = 5.4; nowy->wsk = ; = nowy; nowy 2 5.4 5 7.1 NULL

Listy Porzez owtarzanie czynności z orzedniego slajdu owstanie łańcuch zmiennych, którego długość będzie się mogła zmieniać i będzie mogła być teoretycznie nieskończona (ogranicza nas wielkość amięci). Taki łańcuch nazywany jest listą i można o niej myśleć jak o tablicy struktur, która nie ma ustalonej długości. while(warunek){ nowy struct lista * nowy = (struct lista*) malloc(sizeof(struct lista )); nowy->klucz1 = a; nowy->klucz2 = b; nowy->wsk = ; = nowy; xx yy xx yy xx yy 2 5.4 5 7.1 NULL

Usuwanie z listy (oczątek) Z listy usuwamy elementy z użyciem funkcji free() (zwalnianie amięci, rzeciwnie do malloc). Jeśli chcemy usunąć ierwszy element należy amiętać, żeby wierw rzestawić, aby wskazywało na drugi, a o usunięciu ierwszy element list. /*zakładamy że to zmienna globalna więc nie trzeba rzekazywać jej do funkcji*/ void usun(void){ struct lista *om; om = ; = ->wsk; free(om); om Tworzymy omocniczą zmienną którą ustawiamy na oczątek, aby zaamiętać go, kiedy już rzesuniemy.

Usuwanie z listy (oczątek) Z listy usuwamy elementy z użyciem funkcji free() (zwalnianie amięci, rzeciwnie do malloc). Jeśli chcemy usunąć ierwszy element należy amiętać, aby wierw rzestawić, aby wskazywało na drugi, a o usunięciu ierwszy element list. /*zakładamy że to zmienna globalna więc nie trzeba rzekazywać jej do funkcji*/ void usun(void){ struct lista *om; om = ; = ->wsk; free(om); om Przesuwamy - teraz wskazuje na drugi element. Przed rzesunięciem ->wks to był właśnie ten drugi element.

Usuwanie z listy (oczątek) Z listy usuwamy elementy z użyciem funkcji free() (zwalnianie amięci, rzeciwnie do malloc). Jeśli chcemy usunąć ierwszy element należy amiętać, aby wierw rzestawić, aby wskazywało na drugi, a o usunięciu ierwszy element list. /*zakładamy że to zmienna globalna więc nie trzeba rzekazywać jej do funkcji*/ void usun(void){ struct lista *om; om = ; = ->wsk; Usuwamy element om na rysunku ozostawiony jest on na szaro, w rzeczywistości o wykonaniu instrukcji już nie istnieje. Mamy listę o 1 krótszą, a jej ierwszym elementem jest. free(om); om

Usuwanie z listy (środek) Jeśli chcemy usunąc element ze środka należy amiętać, aby wierw rzestawić wskaźnik jego orzednika na element nastęny, aby nie owstała dziura. /*zakładamy że to zmienna globalna, argumentem jest numer elementu do usunięcia, jest to element ze środka, nie koniec i nie oczątek listy */ void usun2(int nr){ int i; struct lista * om, *o; om = ; o = NULL; for(i = 0; i < nr; i++){ o = om; om = om->wsk; o->wsk = om->wsk; free(om); om o Tworzymy dwie omocnicze zmienne, z których om będzie wskazywać usuwany element, a o jego orzednik. Początkowo om wskazuje na oczątek listy, a o na NULL.

Usuwanie z listy (środek) Jeśli chcemy usunąc element ze środka należy amiętać, aby wierw rzestawić wskaźnik jego orzednika na element nastęny, aby nie owstała dziura. /*zakładamy że to zmienna globalna, argumentem jest numer elementu do usunięcia, jest to element ze środka */ void usun2(int nr){ int i; struct lista * om, *o; om = ; o = NULL; for(i = 0; i < nr; i++){ o = om; om = om->wsk; o->wsk = om->wsk; free(om); om o W ętli rzesuwamy się o liście. Pętla trwa aż nie dojdziemy do elementu o numerze odanym do usunięciu (nie srawdzamy czy doszliścy do końca listy). Najierw o wskazuje na tą samą zmienną co om.

Usuwanie z listy (środek) Jeśli chcemy usunąc element ze środka należy amiętać, aby wierw rzestawić wskaźnik jego orzednika na element nastęny, aby nie owstała dziura. /*zakładamy że to zmienna globalna, argumentem jest numer elementu do usunięcia, jest to element ze środka */ void usun2(int nr){ int i; struct lista * om, *o; om = ; o = NULL; for(i = 0; i < nr; i++){ o = om; om = om->wsk; o->wsk = om->wsk; free(om); o om Nastęnie om jest rzesuwany na kolejny element (kolejny to ten na który on wskazuje). Dzięki tym oeracjom om będzie wskazywać element do usunięci, a o jego orzednik.

Usuwanie z listy (środek) Jeśli chcemy usunąc element ze środka należy amiętać, aby wierw rzestawić wskaźnik jego orzednika na element nastęny, aby nie owstała dziura. /*zakładamy że to zmienna globalna, argumentem jest numer elementu do usunięcia, jest to element ze środka */ void usun2(int nr){ int i; struct lista * om, *o; om = ; o = NULL; for(i = 0; i < nr; i++){ o = om; om = om->wsk; o->wsk = om->wsk; free(om); o om Aby nie owstała dziura w liście, ustawiamy, że elementem nastęnym o o będzie element nasteny dla om (czyli dwa elementy dalej) leiej widać to na obrazku.

Usuwanie z listy (środek) Jeśli chcemy usunąc element ze środka należy amiętać, aby wierw rzestawić wskaźnik jego orzednika na element nastęny, aby nie owstała dziura. /*zakładamy że to zmienna globalna, argumentem jest numer elementu do usunięcia, jest to element ze środka */ void usun2(int nr){ int i; struct lista * om, *o; om = ; o = NULL; for(i = 0; i < nr; i++){ o = om; om = om->wsk; o->wsk = om->wsk; free(om); o Teraz już możemy usunąć zmienną om. Lista jest taka jakiej oczekiwalismy.

Przeglądanie listy Nieraz należy rzejrzeć całą listę (n. aby ją wyisać). Można to wykonać dzięki wartości NULL na końcu. /* bedzie oczatkiem listy i zmienna globalna*/ void rzejrzyj(){ struct lista *om; om = ; Pomocnicza zmienna om, która wskazuje na oczątek listy, aby orzez rzesuwanie go nie stracić. while(om!= NULL){ W ętli srawdzamy czy nie doszliśmy do końca koniec rozoznajemy onieważ ma on wartość NULL. oeracja na elemencje n. rintf( %d\n, om->klucz1); om = om->wsk; Przesuwamy om na nastęny element, czyli ten na który on obecnie wskazuje. Ponieważ om na oczątku równy jest oczątkowi listy, a na końcu jej końcowi to rzejrzane zostaną wszystkie elementy.

Uwagi i rady W rzykładach okazano tylko dodawanie elementów na oczątek. Jak wiadomo z zajęć z algorytmów elementy można dodawać i usuwać z oczątku lub z końca w zależności od struktury, którą tworzymy (stos, kolejna). W zależności od otrzeb można również stworzyć listę w której wybieramy sobie gdzie wstawić element lub który usunąć (usuwanie okazane na slajdach). Początki i końce (w zależności od otrzeb też inne elementy) kolejek czy stosów najwygodniej jest zadeklarować jako zmienne globalne. Jeśli zrobi się inaczej mogą wystąić trudności w isaniu funkcji aby nie modyfikowały one tylko lokalnych wartości.

Uwagi i rady Wszystkie wskaźniki w nowo utworzonych zmiennych najleiej jest wyzerować (rzyisań NULL). Należy amiętać o rzyisywaniu wartości NULL wszędzie gdzie jest to otrzebne onieważ tylko dzięki niej jesteśmy w stanie rozoznać czy znajdujemy się na końcu listy. Częstym błędem jest nierzydzielanie amięci dla elementów jeśli tylko tworzymy nowy element (wówczas kiedy rzyisujemy jego olom wartości) należy wierw rzydzielić amięć. Wykonując oeracje na elementach należy zazwyczaj rozróżnić rzyadek kiedy oerujemy na ierwszym, ostatnim i środkowych elementach (jak w rzyadku usuwania).