admin
|
 |
« : 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
|
 |
« 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
|
 |
« 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
|
 |
« 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
|
 |
« 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
|
|
|
|
|