Wskaźniki i Referencje.
Język C++ w bardzo łatwy sposób umożliwia nam pobieranie adresu pamięci wybranych zmiennych. Wskaźnik zajmuje zazwyczaj 4 bajty bez względu na jaki typ danych wskazuje. Rozmiar wskaźnika może być jednak różny w zależności od użytego kompilatora (np. gdy użyjemy 64 bitowego kompilatora). Wskaźnik zwraca adres pierwszego bajta danych wybranej zmiennej. Aby pobrać adres dowolnej zmiennej wystarczy napisać: &nazwa_zmiennej.
Zad. 1. (1 punkt)
W pliku Kod programu W miejscach oznaczonych: /* /* dodaj kod, tak aby na standardowym wyjściu zobaczyć adresy odpowiednich zmiennych.Zauważmy, że wskaźnik ze zmiennej tablica i ze zmiennej tablica[0] jest taki sam. Dzieje się tak dlatego, że wskaźnik ze zmiennej tablica wskazuje na początek wszystkich danych w tablicy, a pierwszym elementem jest tablica[0].
Definicja wskaźnika to:
int *w;
We wskaźniku w przechowujemy adres jakiegoś obiektu typu int. Wskaźnik informuje, gdzie wskazywany obiekt się znajduje, a nie co w tamtym obiekcie się znajduje.
Aby nadać wskaźnikowi wartość używamy operatora & .
int *w; int k = 3; w = &k; cout<<(*w);
Zad. 2. (1 punkt)
W pliku Kod programu:- w miejscu //*1 dodaj deklarację wskaźnika o nazwie wsk_liczba do zmiennej typu int
- w miejscu //*2 dodaj przypisanie wskaźnikowi wsk_liczba adresu zmiennej liczba
- w miejscu //*3 dodaj wypisanie wartości zmiennej liczba (NIE UŻYWAJ NAZWY liczba)
- w miejscu //*4 zwiększ wartość zmiennej liczba za pomocą wskaźnika (NIE UŻYWAJ NAZWY liczba)
Zmienna liczba = 9 Zmienna liczba = 9 Liczba = 10
Bezpieczeństwo, a użycie wskaźników.
Podczas używania wskaźników można popełnić błąd przy tworzeniu i używaniu wskaźnika. Jeżeli nie zadbamy o przypisanie wskaźnikowi adresu.
int * wsk_liczba; * wsk_liczba = 373;
Jest to błąd, ponieważ nie wiemy gdzie(pod jakim adresem) umieszczona jest wartość 373. Co jeżeli jednak adres ten będzie już zajęty przez program? Taka sytuacja może spowodować, iż nie będzie można było zapisać nic w miejsce wskazane przez wsk_liczba. Błąd ten jest niedopuszczalny i do tego trudno go wykryć. Pamiętaj, gdy używasz wskaźnika zadbaj o to, by zawsze miał przypisaną zmienną (miał prawidłowy adres).
Arytmetyka wskaźników.
Zad. 3. (1 punkt)
W pliku Kod programu pomiędzy liniami zakomentowanymi://*1 //*1dodaj odpowiedni kod (nie wolno użyć znaków [ ]), tak by program wypisał zawartość tablicy tab.
Natomiast w miejscach oznaczonych /* */ dodaj kod wypisujący wielkość zmiennej tab oraz wskaznik.
Wyjście powinno wyglądać tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Wielkosc zmiennej: tab to 80 Wielkosc zmiennej: wskaznik to 4
Zad. 4. (1 punkt)
W pliku Kod programu pomiędzy liniami zakomentowanymi://*1 //*1dodaj odpowiedni kod (nie wolno użyć znaków [ ]), tak by program wypisał podtablicę:
2 3
Zad. 5. (1 punkt)
W pliku Kod programu pomiędzy liniami zakomentowanymi://*1 //*1dodaj odpowiedni kod (nie wolno użyć znaków [ ]), tak by w tablicy tab czwarty element był zerem.
Na wyjściu powinno pojawić się:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 0 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Zad. 6. (2 punkt)
W pliku Kod programu dodaj funkcję sort() wykonującą sortowanie bąbelkowe tablicy (nie wolno użyć znaków [ ]) Na wyjściu powinno pojawić się:19 3 2 4 9 6 7 8 5 10 11 17 15 14 13 20 12 18 1 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Operatory new i delete
Jeśli mamy zdefiniowany np. wskaźnik
char *wsk;to instrukcja
wsk = new char;powoduje utworzenie nowego obiektu typu char. Nie ma on nazwy, ale jego adres przekazywany jest wskaźnikowi wsk.
Instrukcja
delete wsk;powoduje likwidację tego obiektu.
Zad. 7. (1 punkt)
W pliku Kod programu-
w miejscu zakomentowanym:
//1a //2a
stwórz odpowiednie obiekty -
w miejscu zakomentowanym:
//1b //2b
zlikwiduj odpowiednie obiekty
1 2 6492152 6502544
Zad. 8. (1 punkt)
W pliku Kod programu-
w miejscach zakomentowanych:
//*1
dodaj instrukcje wypełniające tablice liczbami od 1 do 10 (nie wolno użyć znaków [ ]) -
w miejscach zakomentowanych:
//*2
dodaj instrukcje wypisujące tablice (nie wolno użyć znaków [ ]), -
w miejscach zakomentowanych:
//*3
dodaj instrukcje wypisujące tablice (nie wolno użyć znaków [ ]),
1 2 3 4 5 6 7 8 9 10 smieci
Zad. 9. (1 punkt)
Stwórz tablicę dwuwymiarową na pomocą new. Wypełnij ją liczbami i wypisz.