Wyświetlenie wskaźnika void

0

int i =4;
int *wi;
void *wv;
wi= &i;
wv=wi;
cout<<wv; <- 'void' is not a pointer-to-object type

czy jest jakaś możliwość wyświetlenia zawartości na którą wskazuje teraz *wv?

0

Nie bo niby co by to miało znaczyć? Ile bajtów miałoby ci wypisać niby? Bo jak wypisujesz inta to są 4 bajty, chara to jest 1 bajt, short int to 2 bajty, double to 8 bajtów. A wypisując voida co byś chciał niby zobaczyć?

0

Czyli jestem w stanie wyświetlić adres na jaki wskazuje ale czy jest np możliwość wykonania rzutowania czegokolwiek. Pytanie moje jest takie dlatego, że w symfoni Grębosza jest przykład:

 void *wv;
char *wc;
wv =wc;

i go nie rozumiem.

2
#include <iostream>

int main()
{
    char a = 'a'; // char
    char* c_ptr = &a; // c_ptr pokazuje teraz na a;
    void* ptr = c_ptr; // ptr pokazuje na to samo co c_ptr
    
    std::cout << *static_cast<char*>(ptr); // dowód

    return 0;
}

http://melpon.org/wandbox/permlink/JPTSrPxJWIXo3CkI

tak to działa

3

@dominik0b0 ech niewiele chyba zrozumiałeś z Grębosza niestety. Adres zmiennej w pamieci to jest po prostu numer komórki pamięci. Tyle, nic więcej. Pamięć ma ponumerowane komórki. Wskaźnik przechowuje liczbę, którą jest właśnie numer komórki gdzie coś jest. Jak coś wpiszesz do komórki z numerem 123 to potem wskaźnik na to co tam masz, przechowuje taki numerek. Może tak być że twoje dane zajmują więcej niż jedną komórkę. int na przykład zajmuje 4. Wskaźnik trzyma tylko numer pierwszej z komórek a potem kompilator na podstawie typu wskaźnika decyduje ile komórek odczytać jako "wartość". Więc generalnie "typ" wskaźnika nie jest związany z tym co wskaźnik przechowuje, każdy przechowuje po prostu liczbę. Typ określa tylko "jak" można wypisać wartość spod tego wskaźnika. W efekcie można sobie właściwie dowolnie rzutować wskaźniki na siebie, bo one wszystkie są dokładnie tym samym - zwykłą liczbą.

0

Dziękuje.

0

Czytasz na własną odpowiedzialność...

Dodam jeszcze dla Dominika, że "&" podaje adres, a "*" wartość.

int a = 5;
int* b = &a; // zapisanie adresu do b,
std::cout<<(*b)<<std::endl // 5

Przykład z tablicą.

int tablica[5] = {4,3,2,1,0};
int *wzkaznikNaTablice = tablica 

Jeśli teraz zwiększymy wskaźnik o odpowiednią ilość bajtów to będzie się odnosił do drugiego elementu "3"
Robimy to w ten sposób, że dodajemy do wskaźnika 1, w+=1
Wielkość wskaźnika możesz sprawdzić używając funkcji sizeof('wznaknik')
To daje nam możliwość dynamicznego alokowania pamięcią np.

stwórzTablice = 4 //elementami
int *dynamicznaTablica;
Tablica = new int [stwórzTablice]
for (int i=0; i<ilośćElementów; i++){
   std::cout<<ile +"  "+ int(Tablica) <<std::endl; //Wyświetlimy numer elementu i jego adres, wykonaliśmy rzutowanie bo adresy są zapisywane w (16)

Możesz też podawać wskaźniki jako argumenty funkcji.
int b = 2;
functionA(&b);

void functionA(*kkk){
kkk+=2;
}
wynik 4.

Pisane na szybko, ciągle się uczę i to mój pierwszy post więc ;)

1

int *wzkaznikNaTablice = tablica // nazwa tablicy to adres do pierwszego elementu w c++

Nazwa tablicy to nie jest adres. Nazwa tablicy co najwyżej może być niejawnie rzutowana na adres pierwszego elementu.

używając funkcji sizeof('wznaknik')

sizeof nie jest funkcją.

4 bajty(int)

int nie koniecznie ma 4 bajty.

stwórzTablice = 4 //elementami

Brak typu.

dynamicznaTablica = new int [stwórzTablice]

dynamicznaTablica wbrew swojej nazwie nie jest tablicą.

for (int i=0; i<ilośćElementów; i++){

Niezdefiniowana zmienna ilośćElementów.

(int)dynamicznaTablica

To nie zadziała niestety.

delete dynamicznaTablica[];

Raczej nie tak to szło.

@Proxima Centauri

Sukces	time: 0.81 memory: 393792 signal:0
Czas zapisu bez wskaznika: 0.364873
Czas zapisu uzywajac wskaznik: 0.420595

Sukces	time: 0.93 memory: 393792 signal:0
Czas zapisu bez wskaznika: 0.478956
Czas zapisu uzywajac wskaznik: 0.438155

Sukces	time: 0.76 memory: 393728 signal:0
Czas zapisu bez wskaznika: 0.371425
Czas zapisu uzywajac wskaznik: 0.365416

Sukces	time: 0.94 memory: 393792 signal:0
Czas zapisu bez wskaznika: 0.504653
Czas zapisu uzywajac wskaznik: 0.410723

Sukces	time: 1.01 memory: 393792 signal:0
Czas zapisu bez wskaznika: 0.494915
Czas zapisu uzywajac wskaznik: 0.495221

Podejrzewam, że gdybym odpalił w parzysty dzień tygodnia, wyniki byłyby inne.

0

Bardzo dziękuje wszystkim za odpowiedzi wiem że to infantylne rzeczy są ale ja głownie zajmuje się Java i dlatego wskaźniki sprawiają mi problemy.

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