Bartaz Temat założony przez niniejszego użytkownika |
C++ Wskaźniki » 2009-12-25 23:29:07 Witam,mam taki problem kompletnie nie mogę zrozumieć wskaźników ,wiem nie śmiejcie się ,i tu pytanie czy aby kontynuować dalszą naukę c++ muszę je zrozumieć? Czy są one konieczne do pisania programów a jaśniej czy może ktoś podać przykład ich użycia,tak żeby pokazać po co one właściwie są i gdzie się przydają? |
|
wojos |
» 2009-12-25 23:53:52 Powiem Ci jak to było ze mną - ani trochę nie rozumiałem wskaźników (a właściwie po co są) i miałem małe problemy z kontynuacją nauki - zrobiłem sobie przerwę jednak problem rozwiązałem kontynuując ją a konkretnie przy przeczytaniu pewnego zobrazowania działania programu, pamięci i częściowo procesora. I sądzę, że u Ciebie problem jest ten sam - nie rozumiesz po co one są. Co Ci mogę powiedzieć to po pierwsze to, że jeżeli nie rozumiesz wcześniejszych rzeczy to tego nie zrozumiesz raczej na pewno, lecz jeżeli rozumiesz to spróbowałbym na Twoim miejscu zmierzyć się z tematem dynamicznego przydzielania pamięci. A praktycznie - wskaźnik to jest zmienna przechowująca adres "czegoś" w pamięci (czegoś czyli np. zmiennej, potem dowiesz się także o klasach i innych rzeczach albo nawet i funkcjach). Później nauczysz się, że nie tylko możesz wskaźnikowi przypisywać adres zmiennej już istniejącej ale nawet rezerwować miejsce dla zmiennej jeszcze nieistniejącej i otrzymanie adresu do tego miejsca żeby mieć nad tą zmienną kontrolę. Dam może głupi przykład ale w miare obrazowy tak mi się wydaje :). Załóżmy, że świat (system operacyjny) po poproszeniu przydzielił miejsce dla mnie (czyli zmiennej) i dał Tobie numer telefonu (adres pamięci) który zapiszesz sobie w swojej książce telefonicznej (wskaźnik) byś mógł mieć ze mną kontakt (np. otrzymać ode mnie moją wartość). I w ten sposób możesz nie znać mej nazwy (zwykła zmienna ma nazwę prawda? :) ) a wpływać na mnie (zmieniać wartość czy ją otrzymywać) dzięki temu, że wiesz gdzie znajduję się w pamięci mimo że nie znasz mojej nazwy. Ewentualnie możesz jeszcze poszukać (bo nie wiem czy tu jest) gdzieś w internecie objaśnienia czym jest w pamięci stos i sterta bo to też się tego tyczy. A tu może rzucę kilka przykładów w kodzie: #include <iostream> #include <conio.h>
using namespace std;
int main() { int abc = 5; cout << "abc = " << abc << endl; int * pABC = 0; pABC = & abc; * pABC = 10; cout << "abc = " << abc << endl; getch(); }
A tu z przydzieleniem miejsca w pamięci i zapisaniu adresu we wskaźniku:
#include <iostream> #include <conio.h>
using namespace std;
int main() { int * pWskaznik = 0; pWskaznik = new int; * pWskaznik = 10; cout << "Zmienna pod adresem " << pWskaznik << " ma wartosc " << * pWskaznik << endl; getch(); }
P.S. Sorry za kilka editów ale ja już tak mam, że nie potrafię napisać czegoś raz a porządnie po polsku :D (W C++ może być jeszcze gorzej :P:P) |
|
chesterr |
» 2009-12-25 23:56:49 "Zapytano kiedys Amerykanow: Czy mozna zyc bez Coca-coli? Amerykanie odpowiedzli mozna ale po co ?. Dokladnie to samo mozna powiedziec o wskaznikach"
Jerzy Grebosz "Symfonia" ;p w tej samej ksiazce poswiecone jest im ponad 100 stron!
Dobrze jest sobie wyobrazic ze wskaznik to poprostu... wskaznik chocby taki jakim pokazujemy cos na mapie. Nawet rzucony byle gdzie zawsze na cos wskazuje. We skaznikach trzymamy adresy komorek ktore nas interesuja. Tu w pamieci mamy to a tu tamto. "Tu" to wlasnie wskaznik.
int *w; // definicja wskaznika, teraz wskazuje on nam na jakies miejsce w pamieci. int zmienna = 3;
w = &zmienna // ustawienie wskaznika tak, by pokazywal na obiekt zmienna
Ogolnie wskazniki ulatwiaja zycie, ale jesli ich nie rozumiesz nic sie nie dzieje. Wszystko przyjdzie z czasem :) |
|
Bartaz Temat założony przez niniejszego użytkownika |
... » 2009-12-26 00:07:40 Chesterr posiadam właśnie tą książkę i właśnie dotarłem do tego rozdziału i coś mi nie idze.Mam nadzieje ,ze je zrozumie bo czytałem że bardzo pomagają. Mam jeszcze jedno pytanie jaką wiedzę muszę posiadać żeby zacząć się uczyć takich bibliotek jak allegro,SDL itp. |
|
DejaVu |
» 2009-12-26 00:59:16 Wyobraź sobie pamięć komputera jako jeden długi pasek, który numerujesz od zera. Wszystkie dane muszą znajdować się w pamięci. Tworząc zmienną int abc; masz już bezpośredni dostęp do danych. Dzięki znakowi & możesz sprawdzić gdzie dokładnie na tym pasku została umieszczona zmienna abc. Zapis int* wskaznik; oznacza, że w zmiennej będzie przechowywany wskaźnik, czyli miejsce od którego zaczynają się jakieś dane. Innymi słowy jeśli teraz napiszemy: wkaznik = &abc; to w zmiennej wskaznik będziemy mieli adres fragmentu pamięci pod którym znajduje się wartość zmiennej abc. /edit: Każda zmienna ma oczywiście zajmuje inną ilość miejsca. Wskaźnik wskazuje więc na pierwszy bajt zawierający dane. Jeśli będziesz miał milion elementów w tablicy, wskaźnik będzie wskazywał zawsze na pierwszy. Dzięki temu możesz bardzo łatwo dostać się do każdej innej komórki. Przykład: int * tablica = new int[ 10000 ]; int liczba = * tablica; int liczba2 = *( tablica + 100 );
Wczytaj się w każde słowo, zdanie i przeanalizuj to co zostało napisane na spokojnie. Weź kartkę, narysuj sobie oś. Umieść na niej np. jakąś wartość liczbową, która zajmuje 4 kratki. Ponumeruj oś od 0 w górę. Indeks od którego zaczyna się pierwsza kratka z danymi jest nazywana adresem. Wskaźniki przechowują adresy do pamięci. |
|
WunM |
» 2009-12-26 11:03:53 Zanim zadasz pytanie dotyczące tym razem sensu i użycia wskaźników, wyprzedzę cię.
Nie wiem czy chodzisz do szkoły czy nie, czy pamiętasz lekcje geografii czy też nie. Ale będąc na takiej lekcji taki nauczyciel/profesor ma taki długi kij(ek). Po co mu on? [o]Żeby bić uczniów[/o], żeby pokazywać miejsca na mapie. Gdy chce pokazać szczyt Mount Everest to [o]udaje się z uczniami na wycieczkę[/o], bierze wskaźnik (kij(ek)) i pokazuje na mapie. Dzięki temu uczniowie są [o]znudzeni[o], zadowoleni bowiem nauczyciel pokazał im tajemniczą metodę wskaźnika. Wyciągnął długi kij i po chwili był na Mount Everest.
Taki wskaźnik jest naprawdę tajemniczą metodą. Wydaje się zbyt prymitywny by czynić takie cuda. A jednak zajmuje mało miejsca (w porównaniu do Mount Everestu) i po chwili przenosi do celu.
Posługując się takim wskaźnikiem wykonujesz szybciej pewne operacje czyli optymalizujesz kod programu. Wyobraź sobie tablicę wielkości 200 elementów. Szybciej się ją kopiuje (każdy element przenosi do nowego miejsca) czy szybciej będzie gdy użyjesz wskaźnika? (Odpowiedz sobie sam)
Pomimo zalet wskaźnik ma wady oczywiście, ale może kto inny dokończy. |
|
chesterr |
» 2009-12-26 11:23:48 Symfonia jest napisana dosc przystepnym jezykiem. Na pewno rozumiesz wszystko co do tej pory przeczytales ? Funkcje, tablice, operatory ? Cale 200 stron ktore poprzedzaja temat wskaznikow. Jesli nie wroc na poczatek i zacznij od nowa. Wiem, wiem jak to jest ale uwierz ze mam ta ksiazke i modle sie do niej codziennie jestem w I tomie a czytam go juz 3 raz ;d (obecnie jestem w klasach) i wcale sie tego nie wstydze. Mam to gdzies, dla mnie liczy sie zeby to zrozumiec.
Moja rada: Zaczynam od nowa, przerabiam wszystko bardzo dokladnie z cwiczeniami i przedewszystkim przykladami! I teraz najlepsze, jesli zrozumiesz te 200 stron jestes w stanie napisac juz prostego tetrisa w allegro. Klopoty bedziesz miec jedynie na poziomie algorytmow tak jak ja :) |
|
« 1 » |