Darmowe Forum
Marzec 28, 2024, 16:07:53 *
Witamy, Gość. Zaloguj się lub zarejestruj.
Czy dotarł do Ciebie email aktywacyjny?

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności: Forum zostało uruchomione!
 
   Strona główna   Pomoc Zaloguj się Rejestracja  
Strony: [1]
  Drukuj  
Autor Wątek: Wskaźnik i referencje  (Przeczytany 8573 razy)
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« : Grudzień 14, 2011, 10:45:57 »

Wskaźniki są odpowiednikami adresu w pamięci w której umieszczona jest wartość. Stanowią uzupełnienie do klasycznych zmiennych. Wskaźniki deklarowane są podobnie jak inne zmienne, przed ich użyciem. Jedyną różnicą jest wpisanie gwiazdki przed nazwą zmiennej wskaźnikowej. Istotną różnicą w porównaniu do deklaracji zmiennych jest to, że odwołanie następuje nie do nazwy zmiennej a do wskazania adresu w którym wartość ma być umieszczona. Oczywiście typ tej wartości musi zostać wcześniej zadeklarowany.

#include <cstdlib>
#include <iostream>
#include<string>
using namespace std;

int main(int argc, char *argv[])
{int *i, *a,b;
string *ab_adr;
    system("PAUSE");
    return EXIT_SUCCESS;
}


W programie zadeklarowano zmienne wskaźnikowe: i, a, ab_adr. Dobrym zwyczajem jest wpisywanie do nazwy zmiennej wskaźnikowej słowa _adr  (np. *a_adr) pozwala to na łatwiejsze rozróżnianie zmiennych wskaźnikowych od zmiennych parametrycznych (zwykłych).
Bardzo ważnym jest umiejętność stwierdzenia jaka wartość znajduje się pod zmienną wskaźnikową (adresem wskazywanym przez wskaźnik). Należy pamiętać ,że zmienna *a przedstawia wartość  umieszczoną pod adresem a. Można to sprawdzić na przykładzie.

#include <cstdlib>
#include <iostream>
#include<string>
using namespace std;

int main(int argc, char *argv[])
{int *i, *a,b;
string *ab_adr;
*i=100;
cout<<"W pamięci komputera pod adresem: "<<i<<endl;
cout<<" przechwowywana jest wartosc: "<<*i<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}

Uwaga program nie działa poprawnie, do zastrzeżonego obszaru pamięci wpisano liczbę
« Ostatnia zmiana: Grudzień 14, 2011, 12:09:16 wysłane przez admin » Zapisane
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« Odpowiedz #1 : Grudzień 14, 2011, 10:48:31 »

Cd. z poprzedniej strony:

Operator *i wyświetla wartość znajdującą się pod adresem i.
Ważne jest wcześniejsze deklarowanie zmiennej wskaźnikowej, brak takiej deklaracji może prowadzić do poważnych błędów w programie.
Program napisany powyżej zapisuje w pamięci pod adresem i wartość 100. Problem polega na braku ustalonego miejsca w pamięci w którym ma być zapisana wartość 100. Miejsce to jest przypadkowe, jeżeli trafi na miejsce w którym np. jest umieszczona wartość opisująca rozdzielczość ekranu to zostanie ona zmieniona na inną, co spowoduje zakłócenia pracy komputera.


Do deklaracji zmiennej wskaźnikowej służy funkcja new.
#include <cstdlib>
#include <iostream>
#include<string>
using namespace std;

int main(int argc, char *argv[])
{int *i=new int, *a=new int[10] ,b;
string *ab_adr=new string;
*i=100;
cout<<"W pamięci komputera pod adresem: "<<i<<endl;
cout<<" przechwowywana jest wartosc: "<<*i<<endl;
   
   
    system("PAUSE");
    return EXIT_SUCCESS;
}

 

Wprowadzenie polecenia new przenosi wartość wskaźnika pod najbliższy wolny adres pamięci, rezerwując dla niej miejsce. Powoduje to również uboczny skutek jakim jest zajęcie pamięci pod zmienne. Może prowadzić to do braku wolnej pamięci operacyjnej. Zwolnienie pamięci jest możliwe przez wprowadzenie polecenia delete lub delete[ ]
.
« Ostatnia zmiana: Grudzień 14, 2011, 10:54:23 wysłane przez admin » Zapisane
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« Odpowiedz #2 : Grudzień 14, 2011, 10:56:22 »

Wprowadzenie polecenia new przenosi wartość wskaźnika pod najbliższy wolny adres pamięci, rezerwując dla niej miejsce. Powoduje to również uboczny skutek jakim jest zajęcie pamięci pod zmienne. Może prowadzić to do braku wolnej pamięci operacyjnej. Zwolnienie pamięci jest możliwe przez wprowadzenie polecenia delete lub delete[ ].

#include <cstdlib>
#include <iostream>
#include<string>
using namespace std;

int main(int argc, char *argv[])
{int *i=new int, *a=new int[10] ,b;
string *ab_adr=new string;
*i=100;
cout<<"W pamięci komputera pod adresem: "<<i<<endl;
cout<<" przechwowywana jest wartosc: "<<*i<<endl;
  delete i;
  delete []a; 
   
    system("PAUSE");
    return EXIT_SUCCESS;
}
Zapisane
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« Odpowiedz #3 : Grudzień 14, 2011, 10:59:58 »

Jeżeli nie deklarujemy zmiennej wskaźnikowej istnieje możliwość uzyskania adresu pod którym jest umieszczona zmienna przez uzyskanie wskaźnika.
 Jeżeli chcemy znaleźć pod jakim adresem przechowywana jest zmienna x to wystarczy wprowadzić operator adresowy& (czyli wpisać &x).
. Odwołanie się do zmiennej bezpośrednio przez adres nosi nazwę referencji.

#include <cstdlib>
#include <iostream>
#include<string>
using namespace std;

int main(int argc, char *argv[])
{int *i=new int, *a=new int[10] ,b;
string *ab_adr=new string;
*i=100;
b=123;
cout<<"W pamięci komputera pod adresem: "<<i<<endl;
cout<<" przechowywana jest wartosc: "<<*i<<endl;
cout<<"Wartośc zmiennej b= "<<b<<"znajduje się pod adresem "<<&b<<endl;
  delete i;
  delete []a; 
   
    system("PAUSE");
    return EXIT_SUCCESS;
}
« Ostatnia zmiana: Marzec 24, 2012, 10:48:55 wysłane przez admin » Zapisane
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« Odpowiedz #4 : Kwiecień 14, 2012, 09:15:00 »

Uwaga:
   
 Jeśli funkcja otrzymuje argument poprzez wartość, to może pracować jedynie na jego lokalnej kopii. Wszelkie zmiany tego argumentu odnoszą się do lokalnej kopii na stosie/pamięci.

    Jeśli funkcja otrzymuje argument poprzez referencję, to w rzeczywistości uzyskuje dostęp do zewnętrznej zmiennej. Wszelkie zmiany tego argumentu wewnątrz funkcji będą również widoczne w zmiennej zewnętrznej.

    Przekazywanie parametrów poprzez referencję przydaje się, gdy funkcja musi zwrócić więcej niż jeden wynik.

Zapisane
Strony: [1]
  Drukuj  
 
Skocz do:  

Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC | Sitemap

Polityka cookies
Darmowe Fora | Darmowe Forum

pokemonissho cesarstwoniemieckie radarodzicowsp289 vardertoworld forum-olimpijczykow