do koszyka |
do koszyka |
do koszyka |
do koszyka |
do koszyka |
do koszyka |
do koszyka |
do koszyka |
do koszyka |
KURS JĘZYKA C++ PODSTAWY
00. Informacje ogólne - wstęp 01. Praca z konsolą - początki - cout 02. Zmienne (int, float, double) 03. Konsola cd. - cin 04. Zmienne tekstowe - (char, string) 05. Operatory 06. Instrukcje warunkowe (if - else, switch - case) 07. Pętle (for, while) 08. Instrukcje warunkowe cd. 09. Break, Continue 10. Funkcje 11. Zakresy ważności 12. Tablice zmiennych 13. Mała powtórka :))) 14. Struct - struktury 15. String, Vector - wstęp do STL 16. Wskaźniki, referencje 16a. Wskaźnik do typów prostych 16b. Wskaźnik do funkcji 16c. Operatory new i delete 16d. Referencje 17. Pliki źródłowe i nagłówkowe Zadania powtórzeniowe 18. Class - klasy 19. Konstruktor , destruktor 20. Argumenty domyślne, przeciążanie (przeładowanie) funkcji i operatorów C++ FAQ: 01. Operacje na plikach, odczyt/zapis02. Nie działa mi polecenie gotoxy() co robić ? 03. Jaki podręcznik do nauki C++ ? ostatnia aktualizacja: 29.08.2005 WSKAŹNIKI, REFERENCJE - WSKAŹNIK DO TYPÓW PROSTYCH
1. Wskaźnik do typu prostego.
0 - utworzenie tablicy z danymi typu int, aby było szybciej nie tworzymy pustej tablicy potem wpisując do niej dane tylko od razu podajemy jakie dane mają się w niej znaleźć, zapis [] mówi nam, że nie precyzujemy jasno od razu jaką wielkość będzie miała tablica z danymi jej rozmiar będzie zgodny z ilością danych podanych w nawiasach {?,?,...,?} 1 - tworzymy wskaźnik do danych typu int (p - pointer - wskaźnik , i - int; oczywiście taki zapis nie jest obowiązkowy ale jest on na tyle często stosowany, że warto się z nim zapoznać choćby po to aby łatwiej było nam analizować jakieś programy napisane przez inne osoby) 2 - przypisanie wskaźnikowi wartości, w tym wypadku wskaźnik będzie zawierał adres pierwszego (o numerze 0 pamiętamy, że elementy tablic są numerowane od 0 wzwyż) elementu naszej tablicy z danymi 3 - wyświetlenie pierwszego elementu naszej tablicy oraz wyświetlenie pierwszego elementu na który wskazuje wskaźnik, jak widać po uruchomieniu powyższego programu jest to ten sam element Drobna zmiana w programie. 2 - przypisanie wskaźnikowi wartości, w tym wypadku wskaźnik będzie zawierał adres 6 elementu, czemu akurat 6 element ? bo adres i_Dane + 5 mówi nam, że chodzi o 6 element i_Dane to adres pierwszego elementu (nazwa tablicy jest adresem/wskaźnikiem do jej pierwszego (zerowego) elementu) + 5 informuje, że "przeskakujemy" o 5 elementów dalej w tablicy. Wartu tu wspomnieć o bardzo istotnej rzeczy zapis "+5" omija 5 kolejnych elementów tablicy, nie ważne jakie elementy tablica zawiera typ wskaźnika (int) mówi nam wyraźnie jaką wielkość mają poszczególne elementy. Jeśli pracujemy w 32 bitowym środowisku Windows to typ int zajmuje 4 bajty w pamięci więc w tym wypadku zapis "+5" mówi nam "omiń 5*4 bajtów danych czyli 20", jeśli pracowalibyśmy na tablicy elementów char to ten sam zapis "+5" informowałby "omiń 5*1 bajtów danych czyli 5 bajtów". Skąd mamy wiedzieć ile zajmuje miejsca w pamięci określony typ danych (na różnych systemach te same typy mogą zajmować różną ilość miejsca w pamięci najlepszym przykładem jest tu typ int który np w środowisku dosowym zajmuje 2 bajty a w środowisku Windows 4) łatwo można to określić korzystająć z operatora sizeof (podaj rozmiar) np. cout << sizeof(int); Na ekranie zobaczymy liczbę która jest ilością bajtów jaką w pamięci zajmuje nasz typ danych. Do czego mogą się przydać właśnie omówione wskaźniki do typów prostych? Najczęściej stosowane są przy przekazywaniu parametrów do funkcji. Przypomnijmy sobie lekcję o funkcjach i możliwość przesyłania parametrów do funkcji. int i_MojaDana=5; int f_MojaFunkcja(i_MojaDana) { //... } powyższa funkcja przyjmuje jako parametr jedną zmienną typu int, jak jest to realizowane? Otóż w momencie wywołania (uruchomienia) funkcji tworzona jest kopia zmiennej i_MojaDana i to ona jest przekazywana do funkcji, oryginalna zmienna pozostaje bez zmian, co by było w przypadku gdy do funkcji chcielibyśmy przekazać np tablicę 10000 elementów typu int? Tragedia przy każdym wywoływaniu takiej funkcji tworzona by była nowa tablica o takim rozmiarze , następnie kopiowane byłyby do niej dane z oryginalnej tablicy , potem wykonywała by się funkcja, po jej zakończeniu, utworzona kopia tablicy byłaby niszczona. Aby uniknąć tak niegospodarnego zarządzania zasobami oraz oby przyspieszyć działanie programu (tworzenie tablicy jej wypełnianie i następnie zwalnianie jest procesem dosyć czasochłonnym) stosujemy wskaźniki i referencje przy przekazywaniu tablic do funkcji. Po uruchomieniu powyższego przykładu widzimy, że wyświetlona zostaje prawidłowa (oczekiwana przez nas) wartość. Oczywiście w wywoływanych funkcjach możemy także modyfikować zawartość "przesłanych" tablic. Jak widać przed uruchomieniem funkcji MojaFunkcja(i_Dane); wyświetlona została liczba 14 natomiast po jej wykonaniu liczba 99 funkcja zmieniła zawartość oryginalnej tablicy. Do czego może nam się to przydać, no cóż jak już zapewne zauważyliście każda funkcja może zwrócić jako rezultat swojego działania tylko jedną daną np. int w wielu przypadkach jest to wystarczające, ale czasem przydało by się aby funkcja zwracała większą ilość danych jako wynik swojego działąnia, do tego włąśnie w tym przypadku można wykorzystać tablice i wskaźniki + operacje na nich :). |
|