Nie można wyłuskać zmiennej void/int po rzutowaniu

0

Mam problem z poniższym przykładem.

 
#include <iostream>
#include <conio.h>
using namespace std;

int main()
{
  int i = 99;

  void *vp = &i;
  cout << "vp: " << vp << endl;
  cout << "&vp: " << &vp << endl;
  //cout << "*vp: " << *vp << endl << endl; //to nie dziala

  *((int*)vp) = 3;
  cout << "vp: " << vp << endl;
  cout << "&vp: " << &vp << endl;
  //cout << "*vp: " << *vp << endl << endl; //to nie dziala

  getch();
  return 0;
}

Dlaczego nie mogę wyłuskać wartości zmiennej vp przez poniższe instrukcje ?

cout << "*vp: " << *vp << endl << endl;

Początkowo jest ona przecież deklarowana jako wskaźnik.

Próba kompilacji kodu z powyższą instrukcją powoduje wystąpienie błędu:
error: 'void*' is not a pointer-to-object type

Nie rozumiem, czy ma to związek z tym, że jako wskaźnik użyta jest zmienna void ?

1

Powód jest bardzo prosty - obiekty typu void nie istnieją. Zarówno zapis "void*" jak i stwierdzenie "wskaźnik na obiekt typu void" nie mają większego sensu semantycznego - zapis "void*" oznacza, że w danej chwili nie interesuje cię, albo nie wiesz na co wskaźnik wskazuje i żeby się dostać do tego obiektu trzeba zrzutować to na poprawny typ. Spróbuj utworzyć zmienną typu void.

0

Częściowo rozumiem. Tzn. w pierwszym fragmencie kodu po prostu tworzy się wskaźnik void, który wskazuje "coś", nie wiadomo co, jest inicjalizowany adresem zmiennej typu int, ale sam nie ma tak naprawdę określonego typu (jest typ "void", ale nieznany jest jego rozmiar, więc nie można go umieścić w pamięci, tak jak np. int, double, etc.), a sama inicjalizacja nie spowoduje zmiany typu. Dobrze rozumiem ?

Nie wiem, dlaczego ta sytuacja występuje nadal, po rzutowaniu na int, w drugim fragmencie kodu.

1

Rzutowanie nie zmienia przecież typu zmiennej. Rzutowanie zmienia typ wyrażenia (a to wyrażenie to np wartość zmiennej, a nie sama zmienna), a każda kolejna instrukcja to kolejne wyrażenie. Np taki zapis działa:

*(int *)50 = 4;

Po tej instrukcji jednak liczba 50 nie staje się wskaźnikiem na inta.

0

Teraz rozumiem, dzięki.

1

jest typ "void", ale nieznany jest jego rozmiar
nie ma typu void. słowo kluczowe void ma trzy znaczenia:

  1. w miejsce zwracanego typu funkcji oznacza, że funkcja nie zwraca wartości.
void foo()
  1. w połączeniu z gwiazdką, jako void* oznacza wskaźnik nietypowany (wskaźnik na nieznany typ obiektu)
void *p;
  1. w miejscu listy parametrów funkcji oznacza że funkcja nie przyjmuje parametrów (to samo co pusty nawias):
int foo(void)

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