alokacja pamieci

0

Witam nie rozumiem dlaczego na tablicach obiektow danej klasy trzeba operator gwiazdki wsadzic do nawiasu.

1.Dlaczego *(tab+3)=100; a nie * tab+3 =100;
2.W tablicy obiektow klasy typu stacja_metra czemu operator wyluskania jest w nawiasie gdy cos chcemy przypisac ? (*wsk).km = 29; a nie po za jak u gory przy zwyklej tablicy obiektow int.

 
class stacja_metra {
public:
    float km;
    int glebokosc;
    char nazwa[40];
    char przesiadki[40];
};
int main()
{
    int* tab = new int[80];
    *(tab + 3) = 100;

    stacja_metra stacyjka[15];
    stacja_metra* wsk = &stacyjka[9];

    (*wsk).km = 29;
    cout << (*wsk).km;

    return 0;
}
1
  1. Bo operatory mają pewien priorytet. W tym przypadku gwiazdka ma wyższy niż plus. W efekcie zapis *tab+3 oznacza (*tab)+3 czyli próbujesz dodać liczbę 3 do wartości pod wskaźnikiem tab.
  2. Jw, priorytet operatorów. Operator kropka jest wyższy od gwiazdki więc zapis *wsk.km oznacza *(wsk.km) czyli próba wyłuskania wskaźnika km będącego polem struktury wsk.

To tak jakbyś pytał czemu musisz postawić nawias żeby policzyć (2+2)2 i uzyskać 8. Bo jak opuścisz nawias to masz 2+22 a zgodnie z priorytetem operatorów matematycznych mnożenie wykonujesz przed dodawaniem więc masz 2+2*2 = 2+4 = 6. Jak widać wynik nam się zmienił.

0

Dzieki wielkie!

1

Pamiętaj, że masz do dyspozycji operatory -> oraz [].

0

int *tab = new int[80];
*(tab + 3) = 100;

Ale nie dość że 100 prawdopodobnie zapisze nie nie tam gdzie autor w ogóle chce (nie w tab[3]) to jeszcze zinterpretowane różnie zależnie od arch: big endian vs little endian. Wynik operacji nadpisze dwie komórki tab[0] i tab[1] w pierwszej 3 najmłodsze bajty pozostaną niepewne w drugiej 1 najstarszy.

(*wsk).km jakby nie było operatora -> tj. wsk->km?
jeśli już to może lepiej wsk[0].km

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