Tablica dynamiczna, jak się odwołać za pomocą wskaźnika?

0

Cześć, mam problem ze zrozumieniem tablicy dynamicznej w C++.

Otóż załóżmy , że tworzę taką tablicę:

int* tablica = new int [50];

Teraz jak się odwołać za pomocą wskaźnika do 5tego elementu tablicy?

*(tablica+5)

czy tablica[5]

? Które z tych to wskaźnik?

Jeżeli wskaźniki przyśpieszają program, to która pętla się szybciej wykona, np:

```cpp
for (int i=0; i<1000000000; i++)
*(tablica+i)=i;

czy

for (int i=0; i<1000000000; i++)
tablica[i]=i;

A może to jedno i to samo? Hmmmm, bardzo proszę o pomoc.

3

Wskaźnikiem jest tablica. Wskaźniki nie przyspieszają programu. Ani go nie spowalniają. a[b] to cukier syntaktyczny dla *(a+b) (pomijając przeładowanie operatora).

3
  1. To pierwsze to odwołanie za pomocą wskaźnika.
  2. Wskaźniki niczego nie przyspieszają, ba wręcz przeciwnie, mogą utrudniać użycie cache przez procesor.
  3. Kompilator zrobi z tego dwie identyczne pętle.

Niektórzy mogą twierdzić że przesuwanie tego wskaźnika i odwoływanie sie do elementu będzie szybsze, bo przecież nie trzeba wyliczać za każdym razem adresu tablica+i ale to bzdura bo inkrementacja wskaźnika i tak wykonuje dodawanie. No i kompilator spokojnie też sobie z tym poradzi.

1

Jeśli martwisz się o wydajność to proponuję zamienić i++ na ++i. Ma to ogromne znaczenie w niektórych przypadkach.

1

To ja powiem w ramach ciekawostki, że korzystając z przemienności dodawania można napisać:

for (int i=0; i<1000000000; i++)
i[tablica]=i;

Na dowód mały przykład :)
https://ideone.com/zfQPxc

0

Czyli mierzenie czasu dla takich pętli jest idiotyzmem, skoro kompilator i tak zrobi z tego dwie identyczne pętle. Dostałem podobne zadanie do wykonania i zawsze miałem takie same czasy, a dla dużych liczb program się wysypywał. Teraz rozumiem, że to bez znaczenia.

Czyli wskaźniki przydają się do tablicy tylko wtedy jak chcemy dynamicznie alokować pamięć? Nie widzę innego zastosowania póki co :P

Dzięki wielkie za pomoc :)

1

Nie. Jak chcemy dynamicznie alokować pamięć to używamy std::vector<> bądź innego kontenera w zależności od potrzeby. Wskaźniki są potrzebne do pisania low-level/interakcji z API w C.

3

Przydają się też jeśli chcesz wskazać jakiś element, ale nie wiesz który, lub z jakiego zbioru.

Jeśli już przy tym jesteśmy: nie używaj nagiego new/delete jeśli nie musisz (a nie musisz). Biblioteka standardowa ma wszelkiego rodzaju kontenery, a zamiast głupich wskaźników masz w niej wskaźniki mądre: unique_ptr i shared_ptr.

Co do identycznego kodu: szczerze polecam zabawę z http://gcc.godbolt.org

0

Rozumiem, dziękuje za rozwianie wątpliwości. Po prostu miałem wykonać program, który obliczy czas wykonywania sporych obliczeń w pętli, raz z użyciem wskaźników, a następnie bez nich. Wyniki wychodziły mieszane, więc myślałem, że robię coś źle. Jeszcze raz dzięki ;)

1

Jeśli napisałeś to w ten sposób to na pewno nie będzie różnicy, bo nawet w kodzie jej nie ma. Mógłybś napisać:

int* wsk = tablica;
for (int i=0; i<1000000000; i++)
*(wsk++)=i;

i wtedy faktycznie poruszałbyś się wskaźnikiem, ale różnicy w czasie wykonania bym sie nie spodziewał ;]

0
fearlay napisał(a):

Cześć, mam problem ze zrozumieniem tablicy dynamicznej w C++.

Otóż załóżmy , że tworzę taką tablicę:

int* tablica = new int [50];

Teraz jak się odwołać za pomocą wskaźnika do 5tego elementu tablicy?

*(tablica+5)

czy tablica[5]

? Które z tych to wskaźnik?
> 
> Jeżeli wskaźniki przyśpieszają program, to która pętla się szybciej wykona, np:
> 
> 
```cpp
for (int i=0; i<1000000000; i++)
*(tablica+i)=i;

czy

for (int i=0; i<1000000000; i++)
tablica[i]=i;

A może to jedno i to samo? Hmmmm, bardzo proszę o pomoc.

To jest to samo.

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