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: Na standardowym wyjściu powinno pokazać się:
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

//*1
dodaj 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

//*1
dodaj 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

//*1
dodaj 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 Na wyjściu powinno pojawić się:
1
2
6492152
6502544  

Zad. 8. (1 punkt)

W pliku Kod programu Na wyjściu powinno pojawić się:
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.