Dynamiczna alokacja tablicy

0

Cześć ponownie, otóż mam problem. W książce najprostszy program aby pokazać działanie tworzenia dynamicznego tablic i wpisania do nich wartości wygląda tak jak niżej.(Oprócz forów - sam chciałem sprawdzić czy działa). Kiedy wypisuję wartości za pomocą poniższego couta wychodzą dziwne numery zamiast "7". Dziwne jest też to, że jak stosuję zapis *tablica a tablica[i] to też inaczej wygląda output. O co tu chodzi?

#include <iostream>

using namespace std;

int main()
{
    cout << "Hello world!" << endl;
     /*********************************** DYNAMICZNA ALOKACJA TABLICY ***********************************/
        cout << "Podaj ilosc elementow tablicy: ";
    int rozm;
        cin >> rozm;
    int *tablica = new int [rozm];

    for(int i=0; i<rozm;i++, tablica++)
    {
        *tablica = 7;   //lub tablica[i]
    }

    for(int i=0; i<rozm;i++, tablica++)
    {
        cout << "el. " << i << ") : " << *tablica << endl;   // lub tablica[i]
    }

    delete [] tablica;

    return 0;
}

2

Jeśli zrobimy sobie

    int *tablica = new int [rozm];
    int *orig_tablica = tablica;

to jak myślisz, jaką wartość ma orig_tablica - tablica po końcu pętli wypisującej?

2

jak kroczysz tablicą ++ to potem wskaźnik już nie wskazuje tego, co najpierw.
Każda kolejna czynność, a szczególnie wywołanie delete w takim kontekście jest znacznym błędem

Już w poprzednim poście widziałem, ze strasznie nadużywasz arytmetyki wskazników (gwiazdki, nawiasy).
To 30 lat temu "podobno" prowadziło do wydajniejszego kodu, najczęsciej nie ma sensu i służy udawaniu "jakim jestem chakierem".
Używaj notacji tablicowej tab[i] - wszystkie liczne błedy jakie tu są, znikną w mgnieniu oka.

0

@enedil: orig_tablica to wskaznik posiadajacy adres na ktory pokazuje wskaznik tablica czyli po koncu petli bedzie miał wartość liczbową adresu ostatniego elementu tablicy. Tak?

1

@NewbieKodeRR: właśnie nie. orig_tablica się nie zmieni, to nadal będzie wskaźnik na tablicę, tak jak była na początku. Natomiast tablica - orig_tablica, chciałoby się żeby było długością tablicy (liczba elementów pomiędzy oboma takimi wskaźnikami). U Ciebie jest jednak inaczej, będzie to dwukrotność wielkości tablicy.

0

@enedil: Nie rozumiem, jak masz powiedzmy

int *wsk1, *wsk2;
wsk1=new int;
wsk2=new int;
wsk1 = wsk2;   // tutaj wsk1 teraz pokazuje na obiekt co wsk2

, tak samo jak u Ciebie orig tablica czemu nie pokazuje na ten sam element co wskaznik "tablica"?.
Chodzi o to ze powinienem innym wskaznikiem latać po tablicy? Bo wskaznik (tablica) ktory pokazuje na nowoutworzoną tablice bez nazwy nie moze sie po niej poruszac czy potem trzeba go cofać znów na początek?

2

@NewbieKodeRR:

int *wsk1, *wsk2;
wsk1=new int[1000000000ULL];
wsk2=new int[1000000000ULL];
wsk1 = wsk2;   // tutaj wsk1 teraz pokazuje na obiekt co wsk2

wsk2++;
wsk2++;
wsk2++;
// a tutaj wsk2 już nie pokazuje na ten sam obiekt co wsk1.

ogólnie tak, o to chodzi, że modyfikujesz wskaźnik na tablicę, i powinieneś go "cofać" (albo w ogóle najlepiej nie podróżować w ten sposób)

0

@enedil: A jak mozna cofnąć taki wskaznik ktory pokazuje na bezimienną tablice? tablica=&tablica[0]? Bo jeśli tak to rownie dobrze mogę napisać tablica=tablica, a to nie bedzie dzialac bo aktualnie powiedzmy ze pokazuje na jakiś 7 element.

2

Możesz odjąć albo zapamiętać oryginalny wskaźnik.

0

Już rozumiem, dzięki wielkie :))

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