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

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

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

Struktury, unie, formatowanie, wskaźniki

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

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

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

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

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

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

Funkcje Typy wyliczeniowe Struktury, unie Scanf / printf Wskaźniki

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

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.

Lab 9 Podstawy Programowania

Techniki Programowania wskaźniki

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

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

Informatyka I: Instrukcja 4.2

Wstęp do wskaźników w języku ANSI 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:

Programowanie komputerowe. Zajęcia 3

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

ZASADY PROGRAMOWANIA KOMPUTERÓW

Wskaźniki w C. Anna Gogolińska

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

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

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

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

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

Podstawy programowania w języku C++

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

Programowanie komputerowe. Zajęcia 4

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

Referencje do zmiennych i obiektów

Zadania z podstaw programowania obiektowego

XV. Wskaźniki Odczytywanie adresu pamięci istniejących zmiennych Wskaźniki pierwsze spojrzenie.

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

Funkcje. Deklaracja funkcji. Definicja funkcji. Wykorzystanie funkcji w programie.

Zadanie 2: Arytmetyka symboli

Programowanie proceduralne w języku C++ Funkcje

Wskaźniki. Informatyka

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

Języki i techniki programowania Ćwiczenia 2

Zadeklarowanie tablicy przypomina analogiczną operację dla zwykłych (skalarnych) zmiennych. Może zatem wyglądać na przykład tak:

Funkcja, argumenty funkcji

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

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

Wstęp do programowania obiektowego, wykład 7

Wskaźniki. Programowanie Proceduralne 1

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

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

> C++ typy wyliczeniowe, struktury, unie, konwersje napis <-> liczba, formatowanie wyjścia

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

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 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Część 4 życie programu

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

Laboratorium nr 10. Temat: Funkcje cz.2.

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

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Wstęp do informatyki- wykład 11 Funkcje

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

O podstawowych operacjach na tablicach. Mateusz Ziółkowski, MBiU II

1 Podstawy c++ w pigułce.

Programowanie - wykład 4

Wstęp do informatyki- wykład 9 Funkcje

Programowanie strukturalne i obiektowe. Funkcje

Struktury Struktura polami struct struct struct struct

Algorytmika i programowanie. Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie

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

MACIERZE. Sobiesiak Łukasz Wilczyńska Małgorzata

Język C++ zajęcia nr 2

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Algorytmy i język C++

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

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

TEMAT : KLASY DZIEDZICZENIE

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

1 Podstawy c++ w pigułce.

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Podstawy programowania w języku C++

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

STL: Lekcja 1&2. Filozofia STL

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

Rekurencja (rekursja)

Wykład 1: Wskaźniki i zmienne dynamiczne

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

IX. Wskaźniki.(3 godz.)

// deklaracja zmiennej typu int oraz wskaźnika na zmienne tego typu int zmienna = 10;

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

Zmienne, stałe i operatory

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

Tablice, funkcje, wskaźniki - wprowadzenie

Język C zajęcia nr 11. Funkcje

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

Argumenty wywołania programu, operacje na plikach

Programowanie komputerowe. Zajęcia 1

Aplikacje w środowisku Java

Ok. Rozbijmy to na czynniki pierwsze, pomijając fragmenty, które już znamy:

C++ wprowadzanie zmiennych

Transkrypt:

> C++ wskaźniki Dane: Iwona Polak iwona.polak@us.edu.pl Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

>??? Co to jest WSKAŹNIK? ++ wskaźniki 2 / 20

>??? Co to jest WSKAŹNIK? To po prostu ADRES pamięci, w której coś jest zapisane. Wskaźnik wskazuje na obiekt, na inną zmienną itd. ++ wskaźniki 2 / 20

>??? Co to jest WSKAŹNIK? To po prostu ADRES pamięci, w której coś jest zapisane. Wskaźnik wskazuje na obiekt, na inną zmienną itd. Jak rozpoznać wskaźnik? ++ wskaźniki 2 / 20

>??? Co to jest WSKAŹNIK? To po prostu ADRES pamięci, w której coś jest zapisane. Wskaźnik wskazuje na obiekt, na inną zmienną itd. Jak rozpoznać wskaźnik? * ++ wskaźniki 2 / 20

>??? Co to jest WSKAŹNIK? To po prostu ADRES pamięci, w której coś jest zapisane. Wskaźnik wskazuje na obiekt, na inną zmienną itd. Jak rozpoznać wskaźnik? * * * * * * * * * * * * * * * * * * * C++ wskaźniki 2 / 20

> Organizacja pamięci operacyjnej C++ wskaźniki 3 / 20

> Deklaracja wskaźnika int *wsk; int* wsk; int * wsk; ++ wskaźniki 4 / 20

> Deklaracja wskaźnika int *wsk; int* wsk; int * wsk; UWAGA! int* a, b; ++ wskaźniki 4 / 20

> Deklaracja wskaźnika int *wsk; int* wsk; int * wsk; UWAGA! int* a, b; // a jest wskaźnikiem, b jest zwykłą zmienną int *a; // równoważne powyższemu int b; ++ wskaźniki 4 / 20

> Deklaracja wskaźnika int *wsk; int* wsk; int * wsk; UWAGA! int* a, b; // a jest wskaźnikiem, b jest zwykłą zmienną int *a; // równoważne powyższemu int b; A gdy chcemy dwa wskaźniki w jednej deklaracji: int *a, *b; Ważne! Każdy wskaźnik na coś wskazuje! Nawet jeśli nic nie zostało mu przypisane! C++ wskaźniki 4 / 20

> Użycie Wskaźnik musi mieć podany typ, na jaki wskazuje. ++ wskaźniki 5 / 20

> Użycie Wskaźnik musi mieć podany typ, na jaki wskazuje. 1. deklaracja zmiennej całkowitoliczbowej ++ wskaźniki 5 / 20

> Użycie Wskaźnik musi mieć podany typ, na jaki wskazuje. 1. deklaracja zmiennej całkowitoliczbowej 2. deklaracja wskaźnika na int ++ wskaźniki 5 / 20

> Użycie Wskaźnik musi mieć podany typ, na jaki wskazuje. 1. deklaracja zmiennej całkowitoliczbowej 2. deklaracja wskaźnika na int 4. przypisanie do wskaźnika adresu zmiennej & ++ wskaźniki 5 / 20

> Użycie Wskaźnik musi mieć podany typ, na jaki wskazuje. 1. deklaracja zmiennej całkowitoliczbowej 2. deklaracja wskaźnika na int 4. przypisanie do wskaźnika adresu zmiennej & 5. wyłuskanie wartości, na którą wskazuje wskaźnik ++ wskaźniki 5 / 20

> Zrób to sam int jakasliczba = 10; int *jakiswskaznik; jakiswskaznik = &jakasliczba; cout << Adres zmiennej: << jakiswskaznik << endl; cout << Adres zmiennej: << &jakasliczba << endl; cout << Wartosc: << *jakiswskaznik << endl; cout << Wartosc: << jakasliczba << endl; C++ wskaźniki 6 / 20

> Cztery domeny zastosowania wskaźników Wskaźniki stosuje się w sytuacjach, gdy chodzi nam o: 1. ulepszenie pracy z tablicami, 2. funkcje mogące zmieniać wartość przysyłanych do nich argumentów, 3. dostęp do specjalnych komórek pamięci, 4. rezerwację obszarów pamięci. C++ wskaźniki 7 / 20

> Wskaźniki jako argumenty funkcji void funkcja(int *wskaznik) { *wskaznik = 50; // lub jakaś inna operacja } int main() {... int zmienna = 0; cout << zmienna; // 0 funkcja ( &zmienna ); cout << zmienna; // 50... } ++ wskaźniki 8 / 20

> Rodzaje wskaźników Typ wskaźnikowy Nazwa Dostęp Zmiana do pamięci adresu 1 typ* zwykły wskaźnik odczyt i zapis 2 const typ* zwykły wskaźnik tylko odczyt na stałą 3 typ* const stały wskaźnik odczyt i zapis 4 const typ* const stały wskaźnik tylko odczyt na stałą C++ wskaźniki 9 / 20

> Rodzaje wskaźników Typ wskaźnikowy Nazwa Dostęp Zmiana do pamięci adresu 1 typ* zwykły wskaźnik odczyt i zapis const typ* zwykły wskaźnik tylko odczyt na stałą 3 typ* const stały wskaźnik odczyt i zapis 4 const typ* const stały wskaźnik tylko odczyt na stałą C++ wskaźniki 9 / 20

> Rodzaje wskaźników Typ wskaźnikowy Nazwa Dostęp Zmiana do pamięci adresu 1 typ* zwykły wskaźnik odczyt i zapis 2 const typ* zwykły wskaźnik tylko odczyt na stałą typ* const stały wskaźnik odczyt i zapis 4 const typ* const stały wskaźnik tylko odczyt na stałą C++ wskaźniki 9 / 20

> Rodzaje wskaźników Typ wskaźnikowy Nazwa Dostęp Zmiana do pamięci adresu 1 typ* zwykły wskaźnik odczyt i zapis 2 const typ* zwykły wskaźnik tylko odczyt na stałą 3 typ* const stały wskaźnik odczyt i zapis const typ* const stały wskaźnik tylko odczyt na stałą C++ wskaźniki 9 / 20

> Ćwiczenia 1. Zadeklaruj wskaźnik na typ całkowity. Spróbuj go przypisać tak, aby wskazywał na typ double. 2. Zadeklaruj poprawny wskaźnik. Sprawdź, czy wyłuskuje wskazywaną wartość. Sprawdź, jakie operatory działają na wskaźnikach (dodaj wskaźniki, odejmij, dodaj/odejmij stałą wartość liczbową, pomnóż, itp.) C++ wskaźniki 10 / 20

> Wskaźnik uniwersalny Czy istnieje wskaźnik uniwersalny (na dowolny typ)? ++ wskaźniki 11 / 20

> Wskaźnik uniwersalny Czy istnieje wskaźnik uniwersalny (na dowolny typ)? TAK. ++ wskaźniki 11 / 20

> Wskaźnik uniwersalny Czy istnieje wskaźnik uniwersalny (na dowolny typ)? TAK. * Deklaracja: void *nazwa; * W deklaracji takiego wskaźnika nie podajemy typu, na jaki będzie on wskazywał. Pozwala nam to przypisać obiekt każdego typu. * Niemożliwe jest wówczas wykorzystanie operatorów wyłuskania * oraz -> bez odwoływania się do rzutowania, bo kompilator nie wie nic o typie wartości przechowywanej pod adresem wskazywanym przez wskaźnik uniwersalny. 3. C++ 4. C Programista jest odpowiedzialny za kontrolę typów! C++ wskaźniki 11 / 20

> Operacje na wskaźnikach Legalnymi operacjami arytmetycznymi na wskaźnikach są: 1. dodawanie i odejmowanie od nich liczb naturalnych daje to przesuwanie wskaźników, 2. odejmowanie dwóch wskaźników (pokazujących na tę samą tablicę), 3. porównywanie dwóch wskaźników (pokazujących na tę samą tablicę) ==!= < > <= >= 4. każdy wskaźnik można porównać z adresem 0/NULL wsk == 0; // lub: wsk == NULL; ++ wskaźniki 12 / 20

> Wskaźniki a struktury * Przy strukturach operator wyłuskania -> działa podobnie jak operator wyłuskania *, natomiast jest po prostu wygodniejszy i szybszy. * Po co więc nawiasy w linii 7? Nie lepiej *wsk.dzien = 5? * Operator -> pozwala również wywołać metodę w strukturze: int x = wsk->getdzien(); //równoważne (*wsk).getdzien(); ++ wskaźniki 13 / 20

> Wskaźniki a funkcje Nazwa funkcji jest jednocześnie jej ADRESEM. * Wskaźnik na funkcję różni się od zwykłego wskaźnika budową i faktem, że adres wskaźnika oznacza miejsce w pamięci, w którym rozpoczyna się kod funkcji. * Wskaźnik taki deklaruje się następująco: <typ> (*nazwa)( <parametry_funkcji> ); * Nie ma uniwersalnego wskaźnika na funkcję! 3. lub: int (*f)(int,int) = add; C++ wskaźniki 14 / 20

> Wskaźniki a tablice Nazwa tablicy jest jednocześnie ADRESEM jej zerowego elementu. tabint oraz &tabint[0] są sobie równoważne W C++ można stosować arytmetykę wskaźników (do wskaźnika dodawać i odejmować liczby całkowite). Kompilator sam pomnoży dodawaną liczbę przez rozmiar typu wskaźnika, aby dodać do adresu odpowiednią liczbę bajtów. C++ wskaźniki 15 / 20

> Nazwa tablicy a wskaźnik na jej początek C++ wskaźniki 16 / 20

> Wskaźnik to nie tablica! C++ wskaźniki 17 / 20

> Ćwiczenia 1. Korzystając z arytmetyki wskaźników napisać program wypełniający kwadratową tablicę kolejnymi liczbami naturalnymi po spirali, przykładowo dla wymiaru 5 winniśmy uzyskać: 2. Opracować funkcje, które obliczają sumę dwóch liczb rzeczywistych x i y typu double. Prototypy funkcji mają następującą postać: 2..1 double sum1 (double x, double y); // suma zwracana przez wartość funkcji 2..2 void sum2(double x, double y, double * z); // suma zwracana przez wskaźnik 2..3 void sum3(double x, double y, double& z); // suma zwracana przez referencję C++ wskaźniki 18 / 20

> Ćwiczenie int a[4]; for(int i = 0; i < 4; i++) a[i] = i*10; cout << 3[a] << endl; Czy to się skompiluje? C++ wskaźniki 19 / 20

> Ćwiczenie int a[4]; for(int i = 0; i < 4; i++) a[i] = i*10; cout << 3[a] << endl; Czy to się skompiluje? Dlaczego? C++ wskaźniki 19 / 20

> Ćwiczenie int a[4]; for(int i = 0; i < 4; i++) a[i] = i*10; cout << 3[a] << endl; Czy to się skompiluje? Dlaczego? Co zostanie wyświetlone? C++ wskaźniki 19 / 20

> Ćwiczenie int a[4]; for(int i = 0; i < 4; i++) a[i] = i*10; cout << 3[a] << endl; Czy to się skompiluje? Dlaczego? Co zostanie wyświetlone? Dlaczego? C++ wskaźniki 19 / 20

> Zadanie domowe 1. Poczytaj o listach jednokierunkowych, dwukierunkowych, cyklicznych, itp. 2. Jak deklarujemy i jak je używamy w C++? 3. Zaimplementuj użycie listy jednokierunkowej liczb całkowitych wraz z operacjami: 3..1 Dodawania do listy, 3..2 Usuwania elementu (o danej wartości), 3..3 Wyszukiwania, czy dany element znajduje się w liście, 3..4 Zliczania liczby elementów. ++ wskaźniki 20 / 20