Darmowe Forum

C+++ => A Kuba powiedział => Wątek zaczęty przez: admin Styczeń 02, 2013, 12:10:12



Tytuł: Argumenty przekazywane przez referencje
Wiadomość wysłana przez: admin 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.





Tytuł: Odp: Argumenty przekazywane przez referencje
Wiadomość wysłana przez: admin 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;
}


Tytuł: Odp: Argumenty przekazywane przez referencje
Wiadomość wysłana przez: admin 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;
}


Tytuł: Odp: Argumenty przekazywane przez referencje
Wiadomość wysłana przez: admin 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;
}


Tytuł: Odp: Argumenty przekazywane przez referencje
Wiadomość wysłana przez: admin 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;
}


Polityka cookies
Darmowe Fora | Darmowe Forum

polskiegpsts tdw gangnh wataha-mgly gry