Wyświetlenie wskaźnika void

Odpowiedz Nowy wątek
2015-01-23 00:31
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?

2015-01-23 00:33
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ć?


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-01-23 00:47
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.

Pozostało 580 znaków

2015-01-23 00:49
#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

edytowany 3x, ostatnio: gośćabc, 2015-01-23 00:55

Pozostało 580 znaków

2015-01-23 00:57
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ą.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2015-01-23 01:00
on i tak tego jeszcze nie zrozumie ale + za wykład, dodam jeszcze, że jest bardzo mało praktycznych (dobrych) użyć wskaźnika void, należy go raczej unikać - gośćabc 2015-01-23 00:59

Pozostało 580 znaków

2015-01-23 01:23
0

Dziękuje.

Pozostało 580 znaków

2015-01-23 12:11
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 ;)

edytowany 3x, ostatnio: Proxima Centauri, 2015-01-23 13:30
Więc obejmij również ostatni fragment kodu w znaczniki - Sarrus 2015-01-23 12:15
Zwykle zapisujemy to tak talbica[1],ale wskaźniki mogą czasami okazać się szybsze, oh. W jakim przypadku konkretnie? - n0name_l 2015-01-23 12:16
przepraszam sir, że uraziłem cię swoją nie kompetencją. Myślę, że podczas wykonywania dużej ilości operacji na tablicach, bo nie musi sprawdzać do jakiego miejsca w pamięci odnosi się dana zmienna. Tutaj maż doświadczenie: http://cpp.sh/6tg76 Pozdrawiam ;) - Proxima Centauri 2015-01-23 12:34
Jeżeli robisz tak: *(wsk + 1); *(wsk + 2); to nie ma znaczenia. Inaczej jeżeli w pętli np. robisz tak: *wsk++. Wtedy jest różnica - Sarrus 2015-01-23 12:41

Pozostało 580 znaków

2015-01-23 12:31
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.

edytowany 3x, ostatnio: n0name_l, 2015-01-23 12:50
Pokaż pozostałe 4 komentarze
Nie życzę sobie żebyś mnie obrażał. - n0name_l 2015-01-23 13:33
To nie jest obraza tylko stwierdzenie faktu. - Proxima Centauri 2015-01-23 13:36
@n0name_l: new T[N] to jest tablica. Takie wyrażenie tworzy obiekt typu T[N] a ten obiekt to tablica N elementów typu T. (5.3.4.5) - Endrju 2015-01-23 16:46
@Endrju new T[N] faktycznie tworzy tablicę, ale wyrażenie to zwraca wskaznik na pierwszy element a nie tablicę per se. -> the new-expression yields a pointer to the initial element (if any) of the array. i Note: both new int and new int[10] have type int*. - n0name_l 2015-01-23 17:35
No oczywiście, że tak. Ale to co jest tworzone to tablica i przecież to jest w new [] najważniejsze. :-) - Endrju 2015-01-23 18:15

Pozostało 580 znaków

2015-01-23 14:15
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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