Wątek przeniesiony 2016-04-20 14:45 z C/C++ przez ŁF.

Wskazniki program do nauki

0

Cześć, pisze program, który pokazuję jak zmieniają się wartości zmiennych wskaznikowych, ale mam mały błąd i proszę o pomoc.

http://pastebin.com/BT2zdZXU

0

@nevexsys W ten sposób nie nauczysz się wskaźników - uwierz mi. A już coś takiego ***e=***f+**c+*a;...no to straszne jest po prostu.

0

Będę miał kartkowke z czegos takiego na kartce to zrobię i pokaże co jak się zmienia ale chciałem tez program zrobić

0

To podejdź do tego inaczej, bo Twój program zawiera w sobie mnóstwo błędów i to takich naprawdę mocnych błędów.

  • Inicjalizujesz pola tablicy (nie tego typu co trzeba, patrz dalej) wskaźnikami, które wskazują na śmieci Niby nic w tym złego ale trzeba pamiętać żeby je zainicjalizować przed użyciem;
  • Po co taka wielka tablica? Nie wystarczy jednowymiarowa, krótka? Przecież tylko się gubisz w tym co robisz teraz;
  • To ***e=***f+**c+*a; jest naprawdę straszne i NIC z tego nie wiadomo, bo to NICZEGO nie pokazuje;
  • wsk nie jest tablicą wskaźników na int'y tylko tablicą int'ów i nie możesz wstawiać wskaźników jako elementy;
  • Możesz przypisywać do niej elementy za pomocą wyłuskania wskaźnika, po warunkiem, że wskaźnik wskazuje na obiekt typu int;

Naprawdę, zobacz najpierw jak to działa na czymś prostszym, np. na jednej zmiennej. Pozwoli Ci to zrozumieć o co chodzi ze wskaźnikami.

0

Ma pokazywać śmieci na co wskazują w 1 wywołaniu coś takiego tylko zamiast x to 1 zamiast y 2 itp [url=http://ifotos.pl/z/sswsspa/][img]http://s2.ifotos.pl/mini/201604201_sswsspa.jpg[/img][/url]

0
 #include <iostream>

using namespace std;

void x1 (int *x)
{
    cout << 'x' << "     ";
    cout << x << "     ";
    cout << *x << endl;
}

void y1 (int *y)
{
    cout << 'y' << "     ";
    cout << y << "     ";
    cout << *y << endl;
}

void a1 (int **a)
{
    cout << 'a' << "     ";
    cout << a << "     ";
    cout << *a << endl;
}

void b1 (int **b)
{
    cout << 'b' << "     ";
    cout << b << "     ";
    cout << *b << endl;
}

void c1 (int ***c)
{
    cout << 'c' << "     ";
    cout << c << "     ";
    cout << *c << endl;
}

void d1 (int ***d)
{
    cout << 'd' << "     ";
    cout << d << "     ";
    cout << *d << endl;
}

void e1 (int ****e)
{
    cout << 'e' << "     ";
    cout << e << "     ";
    cout << *e << endl;
}

void f1 (int ****f)
{
    cout << 'f' << "     ";
    cout << f << "     ";
    cout << *f << "\n\n" << endl;
}

int main ()
{

int x=1;
int y=2;
int *a;
int *b;
int **c;
int **d;
int ***e;
int ***f;
    
    a=&x;
    b=&y;
    c=&b;
    d=&a;
    e=&d;
    f=&c;
    
    x1 (&x); y1 (&y); a1 (&a); b1 (&b); c1 (&c); d1 (&d); e1 (&e); f1 (&f);
    ***e=***f+**c+*a;
    x1 (&x); y1 (&y); a1 (&a); b1 (&b); c1 (&c); d1 (&d); e1 (&e); f1 (&f);
    *e=c;
    x1 (&x); y1 (&y); a1 (&a); b1 (&b); c1 (&c); d1 (&d); e1 (&e); f1 (&f);
    **e=*d;
    x1 (&x); y1 (&y); a1 (&a); b1 (&b); c1 (&c); d1 (&d); e1 (&e); f1 (&f);
    ***e=**d+*a+2;
    x1 (&x); y1 (&y); a1 (&a); b1 (&b); c1 (&c); d1 (&d); e1 (&e); f1 (&f);
    *f=&a;
    x1 (&x); y1 (&y); a1 (&a); b1 (&b); c1 (&c); d1 (&d); e1 (&e); f1 (&f);
    **f=&x;
    x1 (&x); y1 (&y); a1 (&a); b1 (&b); c1 (&c); d1 (&d); e1 (&e); f1 (&f);
    *d=**e;
    x1 (&x); y1 (&y); a1 (&a); b1 (&b); c1 (&c); d1 (&d); e1 (&e); f1 (&f);
    **d=***f+**c;
    x1 (&x); y1 (&y); a1 (&a); b1 (&b); c1 (&c); d1 (&d); e1 (&e); f1 (&f);
return 0;
}

Działa, dzięki za "pomoc".

1

Zamiast zajmować się pierdółami to pochyl się nad czymś co Ci się naprawdę może przydać, czyli:

  • czym jest wskaźnik na stałą
  • czym jest stały wskaźnik
  • podmiana wskaźnika w funkcji
  • rzutowanie

Niczego więcej nie potrzeba. "Podwójne" wskaźniki można spotkać w libkach ( np. direct3d ). Każda 'gwiazdka' więcej to bzdura i zaciemnianie kodu.

0

Szczerze polecam poczytać pewien dobry tutorial nt. wskaźników
https://pl.wikibooks.org/wiki/C/Wska%C5%BAniki

0

W skrócie:

#include <iostream>

using namespace std;

int main(){
    /// tablica
    int tab[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};

    ///wskaznik <typ na jaki wskazuje> <nazwa> <okreslenie miejsca w pamieci na jaki ma wskazywac>
    int *TabPtr = &tab[0];

    /// odczytujemy miejsce w pamieci
    cout << "miejsce w pamieci: " << TabPtr;

    /// odczytujemy wartosc z tego miejsca
    cout << "\r\nwartosc: " << *TabPtr;

    /// tworzymy wskaznik na wskaznik
    int **tabPtrPtr = &TabPtr;

    cout << "\r\nAdres pamieci tabPtrPtr: " << tabPtrPtr;
    cout << "\r\nAdres pamieci TabPtr: " << *tabPtrPtr;
    cout << "\r\nOdczytanie warosci z tabPtrPtr: " << **tabPtrPtr;

    /*
    Wskaznik tylko wskazuje na jakies miejsce, jesli chcesz dokonywac jakis operacji musisz zaalokowac pamiec
    na swoje widzimisie.
    */

    /// wskaznik AdresAlokacji wskazuje na zarezerwowany obszar w pamieci o rozmiarach mieszczacych 3 liczby typu INT
    int *AdresAlokacji = new int[3];
    /// teraz mozemy spokojnie nadac elementom tablicy jednowymiarowej jakies wartosci
    AdresAlokacji[0] = 123;
    AdresAlokacji[1] = 134;
    AdresAlokacji[2] = 145;
    cout << "\r\nL0 = " << AdresAlokacji[0] << ", adres: " << &AdresAlokacji[0];
    /// niestety musimy wyczyscic po sobie pamiec
    delete AdresAlokacji;
}
 
0

No tak. Uzylbym wektora, ale autor chce się nauczyć wskaźników i latwiej na tej podstawie przedstawić to na ten sposob

1 użytkowników online, w tym zalogowanych: 0, gości: 1