112 ROZDZIAŁ 17. WSKAŹNIKI (czyli np. znaku czy liczby) w pamięci komputera. Dokładniejszą definicję możesz znaleźć w Wikipedii. Operowanie na wskaźnikach By stworzyÄ wskaźnik do zmiennej i móc siÄ nim posÅugiwaÄ należy przypisaÄ mu odpowiedniÄ
wartoÅÄ (adres obiektu, na jaki ma wskazywaÄ). SkÄ
d mamy znaÄ ten adres? Wystarczy zapytaÄ nasz komputer, jaki adres przydzieliÅ zmiennej, którÄ
np. wczeÅniej gdzieÅ stworzyliÅmy. Robi siÄ to za pomocÄ
operatora & (operatora pobrania adresu). Przeanalizuj nastÄpujÄ
cy ko d1: #include int main (void) { int liczba = 80; printf("Zmienna znajduje sie pod adresem: %p, i przechowuje wartosc: %d\n", (void*)&liczba, liczba); return 0; } Program ten wypisuje adres pamiÄci, pod którym znajduje siÄ zmienna oraz wartoÅÄ jakÄ
kryje zmienna przechowywana pod owym adresem. Aby móc zapisaÄ gdzieÅ taki adres należy zadeklarowaÄ zmiennÄ
wskaźnikowÄ
. Robi siÄ to poprzez dodanie * (gwiazdki) po typie na jaki zmienna ma wskazywaÄ, np.: int *wskaznik1; char *wskaznik2; float*wskaznik3; Niektórzy programiÅci mogÄ
nieco bÅÄdnie interpretowaÄ wskaźnik do typu jako nowy typ i uważaÄ, że jeÅli napiszÄ
: int* a,b,c; to otrzymajÄ
trzy wskaźniki do liczby caÅkowitej. Tymczasem wskaźnikiem bÄdzie tylko zmienna a, natomiast b i c bÄdÄ
po prostu liczbami. Powodem jest to, że âgwiazdkaâ odnosi siÄ do zmiennej a nie do typu. W tym przypadku trzy wskaźniki otrzymamy piszÄ
c: int *a,*b,*c; Aby uniknÄ
Ä pomyÅek, lepiej jest pisaÄ gwiazdkÄ tuż przy zmiennej: int *a,b,c; albo jeszcze lepiej nie mieszaÄ deklaracji wskaźników i zmiennych: int *a; int b,c; 1Warto zwróciÄ uwagÄ na rzutowanie do typu wskaźnik na void . Rzutowanie to jest wymagane przez funkcjÄ printf , gdyż ta oczekuje, że argumentem dla formatu %p bÄdzie wÅaÅnie wskaźnik na void , gdy tymczasem w naszym przykÅadzie wyrażenie &liczba jest typu wskaźnik na int .
(…)
… 112
ROZDZIAŁ 17. WSKAŹNIKI
(czyli np. znaku czy liczby) w pamięci komputera. Dokładniejszą definicję możesz
znaleźć w Wikipedii.
Operowanie na wskaźnikach
By stworzyć wskaźnik do zmiennej i móc się nim posługiwać należy przypisać mu
odpowiednią wartość (adres obiektu, na jaki ma wskazywać). Skąd mamy znać ten
adres? Wystarczy zapytać nasz komputer, jaki adres przydzielił zmiennej, którą np.
wcześniej gdzieś stworzyliśmy. Robi się to za pomocą operatora & (operatora pobrania
adresu). Przeanalizuj następujący kod1 :
#include <stdio.h>
int main (void)
{
int liczba = 80;
printf("Zmienna znajduje sie pod adresem: %p, i przechowuje wartosc: %d\n",
(void*)&liczba, liczba);
return 0;
}
Program ten wypisuje adres pamięci, pod którym znajduje się zmienna oraz wartość
jaką kryje zmienna przechowywana pod owym adresem.
Aby móc zapisać gdzieś taki adres należy zadeklarować zmienną wskaźnikową. Robi
się to poprzez dodanie * (gwiazdki) po typie na jaki zmienna ma wskazywać, np.:
int *wskaznik1;
char *wskaznik2;
float*wskaznik3;
Niektórzy programiści mogą nieco błędnie interpretować wskaźnik do typu jako
nowy typ i uważać, że jeśli napiszą:
int* a,b,c;
to otrzymają trzy wskaźniki do liczby całkowitej. Tymczasem wskaźnikiem będzie tylko
zmienna a, natomiast b i c będą po prostu liczbami. Powodem jest to, że ”gwiazdka”
odnosi się do zmiennej a nie do typu. W tym przypadku trzy wskaźniki otrzymamy
pisząc:
int *a,*b,*c;
Aby uniknąć pomyłek, lepiej jest pisać gwiazdkę tuż przy zmiennej:
int *a,b,c;
albo jeszcze lepiej nie mieszać deklaracji wskaźników i zmiennych:
int *a;
int b,c;
1 Warto zwrócić uwagę…
… pod owym adresem.
Aby móc zapisać gdzieś taki adres należy zadeklarować zmienną wskaźnikową. Robi
się to poprzez dodanie * (gwiazdki) po typie na jaki zmienna ma wskazywać, np.:
int *wskaznik1;
char *wskaznik2;
float*wskaznik3;
Niektórzy programiści mogą nieco błędnie interpretować wskaźnik do typu jako
nowy typ i uważać, że jeśli napiszą:
int* a,b,c;
to otrzymają trzy wskaźniki do liczby całkowitej…
... zobacz całą notatkę
Komentarze użytkowników (0)