Przekazywanie argumentów wskaźniki

Podobne dokumenty
Wstęp do programowania

#include <iostream> using namespace std; void ela(int); int main( ); { Funkcja 3. return 0; }

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

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

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Język C++ zajęcia nr 2

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

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

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

Część 4 życie programu

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

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:

Techniki Programowania wskaźniki

Wstęp do programowania

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

FUNKCJE WZORCOWE. Wykład 10. Programowanie Obiektowe (język C++) Funkcje wzorcowe wprowadzenie (2) Funkcje wzorcowe wprowadzenie (1)

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

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

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Podstawy Programowania Podstawowa składnia języka C++

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

4. Funkcje. Przykłady

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

Materiał. Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Funkcje Wskaźniki Referencje Tablice dynamiczne Typ string Przeładowania funkcji

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

Programowanie - wykład 4

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

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

Przeciążenie (przeładowanie nazw) funkcji

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

Program 14. #include <iostream> #include <ctime> using namespace std;

Programowanie w języku C++

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

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Podstawy Programowania Obiektowego

C++ wprowadzanie zmiennych

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

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

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

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

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

I - Microsoft Visual Studio C++

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Tablice. int rozmiar; cout << Jaki ma być rozmiar tabeli? ; cin >> rozmiar; { int tablica[rozmiar]; /* TU JEST ŹLE */... }

Projektowanie klas c.d. Projektowanie klas przykład

Lab 9 Podstawy Programowania

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

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

Informatyka 2. Wykład nr 3 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

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

Wykład 5: Klasy cz. 3

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

Wstęp do Programowania, laboratorium 02

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

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

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

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

1 Podstawy c++ w pigułce.

Programowanie 2. Język C++. Wykład 3.

Struktury Struktura polami struct struct struct struct

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

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Wstęp do informatyki- wykład 11 Funkcje

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

Laboratorium nr 10. Temat: Funkcje cz.2.

7. Pętle for. Przykłady

Wstęp do informatyki- wykład 9 Funkcje

Wstęp do programowania. Wykład 1

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

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

C++ - [1-3] Debugowanie w Qt Creator

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

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

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

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

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

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

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

IX. Wskaźniki.(3 godz.)

Zadanie 2: Arytmetyka symboli

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

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

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Wstęp do Programowania 2

Obsługa wyjątków. Język C++ WW12

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

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

Programowanie obiektowe w C++ Wykład 12

Transkrypt:

Przekazywanie argumentów wskaźniki klasyczne wywołanie wyliczenie i zwrotne przekazanie tylko jednej wielkości moŝliwość uŝycia zmiennych globalnych niebezpieczeństwa z tym związane wyjście wywołanie funkcji z adresami zmiennych Przykład: // adresy (wskaźniki) jako argumenty funkcji #include <iostream> using namespace std; const double PI=3.1415926; void kula(double r, double *pow, double *obj); main() double r,s,v,*p; p=&v; r=1.0; kula(r, &s, p); cout << "Pole powierzchni = " << s << endl; cout << "Objetosc = " << *p << endl; return 0; void kula(double r, double *pow, double *obj) *pow=4*pi*r*r; *obj=4*pi*r*r*r/3; Pole powierzchni = 12.5664 Objetosc = 4.18879 bardzo częste stosowane gdy przekazujemy tabelę, to przekazujemy adres jej początku

Jak to działa? int a, *wa; cout << "adres a : " << &a << " wartosc a : " << a << endl; cout << "adres wa : " << &wa << " wartosc wa : " << wa <<endl;wa=&a; *wa=1; adres a : 0x22ff74 wartosc a : 2 adres wa : 0x22ff70 wartosc wa : 0x7 1. Definicja zmiennych: int a, *wa; a 0x74 wa 0x70 2. Podstawienie: wa=&a; a 0x74 wa 0x74 0x70 3. Podstawienie: *wa=1; a 1 0x74 wa 0x74 0x70 Poprzez odwołanie pośrednie moŝemy za pomocą wskaźnika zmieniać wartość innych zmiennych (tych, na które pokazuje wskaźnik). To jest kluczowe przy wykorzystaniu wskaźników jako argumentów funkcji. W naszym przykładzie:

1. Definicja zmiennych: double r, s, v, *p; r s v p 0x70 0x68 0x60 0x5c 2. Podstawienie: p=&v; r s v 0x70 0x68 0x60 p 0x60 0x5c 3. Podstawienie: r=1.0; r 1.000000 0x70 s v 0x68 0x60 p 0x60 0x5c 4.Wywołanie funkcji: kula(r,&s,p); kula(r,*pow,*obj); r 1.000000 0x70 r 1.000000 0x30 s 0x68 pow 0x68 0x38 v 0x60 obj 0x60 0x3c p 0x60 0x5c

4.Wyliczenia w funkcji: *pow=4*pi*rr*rr; *obj=4*pi*rr*rr*rr/3; r 1.000000 0x70 r 1.000000 0x30 s 12.566 0x68 pow 0x68 0x38 v 4.1888 0x60 obj 0x60 0x3c p 0x60 0x5c 5. Zakończenie funkcji kula zmienne r, pow, obj są kasowane, ale zawartość komórek pamięci na króre wskazywały pow, obj (czyli komórek s oraz v zmiennych lokalnych main) pozostaje!!! 6.Wydruk zawartości komórek s, v drukuje wyliczone w funkcji kula wartości kluczowy punkt mając adres jakiegoś obiektu (wskaźnik) moŝemy nim manipulować mimo tego, Ŝe punkt manipulacji jest (formalnie rzecz biorąc) poza zakresem waŝności tego obiektu ta metoda pozwala obliczyć i wycofać z funkcji obliczone wartości dowolnej ilości zmiennych poprawny sposób komunikacji pomiędzy funkcjami w C/C++ - patrząc tylko na miejsce wywołania funkcji moŝemy z góry powiedzieć, które argumenty mogą być zmieniane przez operacje wewnątrz funkcji tak, by zmiany te były aktualne po zakończeniu działania funkcji to umoŝliwia/ułatwia analizę programu.

Zmienne referencyjne w C++ moŝna tworzyć zmienne referencyjne do istniejących juŝ zmiennych zmienne takie to aliasy (przezwiska) innych zmiennych zarówno zmienna jak i alias odpowiadają temu samemu miejscu w pamięci int a=5; // definicja i inicjalizacja a int &b=a; // b jest referencją do a, wartosc b=5 int &c; // nielegalna definicja, referencja musi być // zainicjowana b=10; // a=10, b=10 a=20; // a=20, b=20 w C++ referencje uŝywane najczęściej w funkcjach, które zmieniają swoje argumenty (alternatywa dla wskaźników) #include <iostream> using namespace std; void podwoj(int a, int &b) a *= 2; b *= 2; int main() int a=1, b=2; podwoj(a,b); cout << "a=" << a << " b=" << b << endl; a=1 b=4 argument przesłany przez wartość bez zmian; przesłany przez referencję zmodyfikowany powód przez referencję przesyłamy adres argumentu (a nie jego wartość)

o tym, Ŝe jest to wywołanie argumentu przez referencję decyduje kształt definicji funkcji; samo wywołanie wygląda identycznie jak dla przypadku przekazania argumentu przez wartość utrudnienie analizy kodu; niebezpieczeństwo nieumyślnej zmiany argumentu główne zastosowanie przesłanie do funkcji danych duŝych rozmiarów (struktur, klas) Przykład test #include <cstdlib> #include <iostream> using namespace std; double gg(double a, double *c) *c = *c + a; a=15; *c = *c - a; return a-3; int main() double a,b,c; a=2; c=3; b=gg(a,&c); cout << a << " " << b << " " << c << "\n"; system("pause"); return 0; co wypisze powyŝszy program? jak zmieni się odpowiedź, gdy pierwszy argument gg będzie referencją?

Domyślne argumenty funkcji w większości języków funkcje muszą być wywołane z taką ilością argumentów, dla jakiej zostały zdefiniowane C++ dostarcza mechanizmu zmiany tej zasady poprzez domyślne argumenty funkcji argument domyślny taki, który został zainicjowany w deklaracji funkcji o tym, Ŝe argument jest domyślny informujemy kompilator tylko raz (w deklaracji funkcji) Przykład: void ff(int a, int b=2, int c=4); main() ff(1); ff(1,1); ff(1,1,1); // ff(1,2,4) // ff(1,1,4) // ff(1,1,1) void ff(int a, int b, int c) //deklaracja funkcji //definicja funkcji Uwaga: nie da się opuścić argumentu b a podać c: zapis ff(1,,3) błędny!!! ; w C++ nie moŝe wystąpić sytuacja, w której dwa przecinki są obok siebie w trakcie kompilacji kompilator moŝe (w danym zakresie waŝności) napotkać definicję argumentu domniemanego tylko jednokrotnie void f1(int a, int b=2); void f1(int, int=2); // błąd, powtórzenie deklaracji

void f2(int, int=3); // poprawne, wartości void f2(int=2, int); // domniemane: 3,2 void f3(int a=3, int b); // czy to jest void f3(int a, int b=2); // poprawne? Typowe zastosowania: gdy mamy sytuację, w której wartość jednego argumentu często się powtarza. Przykład: funkcja drukująca temperaturę w jednej z trzech skal (Celsjusza, Kelvina i Fahrenheita); najczęściej w skali Celsjusza void temperatura(float stopnie, int skala=0) cout << Temperatura wynosi: cout.setf(ios::fixed); cout.precision(1); // ustala notację liczb rzeczywistych // ustala dokładność switch (skala) case 0: cout << 1.0*stopnie << endl; break; case 1: cout <<stopnie+273.2<<endl; break; case 2: cout << (9*stopnie/5+32.0)<<endl; break; Wywołanie dla skali Celsjusza: //Celsjusz //Kelvin //Fahrenheit temperatura(27.3); //temp(27.3, 0)

Funkcje inline dla krótkich funkcji (o krótkim ciele) efektywniej jest wpisać ciało funkcji w miejsce jej wywołania zamiast ją wywoływać (powód koszt wywołania funkcji, zwłaszcza dla wielokrotnych wywołań) Przykład: int zao(float liczba) return (liczba + 0.5); lepiej zamiast: k=zao(m) + zao(n*13.3); wpisać: k=(int)(m+0.5) + (int)((n*13.3)+0.5); jak to zrobić, by się duŝo nie napracować? o klasyczne C poprzez makrodefinicje: #define zao(a) ((int)((a)+0.5)) o w C++ dodatkowa moŝliwość deklaracja typu funkcji inline inline int zao(float liczba) return (liczba + 0.5); o inline (słowo kluczowe C++) wskazanie dla kompilatora, by dokonywać rozwinięcia (wstawienia) ciała funkcji w miejsce wywołania o istnieje moŝliwość, Ŝe kompilator zignoruje tą deklarację i skompiluje funkcję normalnie (na pewno tak będzie, gdy kompilacja do pracy z debuggerem)

o aby kompilator mógł wstawić ciało funkcji musi mieć całą definicję funkcji (a nie tylko deklarację) przed pierwszym uŝyciem funkcji o funkcje typu inline umieszczamy na samej górze tekstu programu (często w pliku nagłówkowym) o mechanizm inline pomyślany tylko dla małych funkcji (i tylko dla takich powinien być stosowany)