Darmowe Forum
Kwiecień 08, 2025, 07:35:29 *
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 9601 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

articz moikrewni mylittlepony polski-serwer-rpg blackmoon