Problem ze strukturą i wskaźnikiem

2017-01-31 17:00

Rejestracja: 3 lata temu

Ostatnio: 2 miesiące temu

0

mam pytanie
Dla następujących funkcji:

 struct ulamek
{
int licz;
unsigned mian;
} x,*p;

Które instrukcjie nie są poprawne?
a) x.licz=3; b) (&x)->mian=7; c) *(p.licz)=9; d) p->mian=1;
Dlaczego instrukcja b) jest poprawna i co ona oznacza, bo nie mam pojęcia,
i instukcja c) jest żle, i powina być taka:
*(p).licz=9; - ale przy zastosowaniu tej instrukcji pisze mi komunikat ' reguest for member "licz" is something not a structure or union
poniżej kod do przykładu c)

struct ulamek
{
int licz;
unsigned mian;
} x,*p=&x;

*(p).licz=9;
edytowany 4x, ostatnio: furious programming, 2017-02-01 16:49

Pozostało 580 znaków

2017-02-01 10:01

Rejestracja: 16 lat temu

Ostatnio: 2 dni temu

1

A wystarczyło chodzić na zajęcia :/
Ampersand (&) zwraca Ci wskaźnik do obiektu, czyli:
x - to jest obiekt
&x - to jest wskaźnik do obiektu.

Do pól obiektu odwołujesz się kropką (x.licz = 3)
A do pól obiektu wskazywanego przez wskaźnik odwołujesz się operatorem ->

Odpowiedź b można by rozpisać łatwiej:

 ulamek * wsk = &x;
wsk->mian = 7;

wsk to wskaźnik na ulamek.
Jak widzisz, posłużyłem się operatorem -> do zmiany wartości pola mian.

Teraz skracając ten zapis można zrobić:

 (&x)->mian = 7;

Czyli bierzesz wskaźnik na obiekt x i zmieniasz mu wartość pola.

Pozostało 580 znaków

2017-02-01 16:01

Rejestracja: 3 lata temu

Ostatnio: 2 miesiące temu

0

naprawde jest to nielogiczne,
instrukcja (&x)->mian=7; ? przecież adres x nie jest nigdzie przypisany,żeby z niego korzystać,ee 0_0 , nie rozumiem
i dlaczego nie działa instrukcja - odnośnie przykładu c) zmodyfikowanego
*(p).licz=9; skoro to to samo co p->licz=9; , czy ja coś robie żle

Pozostało 580 znaków

2017-02-01 16:09

Rejestracja: 5 lat temu

Ostatnio: 1 miesiąc temu

0

Pewne operacje są dozwolone na obiektach tymczasowych, czyli takich "nieprzypisanych do niczego".

Kropka ma wyższy prioritet niż gwiazdka, a nawiasy wokół zmiennej są bez sensu:

*(p).licz = *p.licz = *(p.licz)
p->licz = (*p).licz
Pokaż pozostałe 2 komentarze
bo poprawna instrukcja jest inna niż niepoprawna instrukcja? - twonek 2017-02-01 16:30
no przecież wiem, 0_o tak tylko powiedziałem, ale czemu nie działa - bartek164 2017-02-01 16:31
to jaka jest poprawna, wt hell - bartek164 2017-02-01 16:31
@bartek164: na temat odpowiadaj w postach - tam zadawaj pytania dotyczące kodu. - furious programming 2017-02-01 16:31
ta w pierwszej linii jest niepoprawna, ta w drugiej jest poprawna - twonek 2017-02-01 16:32

Pozostało 580 znaków

2017-02-01 16:43

Rejestracja: 3 lata temu

Ostatnio: 2 miesiące temu

0

Dobra rozumiem, ale dalej nie rozumiem sensu tej instrukcji
(&x)->mian = 7; jest to tworzenie wskażnika do x i działanie na nim???co się dzieje ze zmienną x?

Pozostało 580 znaków

2017-02-01 16:55

Rejestracja: 5 lat temu

Ostatnio: 1 miesiąc temu

1

Takiej instrukcji nikt by normalnie nie pisał, jedyny cel tu to zilustrowanie faktu, że można używać operatora -> na wyniku operacji pobrania adresu.

co się dzieje ze zmienną x?

To samo, co byś pisał x.mian = 7.

no to zdanie jest bardzo rozjaśniające - bartek164 2017-02-01 17:07

Pozostało 580 znaków

kq
2017-02-01 16:58
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 1 dzień temu

Lokalizacja: Szczecin

1

Nic się nie dzieje. dla int x, 2 * x + 2 - czy rozumiesz dlaczego przypisanie wyniku 2 * x do zmiennej nie jest niezbędne aby wykonać operację + 2?


sorki, nie rozumiem o co ci chodzi, no nie trzeba, bo program pamięta tą wartość? - bartek164 2017-02-01 17:08
&x to wyrażenie mające wartość adresu x. Nie zmienna, ale możesz sobie je wyobrażać jako nienazwaną zmienną tymczasową. Dokładnie tak jak w przypadku z postu x+2 jest wyrażeniem mającym wartość x+2, które możesz traktować jak nienazwaną zmienną tymczasową o takiej wartości. - kq 2017-02-01 17:09

Pozostało 580 znaków

2017-02-01 17:20

Rejestracja: 3 lata temu

Ostatnio: 2 miesiące temu

0

no dobrze, ja to rozumiem, ale jak się to odnosi do przykładu powyżej, no i się dowiedziałem, że wartość wyrażenia(nie wiedziałem wcześniej) (&x)->mian = 7; to 7, ale nie rozumiem jaki to ma właśnie związek.Bo jak rozumiem w instukcji(&x)->mian = 7;, pobierany jest adres x(a właściwie jego wskażnik) i tam wpisywana wartość 7

Pozostało 580 znaków

2017-02-02 10:18

Rejestracja: 16 lat temu

Ostatnio: 2 dni temu

Wartość 7 nie jest wpisywana jako adres. Gdyby tak było to miałbyś &x = 7. Każda zmienna ma swój adres. &x zwraca Ci adres zmiennej x. Ale potraktuj to jak wskaźnik wskazujący na zmienną x. Wtedy zapis (&x)->mian = 7 jest już jasny. Nie masz zmiennej x, tylko wskaźnik wskazujący na zmienną x. A operator strzałki odwołuje się do odpowiedniego pola obiektu x wskazywanego wskaźnikiem &x.

Prościej, kod:

ulamek * wsk = &x;
wsk->mian = 7;

Jest właściwie tym samym kodem, co:

 (&x)->mian = 7;

I te wszystkie kody zrobią to samo, co ten:

 x.mian = 7;

Tylko w ostatnim odwołujesz się do pola mian za pomocą obiektu, a w poprzednich za pomocą wskaźnika do obiektu.

edytowany 1x, ostatnio: Juhas, 2017-02-02 10:21

Pozostało 580 znaków

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