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?
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?
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ć?
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.
#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
@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ą.
Dziękuje.
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 ;)
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.
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.