Czy poprawnie użyłem wskaźników. Dlaczego przy tablicy nie używamy *.

0

Witam, dziś miałbym pytanie odnośnie wskaźników. Kod został zaakceptowany na SPOJ'u więc myślę, że nie powinien mieć błędów. Natomiast ciekawi mnie czy to w jaki sposób użyłem wskaźników jest poprawne(w sensie czy rzeczywiście dzięki takiemu użyciu program jest "szybszy") oraz dlaczego przy tablicach gdy używałem * która ma wskazywać to co pokazuje wskaźnik kompilator pokazywał błąd. Tablice są zapisywane tak jakby były po prostu zwykłym int'em a nie wskaźnikiem do inta. Może pominąłem jakieś ważne rzeczy odnoście wskaźników?

Link do kodu:
https://gist.github.com/xDevil2/7c270d16760df121a771b9f868ea60b6

3

o_O

  1. Nie, nie będzie szybsze. Jeśli juz to będzie wolniejsze.
  2. Operator indeksowania [] zawiera juz dereferencje wskaźnika. Zapis tablica[i] jest równoważny zapisowi *(tablica+i) stąd też użycie gwiazdki przez ciebie było błędem, bo w ten sposób gwiazdki były dwie
  3. Tablice dynamiczne ok, ale te pojedyncze inty alokowane dynamicznie to mogłeś sobie darować bo tylko komplikują kod.
3

Taka dynamiczna alokacja pojedynczych intów może co najwyżej spowolnić program. A do tablic dynamicznych użyj std::vector. Jawne używanie new i w szczególności delete to antyidiom w C++.

3

@xDevil2 różne głupoty można na wielu stronach przeczytać.

  1. Użycie dynamicznej alokacji nie zmniejszy zużycia pamięci bo i niby czemu? Jak alokujesz X bajtów to tyle pamięci potrzebujesz i tyle dostaniesz. Czy będzie to na stercie czy na stosie nie ma tu znaczenia.
  2. Używanie wskaźników NIE sprawi że coś będzie szybsze. Niektórzy twierdzą czasem że iterowanie poprzez przesuwanie wskaźnika jest szybsze bo nie wyliczasz za każdym razem efektywnego adresu, ale to bzdura. Kompilator sam potrafi sobie to ogarnąć a dodatkowo stosowanie wskaźnika do bezpośredniego dostępu do pamięci podnosi ryzyko że kompilator albo potem CPU nie ogarnie że to jest iteracja po bloku pamięci i nie zoptymalizuje dostępu do pamięci.
  3. Celem alokacji na stercie jest po prostu uzyskiwanie dużych bloków pamięci, czego na stosie nie da się osiągnąć.

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