Darmowe Forum
Grudzieñ 21, 2024, 16:39:00 *
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: Argumenty przekazywane przez referencje  (Przeczytany 2637 razy)
admin
Administrator
Ekspert
*****
Wiadomo¶ci: 821


Email
« : Styczeñ 02, 2013, 12:10:12 »

Wska¼niki *
Dotychczas, we wszystkich funkcjach które przedstawia³em, argumenty by³y przekazywanych do funkcji przez warto¶æ. Oznacza to, ¿e wywo³anie funkcji z parametrami, powodowa³o,¿e do funkcji przekazywane by³y by³y kopie warto¶ci zmiennych ale nie orygina³y. Oznacza to, ¿e warto¶æ pocz±tkowa zmiennej przekazanej do funkcji nie by³a modyfikowana przez ta funkcjê.

Wska¼niki s± odpowiednikiem adresu pamiêci w której umieszczono warto¶æ zmiennej. Stanowi± uzupe³nienie klasycznych zmiennych. Wska¼niki deklarowane s± podobnie jak inne zmienne, przed jej u¿yciem. Jedyn± ró¿nic± jest wpisanie gwiazdki przed nazw± zmiennej wska¼nikowej. Istotn± ró¿nica w porównaniu do deklaracji zmiennych jest to,¿e odwo³anie nastêpuje do wskazania adresu (wskazania!!!!).

Przyk³ad 1 -deklaracja zmiennej wska¼nikowej

using namespace std;
main()
{int *i, *a,b;
char *ab_adr;
system("pause");}

W programie zadeklarowano zmienne wska¼nikowe: i, a, ab_adr. Bardzo wa¿nym jest umiejêtno¶æ stwierdzenia jaka warto¶æ znajduje pod zmienn± wska¼nikow± (adresem wskazywanym przez wska¼nik). Nale¿y pamiêtaæ,¿e zmienna *a przedstawia warto¶æ która znajduje siê pod adresem a (a- to inna nazwa adresu).

Przyk³ad 2 - odczytywanie warto¶ci ukrytej pod adresem przekazywanym przez wska¼nik.

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
   int *i,*a,b;
   
   *i=1000;
   cout<<" w pamiêci komputera pod adresem: "<<i<<endl;
   cout<<"znajduje siê warto¶æ: "<<*i<<endl;
                   
    system("PAUSE");
    return EXIT_SUCCESS;
}

Program kompiluje poprawnie jednak jego wywo³anie powoduje b³±d (WIN Vista). Dlaczego? Program napisany powy¿ej zapisuje w pamiêci pod przypadkowym adresem warto¶æ 1000. Problem polega na braku ustalonego miejsca w pamiêci w którym ma byæ zapisana liczba 1000. Miejsce to jest przypadkowe, je¿eli trafi na komórkê w którym jest umieszczona np. warto¶æ opisuj±ca rozdzielczo¶æ ekranu to zostanie ona zmieniona na inn±, co spowoduje zak³ócenia w pracy komputera. Na szczê¶cie systemy operacyjne chroni± istotne obszary pamiêci operacyjnej.



« Ostatnia zmiana: Styczeñ 02, 2013, 12:11:55 wys³ane przez admin » Zapisane
admin
Administrator
Ekspert
*****
Wiadomo¶ci: 821


Email
« Odpowiedz #1 : Styczeñ 02, 2013, 12:11:30 »

Aby unikn±æ nieprzyjemnych sytuacji w przypadku zajêcia pamiêci przez zmienn±, konieczne jest poinformowanie kompilatora o wyszukaniu pierwszego wolnego adresu w pamiêci operacyjnej. Takim poleceniem jet polecenie new. Polecenie new powoduje przeniesienie warto¶ci wska¼niki pod najbli¿szy wolny adres pamiêci. Zbyt du¿a liczba zadeklarowanych zmiennych wska¼nikowych powoduje zajêcie pamiêci. Samoczynnie niestety nie mo¿e byæ ona zwolniona wobec tego konieczne jest jej zwolnienie przez polecenie zwolnienia pamiêci o czym w dalszej czê¶ci.
Przyk³ad poprawnie dzia³aj±cego programu który wpisuje do wolnej pamiêci liczbê 1000.
Przyk³ad 3.
#include <cstdlib>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{int *i=new int,*a=new int,b;
   *i=1000;
   cout<<" w pamiêci komputera pod adresem: "<<i<<endl;
   cout<<"znajduje siê warto¶æ: "<<*i<<endl;               
    system("PAUSE");
    return EXIT_SUCCESS;
}

-------------------------------------------------------------------------------------

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{ int *a= new int ;
int *b=new int;
int *c=new int;
int *d= new int;
int b;
*a=5;*b=2000;*c=3000; *d=4000;
cout<<endl<<"zmienna "<<*b<<" znajduje sie pod adr:"<<b<<endl;
 cout<<endl<<"zmienna "<<*c<<" znajduje sie pod adr:"<<c<<endl;
cout<<endl<<"zmienna "<<*d<<" znajduje sie pod adr:"<<d<<endl;

cout<<*a<<"   "<<a<<endl;
cout<<*a<<"   "<<a<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}
« Ostatnia zmiana: Styczeñ 09, 2013, 10:13:39 wys³ane przez admin » Zapisane
admin
Administrator
Ekspert
*****
Wiadomo¶ci: 821


Email
« Odpowiedz #2 : Styczeñ 02, 2013, 12:13:02 »

Zwolnienie zajmowanej pamiêci operacyjnej - polecenie delete

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

int main(int argc, char *argv[])
{int *i=new int,*a=new int,b;
   *i=1000;
   cout<<" w pamiêci komputera pod adresem: "<<i<<endl;
   cout<<"znajduje siê warto¶æ: "<<*i<<endl;               
    delete[]i;
    delete a;
    system("PAUSE");
    return EXIT_SUCCESS;
}
Zapisane
admin
Administrator
Ekspert
*****
Wiadomo¶ci: 821


Email
« Odpowiedz #3 : Styczeñ 02, 2013, 12:14:07 »

Dynamiczna deklaracja tablicy



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

int main(int argc, char *argv[])
{int *i,*a=new int,z;
   i=new int[10];
   for(z=0;z<10;z++){i[z]=z;}
   
   for(z=0;z<10;z++){
   cout<<" w pamiêci komputera pod adresem: "<<i[z]<<endl;}         
    delete[]i;
    delete a;
    system("PAUSE");
    return EXIT_SUCCESS;
}
Zapisane
admin
Administrator
Ekspert
*****
Wiadomo¶ci: 821


Email
« Odpowiedz #4 : Styczeñ 02, 2013, 12:15:19 »

Operator adresowy & - Je¿eli chcemy znale¼æ pod jakim adresem przechowywana jest zmienna z to wystarczy wprowadziæ operator adresowy &.
Przyk³ad 5
#include <cstdlib>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{int *i,*a=new int,z;
   i=new int[10];
   for(z=0;z<10;z++){i[z]=z;}
   
   for(z=0;z<10;z++){
   cout<<" w pamiêci komputera pod adresem: "<<i[z]<<endl;
   cout<<"zmienna z znajduje siê pod adresem: "<<&z<<endl;}         
    delete[]i;
    delete a;
    system("PAUSE");
    return EXIT_SUCCESS;
}
« Ostatnia zmiana: Styczeñ 02, 2013, 12:38:41 wys³ane przez admin » 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

blackmoon zlotasiodemka proskills spw moikrewni