Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Albo ja albo kompilator jest debilem


Rekomendowane odpowiedzi

Opublikowano

#include <iostream>
using namespace std;
int main()
{

float a = 1010110101;

float * wskaz = a;

cout << a << endl;

system ("pause");


}

 

dlaczego to nie działa...

co ciekawe poniższy kod działa.

#include <iostream>
using namespace std;
int main()
{

float a = 1010110101;

float * wskaz;
*wskaz = a;

cout << a << endl;

system ("pause");


}

 

wychodzi na to że jest różnica między

 

 

float * wskaz;

*wskaz = a;

 

a

 

float * wskaz = a;

 

Dlaczego???

-Jestem habilitowanym profesorem,magistrem, który nie umie zawiązać sobie butów.

-A ja jestem technikiem który daje ci prace.

Opublikowano

Jeżeli chcesz w pierwszym kodzie osiągnąć taki sam efekt jak w drugim to ta linijka :

float * wskaz = a;

Musi wyglądać tak :

float * wskaz = &a;

 

 

Przeczytaj ten temat :

http://cpp0x.pl/#/kursy/?nro=304

Kocham mame

Opublikowano

aaa to zmienia postać rzeczy...:P tylko dlaczego

*wskaz = l;

działa ???

czy nie powinno być

*wskaz = &l;???

-Jestem habilitowanym profesorem,magistrem, który nie umie zawiązać sobie butów.

-A ja jestem technikiem który daje ci prace.

Opublikowano

postaram się ci to wytłumaczyć

 

Wskaźnik jest zmienną jak każda inna, ma wartość.

Odwołujesz się do niej jak do każdej innej.

 

operator & wyłuskuje adres

a operator * wyłuskuje zmienną pod podanym adresem (nie podczas deklaracji, tam oznacza jedynie, że zmienna jest wskaźnikiem).

 

możesz więc zrobić takie przypisanie:

int* a = &b --> co będzie przypisaniem (int*) = (int*)

możesz też zrobić tak

int* a = b --> co będzie przypisaniem (int*) = (int)

albo tak

int* a;

*a = b --> co będzie przypisaniem (int) = (int)

lub

int* a;

*a = &b --> co będzie przypisaniem (int) = (int*)

 

Każde z tych może się przydać, w zależności od tego co chcesz zrobić.

w dwóch pierwszych przykładach nie dereferujemy zmiennej, więc jest ona nadal dla nas wskaźnikiem, bo ta '*' przy deklaracji, mówi kompilatorowi, że jest to wskaźnik.

Ciężko jest to zrozumieć, wytłumaczyć wcale nie łatwiej, ale mam nadzieję, że zrozumiesz na podstawie powyższych przykładów choć część z tego.

 

btw. Przyuważyłem, że wskaźnik, jest interpretowany przez kompilator jako oddzielny typ. Np int*, double*, czy float**.

Ale przy deklaracji, gdy zrobisz tak

float* a, b;

to tylko a będzie wskaźnikiem, bo '*' jakby 'przykleja się' do zmiennej

więc, jeśli chcesz aby obie te zmienne były wskaźnikami to musisz zrobić tak.

float *a, *b;

 

nie jestem dobry w tłumaczeniu, więc jeśli ktoś coś lepiej mógłby napisać to niech coś dopowie

 

btw.

istnieją 3 operatory dereferencji w c++

*

[]

i ->

* służy do derefrencji z wartości

[] jeśli znanym chyba odwołaniem do elementu tablicy. Pierwszy element tablicy jest po prostu wskaźnikiem. Więc zapis int tablica[10] jest równoważny z *(tablica+10*sizeof(int))

a -> służy do dereferencji obiektów klas.

Opublikowano

Świetnie dziękuję, że chciało ci się tyle napisać lecz wdg powyższego zapisu

int* a = &b

to powinno mi działać to

 

 

#include <iostream>

#include <string>

using namespace std;

int main()

{

char b[30];

char* a =&b;

cin >> b;

cout << b <<endl;

cout <<*a<<endl;

 

system ("pause");

}

 

a działa dopiero gry usune &

 

 

co ciekawe tak sobie testuje i

 

 

#include <iostream>

#include <string>

using namespace std;

int main()

{

int a;

int *wskaz=&a;

cin>>a;

cout <<a;

cout <<*wskaz;

system ("pause");

}

 

to mi działa WTF.

-Jestem habilitowanym profesorem,magistrem, który nie umie zawiązać sobie butów.

-A ja jestem technikiem który daje ci prace.

Opublikowano

(int*) = (int*)-co oznacza ten zapis ????

int* a = b --> (int*) = (int)-wdg mnie to znaczy że wskaźnik typu int wskazuje na zmienną typu int

 

int* a;

*a = b --> co będzie przypisaniem (int) = (int)-nie wiem co oznacza ten zapis i wdg. mnie nie różni się niczym od powyzszego

lub

int* a;

*a = &b --> co będzie przypisaniem (int) = (int*)-natomiast ten nieróżni się chyba niczym od pierwszego wdg mnie wiec nie ogarniam tych zapisów [(int) = (int*);(int) = (int);(int*) = (int); (int*) = (int*)]

-Jestem habilitowanym profesorem,magistrem, który nie umie zawiązać sobie butów.

-A ja jestem technikiem który daje ci prace.

Opublikowano

Świetnie dziękuję, że chciało ci się tyle napisać lecz wdg powyższego zapisu

int* a = &b

to powinno mi działać to

 

 

#include <iostream>

#include <string>

using namespace std;

int main()

{

char b[30];

char* a =&b;

cin >> b;

cout << b <<endl;

cout <<*a<<endl;

 

system ("pause");

}

 

a działa dopiero gry usune &

napisałem o tym w btw,

pierwszy element tablicy jest wskaźnikiem, a operator [] jest sposobem na jego dereferencję.

pisząc &b wyciągasz adres gdzie leży wskaźnik b

Opublikowano

aha łapie czyli po prostu jak jest [] to bez &

Tablica to coś jak wskaźnik dlatego jak chce przypisać jeden wskaźnik drugiemu to taki error wyskakuje.(napisać czy dobrze ogarniam)

czy może dlatego że dereferując zmienną b za pomocą [] nie dereferuje się już za pomocą &.

:D chciałbym się tylko dowiedziec jeszcze co to znaczy tak na CHŁOPSKI rozum deferencja.

I jak inaczej można wykonać tą funkcje bez użycia tablicy.

-Jestem habilitowanym profesorem,magistrem, który nie umie zawiązać sobie butów.

-A ja jestem technikiem który daje ci prace.

Opublikowano

Nie ma deferencji, jest referencja i dereferencja. Referencja w c++ jest bezpośrednią operacją na zmiennej danej w parametrze funkcji, a nie na kopii tej zmiennej. Dereferencji nie znam. A jeśli chodzi o wyłuskiwanie, to jest to czynność pozwalająca na działaniu na wartości wskazywanej przez dany wskaźnik.

Jak się pomyliłem, to mnie poprawcie :)

Pokazać na przykładach?


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Opublikowano

aha rozumiem czyli & to operator dereferencji który pozwala na wyłuskiwanie adresy.skoro zrobiłem to [] to już przed zmienną nie daje & ...dzięki rozumiem ave MPC

Opublikowano

czy kolega powyżej ma rację jeśli tak to też już rozumiem...ale mieliście podac sposób jak zrobić to inaczej bez tablicy.

-Jestem habilitowanym profesorem,magistrem, który nie umie zawiązać sobie butów.

-A ja jestem technikiem który daje ci prace.

Opublikowano

nie

operator & to jedynie operator wyłuskania adresu

dereferencja polega na czymś odwrotnym

 

dereferencja polega na wyłuskaniu wartości, która leży w miejscu na które wskazuje wskaźnik

na dereferencję są 3 sposoby w c++

 

*

[]

i ->

* służy do derefrencji wskaźnika

[] jest znanym ci chyba odwołaniem do elementu tablicy. Pierwszy element tablicy jest po prostu wskaźnikiem. Więc zapis int tablica[10] jest równoważny z *(tablica+10*sizeof(int)). Czyli na chłopski rozum liczba między [] jest wartością mówiącą o ile przesunąć wskaźnik (arytmetyka wskaźników działą tak, że dodając jakąś wartość do wkaźnika dodajesz wielokrotność rozmiaru obiektu na który wskazuje)

a -> służy do dereferencji wskaźnika na obiekt klasy.

 

btw. ktoś tam miał problem z tym, co to jest wyłuskiwanie adresu. Jest to pobieranie adresu komórki pamięci, w której leży zmienna

 

PS. jeśli ktoś chce mieć to spokojnie i lepiej wytłumaczone, to polecam tę serię filmów poświęconych pointerom. 9 odc po 30 minut

Opublikowano

Trochę jakby w wytłumaczeniach umknęło to, co na wstępie najważniejsze:

Gwiazdka gwiazdce nierówne

 

Istnieją trzy miejsca, w których token ' * ' w C++ jest używany:

- deklaracja typów wskaźnikowych ( float* zmienna; )

- dereferencja ( *zmienna = 15; )

- mnożenie ( *zmienna * 5 == 75 == 5 * 5 * 3; )

 

W pierwszym przypadku tworzysz zmienną 'wskaz' typu float*

W drugim - dereferencjujesz zmienną wskaźnikową.

 

Ten sam token ' * ' jest używany w innych kontekstach i robi coś innego w tych dwóch przykładach.

 

- - - - - - -

 

Intuicyjnie:

* ( float * ) daje nam float

 

Zgodność typów jest bardzo ważna -> pierwszy przykład nie przechodzi.

 

Stąd nieporozumienie między tobą a kompilatorem :P

 

 

- - - - -

 

 

W kwestii tablic:

Sopelek trochę miesza; nie wolno utożsamiać tablicy ze wskaźnikiem.

Można co najwyżej powiedzieć, że zmienna tablicowa może być traktowana jako wskaźnik. To nie do końca to samo.

 

I teraz:

 

char b[30];

char* a =&b;

 

Zmienna b jest typu char[]

Zmienna a jest typu char*

 

( &b ) "będzie typu" char

Nie można do char* przypisać char

 

Ponieważ jednak zmienna typu tablicowego może być traktowana jako wskaźnik, do char* "można przypisać" typ char[]

 

- - - - - -

 

Do tego dochodzą jeszcze kwestie jawnego i niejawnego ( implicit oraz explicit ) rzutowania typów.

To jest dość ważne i wcale nie jest proste. Gdyż tak naprawdę wszystko można, ale ile będzie w tym sensu, to już zależy od programisty...

Ta sygnatura jest pusta.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...