Zrozumieć: wskaźniki i kodowanie U2

0
int zmienna;
int *wsk_0 = &zmienna; // ustawiam wskaźnik na zmienną
int *wsk_1 = wsk_0;    // ta linia
int *wsk_2 = &wsk_0[0];// i ta znaczą to samo czyli przypisanie wskaźnikowi adresu na który wskazuje inny wskaźnik

int *wsk_3 = *wsk_1;   // to nie zadziała, bo *wsk_1 to wartość zapisana w miejscu na które wskazuje wsk_1
zmienna = wsk_1;       // albo
zmienna = &wsk_1[0];   // też nie zadziała, wsk_1 albo &wsk_1[0] to adres na który wskazuje wsk_1

Dochodzę więc do wniosku, że wskaźniki nie istnieją fizycznie, bo nie mają adresu.
1. Czy wskaźniki istnieją fizycznie czy tylko w języku programowania?

int *wsk_0 = new int;

int zmienna;
int *wsk_1 = &zmienna;

2. Czy są jakieś zasady, którego z tych sposobów używać? Lepszym wydaje się być oczywiście dynamiczne przydzielanie pamięci, ale ten drugi też po coś istnieje.

bool *wsk = new bool;
*wsk = 65;

Wskaźnik będzie zwracał wartość 0, jeśli liczba jest parzysta i 1 jeśli nie.
3. Czy używa się takiego rozwiązania w praktyce?

Mam liczbę 4-bitową zakodowaną w U2. Przyjmuje ona wartości 0..7 i -8..-1. Nie da się np. obliczyć wartości bezwzględnej z najniższej wartości, bo wartości dodatnich jest o jedną mniej. Przy zmianie znaku:

1000 ~  // -8
0111 +1 //  7
1000    // -8

4. Czy istnieje jakiś sposób, poza ograniczeniem danych wejściowych/nałożeniem warunku, na rozwiązanie tego problemu?

2
  1. oczywiście że wskaźniki mają adres. zrób tak

int *wsk;
cout << &wsk

  1. Poczytaj o stosie i stercie. Duże obiekty się definiuje na stercie, małe na stosie (lecz nie jest to regułą)

  2. Pierwsze słyszę. Zawsze w każdej literaturze jest 0 = false co innego = true. Nigdy nie użyłem czegoś takiego jak new bool (tutaj przy "cokowliek innego" zachodzi niejawne rzutowanie, ale że dział newbie to nie będę się rozpisywał)

0

Jeśli wskaźniki maja adres to dlaczego nie mogę ustawić wskaźnika na adresie innego wskaźnika?

bool *wsk = new bool;
bool *wsk_1 = &wsk;

cannot convert bool**' to bool*' in initialization
W 3. rzeczywiście pogmatwałem.

1

oczywiście że możesz

http://ideone.com/YIfAeQ

wskaźnik (tutaj) jest typu *int więc potrzebujesz wskaźnik na typ *int. Że wskaźnik deklaruję się za pomocą * to masz **int

1
Przeszczep napisał(a):

Jeśli wskaźniki maja adres to dlaczego nie mogę ustawić wskaźnika na adresie innego wskaźnika? W 3. rzeczywiście pogmatwałem.

Są wskaźniki różnego typu. Wskaźnik int* nie jest tym samym wskaźnikiem co bool*. Jeśli chcesz stworzyć wskaźnik uniwersalny to użyj void* i w razie potrzeby rzutuj go na na inne rodzaje wskaźników (i tylko wskaźników), ale w takim przypadku trzeba dokładnie wiedzieć co się dzieje i co chce się osiągnąć.

Przykład, który dopisałeś jest podobny. Typ bool** (wskaźnik do wskaźnika do zmiennej bool) to coś innego niż bool* (wskaźnik do zmiennej bool).

0

Ok, mam to. Wskaźnik int* do zmiennej int, wskaźnik int** do wskaźnika int*, itd. Ktoś się wypowie na temat pytanie nr 4?

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