Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

C++ Wskaźniki

Ostatnio zmodyfikowano 2009-12-26 11:23
Autor Wiadomość
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ą?
P-12475
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:
C/C++
//Proste zastosowanie wskaźników w kodzie - przypisywanie adresu zmiennej do wskaźnika
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
    int abc = 5; //Nasza zmienna ustawiona na wartość 5
    cout << "abc = " << abc << endl; //wyświetlamy ją dla ukazania jej wartości
    int * pABC = 0; /*nasz wskaźnik któremu przypisujemy od razu wartość 0 ze względów bezpieczeństwa
                        tu może nie do końca potrzebne ale warto nabyć dobry nawyk :)*/
   
    pABC = & abc; /*Przypisujemy naszemu wskaźnikowi adres zmiennej w pamięci
                     o operatorze & poucz się w kursie na tej stronie*/
    * pABC = 10; /*Zmieniamy wartość zmiennej o adresie pABC na 10 przy pomocy
                   operatora wyłuskania ( * )*/
   
    cout << "abc = " << abc << endl; // i wyświetlamy naszą zmienną by przekonać się, że się zmieniła :)
    getch();
   
   
}

A tu z przydzieleniem miejsca w pamięci i zapisaniu adresu we wskaźniku:
C/C++
/*Proste zastosowanie wskaźników w kodzie - przydzielanie pamięci
i przypisywanie adresu przydzielonej pamięci do zmiennej*/
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
    int * pWskaznik = 0; //Tworzymy wskaźnik i zerujemy by nie wskazywał na byle co
    pWskaznik = new int; //Przy pomocy operatora new prosimy o przydzielenie pamięci
    //dla zmiennej typu int i odbieramy adres do wskaznika pWskaznik
    * pWskaznik = 10; //Przypisanie zmiennej pod adresem pWskaznik wartosci 10
    cout << "Zmienna pod adresem " << pWskaznik << " ma wartosc " << * pWskaznik << endl;
    /*I wyswietlamy wartość zmiennej pod adresem pWskaznik by przekonac sie że wartość została przypisana*/
    getch();
    /*Oczywiście normalnie nie będziesz wyświetlał wskaźników - to jest tylko dla pokazania że kod działa jak powinien*/
   
}




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)
P-12477
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 :)
P-12478
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. 
P-12479
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:
C/C++
int * tablica = new int[ 10000 ];
int liczba = * tablica; // to samo można zapisać tak: liczba = tablica[0];
int liczba2 = *( tablica + 100 ); // to samo można zpisać tak: 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.
P-12484
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.
P-12486
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 :)
P-12487
« 1 »
  Strona 1 z 1