Int int x; int *w; // wskaźnik w



Pobieranie 24.51 Kb.
Data08.05.2016
Rozmiar24.51 Kb.
Program 1 – wskaźnik na zmienną prostą podanego typu, na przykład int

int x;


int *w; // wskaźnik w jest pusty: NULL dopóki nie przypiszę mu adresu jakiejś zmiennej

// lub nie przydzielę mu pamięci słowem new na wartość wskazywaną

// wskaźnikowi w przypiszę teraz adres zmiennej x

x=150;


w=&x; // w wskazuje teraz na x, & jest operatorem pobrania adresu zmiennej

cout<<"x="<

cout<<"pod adresem "<

*w=287454020; // zmieniam wartość umieszczoną pod adresem w

cout<<"pod adresem "<

cout<<"x="<// czy wartość x się zmieniła ?


cout<<"x szesnastkowo "<
// to co zobaczysz w pamięci zależy od tego jakim wskaźnikiem zagladasz do pamięci

// zdefinuj wskaźnik na inny typ, na przykład short, i zajrzyj nim pod ten sam adres pamięci

short *b = (short*)w; // czy można przypisywac wskaźniki ?

cout<<"b wskazuje na wartość "<<*b<<" szesnastkowo "<

b++;


cout<<"b wskazuje na wartość "<
// Typ int zajmuje 4 bajty, typ short zajmuje 2 bajty. Zauważ że wartości są umieszczone

// w systemie little-endian: pierwszy adres typu short wskazuje na młodsze dwa bajty,

// a następny adres na starsze dwa bajty liczby x
// wskaźnikowi w1 przydzielę teraz nowy obszar pamięci,

// taki duży, jaki jest potrzebny dla wartości typu int (czyli 4 bajty)

int *w1 = new int;

*w1=200; // wpiszę do tego obszaru pamięci wartość 200

cout<<"*w1="<<*w1<

delete w1; // zwalniam pamięć wskazywana przez w1, słowa new i delete stanowią parę !

Program 2 – wskaźnik na tablicę liczb



// Tablica statyczna
int T[3] = {15,-3,7}; // tablica statyczna ma stały rozmiar, znany już podczas kompilacji
for (int i=0; i<3 ; i++) cout<// wyświetli wszystkie elementy tablicy T

cout<

cout<<"T="<// nazwa tablicy jest wskaźnikiem do tablicy

cout<<"*T="<<*T<// i wskazuje na pierwszy element


int *w; // czy można przypisywac wskaźniki ?

w=T; // TAK jeśli wskazują na ten sam typ wartości

cout<<"*w="<<*w<// wyświetli pierwszy element tablicy T

// na wskaźniku mozna wykonywać opercje arytmetyczne !

w++; // o ile bajtów zmieni sie adres umieszczony we wskaźniku w ?

cout<<"*w="<<*w<; // o tyle ile zajmuje zmienna wskazywana, tu o 4 bo typ int

// teraz pokaże drugi element tablicy T

w++;


cout<<"*w="<<*w< // a teraz pokaże trzeci element tablicy T
w++; // wskaźnik już wyszedł poza 3-elementową tablicę T,

cout<<"*w="<<*w<// wyświetli śmieci z pamięci


cout<<"\njeszcze raz cala tablica T \n";

w=T; // w ponownie wskazuje na pierwszy element tablicy T

for (int i=0; i<3; i++) {

cout<<*w<<" "; // wyświetl element wskazywany przez w

w++; // przesuń wskaźnik do nastepnego elementu T

}

cout<

// Tablica dynamiczna

int n;


cout<<"Podaj n "; cin>>n;

// dynamiczna tablica, dostępna przez wskaźnik

int *X = new int[n]; // nie musi mieć zdefiniowanego rozmiaru w chwili kompilacji

srand(time(0));

for (int i=0; i

X[i]=rand()%100; // odwołanie do elementu tablicy dynamicznej

cout<<X[i]<<" "; // wygląda tak samo jak dla tablicy statycznej

}

cout< // trzeba zwolnić pamięć po dynamicznej tablicy



delete [] X; // słowa new i delete są ze soba w parze !
Tablica statyczna jest umieszczana w części pamięci zwanej stosem (stack), przydzielanej programowi przez system podczas uruchamiania. W tym obszarze umieszczane są wszyskie 'normalne' zmienne oraz parametry wywołania funkcji. Ten obszar pamięci jest zwykle stosunkowo niewielki i można go łatwo zapchać tablicą o dużej ilości elementów, wóczas system operacyjny zgłosi błąd i program 'wysypie się'.

Tablice dynamiczne umieszczane są w innym obszarze pamięci, zwanej stertą (heap). Sterta może być znacznie większa od stosu, system przydzieli programowi na żądanie tyle pamięci na stercie, ile ma do dyspozycji. Dlatego można tu umieszczać znacznie większe zbiory danych niż w stosie. Tablice dynamiczne mogą być wielokrotnie większe od tablic statycznych.

A jeśli podczas pracy programu okaże się, że elementów jest więcej niż zadeklarowano dla tablicy, to zawsze można zadeklarować nową wiekszą tablicę dynamiczną, przepisać do niej wszystkie elementy ze starej tablicy i wskażnikowi do starej tablicy przypisać adres nowej tablicy.

Zastosowanie tablic dynamicznych straciło wiele na popularności od czasu, gdy biblioteka standardowa STL (Standard Template Library) udostępniła typ vector.

Ćwiczenie

Napisz program który generuje losowo 10 liczb typu całkowitego z przedziału (0;100), umieszcza je w tablicy i wyświetla. Następnie odwraca kolejność elementów tablicy, to znaczy zamienia miejscami odwołując się do elementów poprzez ich wskaźniki (nie przez indeks):



  • pierwszy element z ostatnim,

  • drugi z przedostatnim itd. aż do środka tablicy


©absta.pl 2016
wyślij wiadomość

    Strona główna