Problem ze strukturą i wskaźnikiem

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;
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.

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

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
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?

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.

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?

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

1

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.

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