Programowanie w języku C/C++

Wskaźniki

  • 2010-10-31 18:27
  • 10 komentarzy
  • 14654 odsłony
  • Oceń ten tekst jako pierwszy
Artykuł  został umieszczony na liście Zalążków artykułów. Jeżeli możesz rozbuduj go!


Wskaźniki, to bardzo pomocne narzędzie. Wskaźnikiem moźna pokazywać na obiekty tego samego typu, lub klasy (np. int). Deklaracja takiego wskaźnika wygląda następująco:

int* wsk_do_int;

Jak widzimy, od deklaracji zwykłej zmiennej różni się tylko gwiazdką. A tak wygląda przypisanie adresu zmiennej znakowej a, do wskaźnika znakowego b:

char a;
char* b;
b = &a;

Operator & oznacza adres zmiennej obok niego stojącej (po prawej stronie). Od teraz gdy zmienimy wartość b, zmienimy automatycznie wartość a, i odwrotnie. Oto krótki przykład:

#include <iostream.h>
using namespace std;
 
int main()
{
  int zmienna;
  int* wskaznik;
 
  zmienna = 5;
  cout << "Wartosc zmiennej wynosi " << zmienna << ", a wartości wskaźnika lepiej nie wypisywac";
 
  wskaznik = &zmienna;
  zmienna = 17;
  cout << "\nWartosc zmiennej wynosi " << zmienna << ", a wartość wskaźnika do tej zmiennej " << *wskaznik;
 
  *wskaznik=110;
  cout << "\nWartosc zmiennej wynosi " << zmienna << ", a wartosc wskaźnika do tej zmiennej " << *wskaznik;
}

Po skompilowaniu i uruchomieniu zobaczymy:

Wartosc zmiennej wynosi 5, a wartosci wskaznika lepiej nie wypisywac
Wartosc zmiennej wynosi 17, a wartosc wskaznika do tej zmiennej 17
Wartosc zmiennej wynosi 110, a wartość wskaznika do tej zmiennej 110



1. Do wartości wskaźnika odnosimy się poprzedzając go gwiazdką
2. Do adresu wskaźnika odnosimy się samą nazwą (bez gwiazdki)
2. Jeżeli nie przypiszemy wskaźnikowi żadnego adresu, lub adres NULL (czyli zerowy), to nie powinniśmy się nim posługiwać, gdyż może się to skończyć błędem, którego nie zasygnalizuje nam kompilator.

Zobacz także:

10 komentarzy

adrian.widzew 2013-07-12 19:36

Napisałem taki kod z którego wynika, że jeżeli chodzi o podstawianie zmiennej pod wskaźnik, to wskaźnik wymaga dwukrotnie większej ilości zasobów pamięci niż sama zmienna:
int main(){
int zmienna=22;
int *wskaznik;
wskaznik=&zmienna;
cout<<"wskaznik: "<<sizeof(wskaznik)<<endl;
cout<<"zmienna: "<<sizeof(zmienna)<<endl;
cout<<"Pod adresem "<<zmienna<<" jest "<<*wskaznik;
    getch();
    return 0;
}
Czy jest więc sens używania wskaźników?

adrian.widzew 2013-07-11 21:46

Witam. Czy zamiast wskaźników można używać referencji? Nie rozumiem w ogóle wskaźników.

rewertyn 2011-09-20 16:25

Wskaźniki wielowymiarowe gotowy program:

http://www.image-share.com/upload/937/255.png

http://www.image-share.com/upload/940/95.png


double tablica[4][3]={0};  //nasz wskażnik

równoważne:

(**tablica+2)

  • (*tablica+2)
&*(*tablica+2)
    • (tablica+2)
&**(tablica+2)
      • (&tablica+2)
&***(&tablica+2)



cout<<"sizeof((tablica+0))="<<sizeof((tablica+0))<<endl;///wynik wielkosc double czyli 8
cout<<"sizeof(*(*tablica+0))="<<sizeof(*(*tablica+0))<<endl;///wynik wielkosc double czyli 8
cout<<"sizeof(&*(*tablica+0))="<<sizeof(&*(*tablica+0))<<endl;
cout<<"sizeof((tablica+0))="<<sizeof((tablica+0))<<endl;///wynik wielkosc double czyli 8
cout<<"sizeof(&(tablica+0))="<<sizeof(&(tablica+0))<<endl;
cout<<"sizeof(*(&tablica+0))="<<sizeof(*(&tablica+0))<<endl;///wynik wielkosc double czyli 8
cout<<"sizeof(&*(&tablica+0))="<<sizeof(&*(&tablica+0))<<endl;

MANJAK 2011-05-04 13:37

Właśnie, do czego to się przydaje? OK, dwie zmienne są jakby powiązane... Może da się zrobić tak, że zmienna X = 4, a jej wskaźnik Y += 1? Nie kumam tego. Może to ktoś wyjaśnić?

piternet 2010-09-12 18:32

Do czego to się przydaje?

crayze 2009-04-04 19:42

pozycja gwiazdki jest dowolna, jeśli to kogoś podnieca może pisać nawet pośrodku

ja piszę gwiazdę przy typie, bo uważam, że tak jest czytelniej, niektórzy piszą przy nazwie bo uważają inaczej, każdy robi jak chce, żadne z tych podejść nie jest błędem
fakt, faktem, że przy deklaracji z przecinkami dla każdej nazwy trzeba pisać osobną gwiazdkę,

w ogóle to wskaźniki jak tylko powinno zastępować się referencjami (będzie to czytelniejsze), chyba, że nie można, bo wskaźnik służy nam do przechowywania adresu zaalokowanego bufora

adam.chyla 2009-04-02 23:21

Po przecinku gwiazdka traci swoją ważność, a spacja przed * wygląda lepiej - oznacza to samo

int *wsk, zmienna...;
równa się:
int *wsk;
int zmienna...;

mortywd 2009-04-02 17:40

"int* wsk_do_int;": W dość starej książce Lippmana jest uwaga, że lepiej posać tak:
int *wsk_do_int
(spacja przed, a nie po gwiazdce).
Umożliwia to np. deklarowanie wskaźników i zwykłych zmiennych w jednej linijce. Proszę kogoś doświadczonego w C++ (ja właśnie zaczynam czytać wspomnianego Lippmana) o ew. poprawienie i ew. dopisanie co oznacza taka deklaracja:
int* a, b;
czy obie zmienne będa wskaźnikami?
Chyba
int *a, *b;
jest czytelniejsze.

TwaizZ 2008-08-06 22:06

Nie został przypisany adres. Program skompiluje się bez przeszkód, ale może działać nie tak jak trzeba. 2 linijki dalej jest ok.

DzieX 2008-01-18 21:55

Dlaczemu wartości wskaźnika lepiej nie wypisywać? Jakieś porno wyszkoczy? <lol>