Darmowe Forum
Grudzieñ 21, 2024, 15:56:38 *
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 9348 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

polski-serwer-rpg moikrewni zlotasiodemka mylittlepony shaggydogss