Darmowe Forum
Maj 02, 2024, 11:20: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 2419 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

garage zupronum amazonsolidarnosc cybersteam santera