Wątek przeniesiony 2016-09-17 20:14 z C/C++ przez kq.

Tablica struktur i struktura dynamiczna, analiza zadania

0
#include<iostream>
using namespace std;

struct car
{
    string marka;
    int rok;
};

int main()
{
    cout << "Podaj ile aut chcesz skatagolowac: \n";
    int i;
    cin>>i;

car *dane = new car[i];

        for(int j=0; j<=i-1; j++)
        {
            cin.ignore();
            cout << "Marka: ";
            getline(cin,(dane[j].marka));
            cout << "Rok: ";
            cin>>(dane[j].rok);

        }
    cout << "-----------------" << endl;
for(int d=0; d<=i-1; d++)
{
    cout << dane[d].marka << endl;
    cout << dane[d].rok << endl;
}

    return 0;
}
 

Mógłby mi ktoś wytłumaczyć dlaczego to działa na wskaźniku, oraz zapisujemy po kropce zamiast "dane->marka[j]" ?
Wiem, że tak nie mogę zapisywać, sprawdzałem na wiele sposobów ale nie potrafię sobie wytłumaczyć jak to działa. Proszę o poradę.
Pozdrawiam

1
  1. W C++ wskaźnik jest równoznaczny z tablicą (a tak właściwie to w drugą stronę: tablica ze wskaźnikiem).
  2. Do pola odnosi się przez kropkę, ponieważ wynikiem operacji dane[j] jest car (już bez wskaźnika, została dokonana dereferencja), zatem do pól oraz metod odnosi się przez operator ..
5

W C i C++¹ zapis a[b] jest równoważny zapisowi *(a+b) (co równocześnie czyni go równoważnym b[a]).

Natomiast zapis a->b jest równoważny (*a).b (lub (*(a+0)).b lub (a[0]).b lub a[0].b)

Znając już te podstawy możemy zauważyć, że dane->marka[j] to j+1-ty element stringa marka należącego do obiektu, na który wskazuje dane. Jego równoważny zapis to dane[0].marka[j] lub (*dane).marka[j]. Nie jest on w żaden sposób zamienny z dane[j].marka.

Ponadto:

  1. W C++ używanie nagiego new i delete jest antyidiomem. Używaj kontenerów lub smart pointerów
  2. Co to za dziwna iteracja? for(int i = 0; i < max; ++i) ...

¹ pomijając przeładowanie operatorów

0

Dziękuje wam za odpowiedzi, jeszcze nie potrafię sobie tego dobrze zobrazować, ale na pewno pomogło mi to w zrozumieniu jak to działa i przećwiczeniu kilku przykładów. C++ jest świetne :)
Kq, w moim kodzie nie ma takiej iteracji:)
Pozdrawiam.

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