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

Zmienna vs wskaźnik na zmienną

Ostatnio zmodyfikowano 2014-03-25 17:46
Autor Wiadomość
colorgreen19
Temat założony przez niniejszego użytkownika
Zmienna vs wskaźnik na zmienną
» 2014-03-18 16:06:50
Może najpierw nppisze jak ja to rozumiem:
P1
C/C++
//..program
{ // nowy zakres/blok
    int i; //zmienna tworzona w bloku
}
//koniec bloku, tu juz zmienna jest usuwana z pamieci
P2
C/C++
//..program
{ // nowy zakres/blok
    int * i = new int; //nowa zmienna dostepna przez wskaznik
   
    delete i; //usuwanie zmiennej dostepnej przez wskaznik z pamieci
}
//koniec bloku, tu wskaznik na zmienna nie istnieje

Podsumowanie wedlug mnie: pamiec zuzywana poczatka w obydwóch przykladach jest taka sama, zwieksza sie dopiero jak program zacznie wykonywac ten zakres/blok, pamiec sie zwiekszy, a potem zmaleje.
Roznica polega na tym ze "docieranie" przez wskaznik jest szybsze(moze nie w przypadku tej zmiennej).

Pytanie: Czy mam racje? jesli nie, to prosze o wyprowadzenie mnie z błędu
P-106703
pekfos
» 2014-03-18 17:11:13
pamiec zuzywana poczatka w obydwóch przykladach jest taka sama
Niekoniecznie.

zwieksza sie dopiero jak program zacznie wykonywac ten zakres/blok, pamiec sie zwiekszy, a potem zmaleje.
Zwiększa się tylko w drugim kodzie.

Roznica polega na tym ze "docieranie" przez wskaznik jest szybsze
Nie.
P-106707
Parapet
» 2014-03-18 17:21:34
@pekfos: Czasami nie do wskaźnika nie docieramy szybciej?
P-106710
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-03-18 17:22:01
skoro docieranie przez wskaznik nie jest szybsze (a tak czytałem m.in. w symfonii c++ stranard (3b) ale to było odnośnie wielowymiarowych dużych tablic) to nadal nie rozumiem ich stosowania.
Jedyne co do mnie "przemawia" to to, że jak mam gre i odpalam np. tryb singleplayer to moge ten tryb stworzyć dopiero w trakcie uruchomienia procesu gry, dzieki czemu, na poczaktu gra nie zuzywa tak duzo pamieci, jakby ten tryb byl przyszykowany na poczatku i cały czas czekal tylko na sygnał ze ma dzialac. Ale skoro to nie dziala tak to juz nie mam pojecia czemu wskaźniki sa tak wychwalane...
P-106711
pekfos
» 2014-03-18 17:40:03
@pekfos: Czasami nie do wskaźnika nie docieramy szybciej?
Możesz jaśniej, bez zbędnych 'nie'? Przez wskaźnik dociera się do pamięci wolniej, niż do zwykłej zmiennej, która nawet nie musi być w pamięci.

nadal nie rozumiem ich stosowania.
Np przydają się, gdy chcemy pozyskać pamięć o nieznanych w czasie kompilacji rozmiarach. Albo jak chcemy przechowywać obiekty o nieznanych typach.

Jedyne co do mnie "przemawia" to to, że jak mam gre i odpalam np. tryb singleplayer to moge ten tryb stworzyć dopiero w trakcie uruchomienia procesu gry
To również da się bez wskaźników.
P-106720
RazzorFlame
» 2014-03-18 21:54:43
Może też się udzielę w tym temacie. Kiedyś też uważałem, że to bez sensu, jednak w praktyce jest inaczej. Popatrz:
C/C++
class Okno
{
    //...
};
class Obrazek
{
public:
    void draw( Okno okno, int x, int y )
    {
        okno.draw( this );
    }
    void draw( Okno * okno, int x, int y )
    {
        okno->draw( this, x, y );
    }
};
Poza różnicą w składni możemy też zaobserwować to, że w przeciążeniu funkcji draw z wskaźnikiem zamiast zwykłej zmiennej można ją modyfikować. Jeżeli użyjesz pierwszej funkcji to obrazek zostanie wyświetlony na kopii a nie na tym co chcemy. Poza tym jeżeli chcesz raz ustalić sobie taki wskaźnik i potem nie podawać go [Okno *okno] w funkcji to możesz użyć statycznego wskaźnika:
C/C++
class Obrazek
{
public:
    static Okno * okno;
   
    static Okno * getPointer()
    {
        return okno;
    }
   
    // pierwsza funkcja draw z kopiowaniem
    void draw( int x, int y )
    {
        getPointer()->draw( this, x, y );
    }
   
    static void setPointer( Okno * ptr )
    {
        okno = ptr;
    }
}
Okno * Obrazek::okno = NULL;

int main()
{
    Okno naszeOkno;
    Obrazek::setPointer( & naszeOkno );
   
    Obrazek obrazek;
    obrazek.draw( 0, 0 );
    return 0;
}
Widać zastosowanie prawda?
P-106741
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-03-18 22:27:19
szczerze to nie :/ Chodzi ci o to że funkcja bez wskaznika rysuje tak naprawde jego chwilowa kopie a ze funkcja ze wskaznikiem jego jako oryginal? ale to moglbym zrobic przez referencje np.
okno.draw( & obrazek, x, y )
...
P-106745
DejaVu
» 2014-03-19 12:11:05
@up: Twój przykład nie zawiera referencji. Twój przykład zawiera pobranie adresu zmiennej.
P-106768
« 1 » 2
  Strona 1 z 2 Następna strona