Cześć, pisze program, który pokazuję jak zmieniają się wartości zmiennych wskaznikowych, ale mam mały błąd i proszę o pomoc.
@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.
Będę miał kartkowke z czegos takiego na kartce to zrobię i pokaże co jak się zmienia ale chciałem tez program zrobić
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 naint'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.
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]
#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".
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.
Szczerze polecam poczytać pewien dobry tutorial nt. wskaźników
https://pl.wikibooks.org/wiki/C/Wska%C5%BAniki
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;
}
No tak. Uzylbym wektora, ale autor chce się nauczyć wskaźników i latwiej na tej podstawie przedstawić to na ten sposob