Dynamiczne zarządzanie pamięcią - new[]

0

Ostatnio zacząłem bawić się z używaniem obiektów dynamicznych typu new i new[]. Pisze sobie teraz programy uzywając dynamicznych tablic new[]. Działanie programu jest proste: na początku pyta się jak duża ma być tablica, i przypisuje do niej podana wartość. Do takiej tablicy moge odnosić siętylko za pomocą wskaźników. Dalej tworzyłem pętle która przypisywała jakieś tam wartości do wszystkich elementów tej tablicy przez wskaźnik. Wszystko szło jak z płatka do czasu jak nie zacząłem martwić się jak przejść, po tym przypisywaniu wartości do jej pierwszego, zerowego elementu ? Nie moge przecież normalnie nastawić wskaźnika aby pokazywał teraz na zerowy element bo mogę się do tablicy odnosić tylko, właśnie poprzez ten wskaźnik, a to nie działa: wsk = wsk[0] ? Wiem, że to napisałem trochę niejasno więc daje tu kod źródłowy

KOMPILATOR Dev-Cpp 4.9.9.2 //[g++ przyp. q]

/*Do przelicznika test.cpp*/


#include <iostream>
#include <string>

using namespace std;
/****************************************************************************/      

int main()
{       
        
    cout<<"Ile chcesz wykonac obliczen: ";
    int rozmiar;
    cin>>rozmiar;
    cin.ignore();
    
    int *wsk_roz = new int [rozmiar];                                           //wskaźnik pomocniczy dla pętli
    
    int *a, *b, *c, *d;                                                             //definicja czterech wskaźników int
    //przypisanie ich do tablic new[]
    a = new int [rozmiar]; 
    cout<<"*a = "<<*a<<endl;
       
    b = new int [rozmiar];
    cout<<"*b = "<<*b<<endl;
        
    c = new int [rozmiar]; 
    cout<<"*c = "<<*c<<endl;
        
    d = new int [rozmiar];
    cout<<"*d = "<<*d<<endl; 
    //.
    for(int i = 0; i < rozmiar; ++i, ++a, ++b, ++c, ++d)
    {             
        cout<<"\nPodaj zapis ("<< i + 1<<" / "<<rozmiar<<")"<<" : ";
        cin>>*a>>*b>>*c>>*d;                    //przypisanie wskaźnikom konkretnych, podanych wartości
        cin.ignore();
        //Pomiar I
        cout<<"POMIAR I"<<endl;
        cout<<"*a = "<<*a<<endl;
        cout<<"*b = "<<*b<<endl;
        cout<<"*c = "<<*c<<endl;
        cout<<"*d = "<<*d<<endl;

    /* NIEWAŻNE LINIJKI
    cin>>aa>>bb>>cc>>dd;
    cin.ignore();
    *a = aa;
    cout<<"*a = "<<*a<<endl;
    *b = bb;
    *c = cc;
    *d = dd;
    */
    }

    /* NIEWAŻNE LINIJKI
    cout<<"aa = "<<aa<<endl;
    cout<<"bb = "<<bb<<endl;
    cout<<"cc = "<<cc<<endl;
    cout<<"dd = "<<dd<<endl;
    */
    // POMIAR II 
    // wskaźniki wskazuja tu już na ostatnie wartości
    cout<<"POMIAR II"<<endl;
    cout<<"*a = "<<*a<<endl;
    cout<<"*b = "<<*b<<endl;
    cout<<"*c = "<<*c<<endl;
    cout<<"*d = "<<*d<<endl;
       
    cout<<"\nOto zapisane tablice: "<<endl;
    cout<<a[0]<<endl;     //to też nie działa...!!!
    cout<<a[1]<<endl;
    for( int i = 0; i < rozmiar; ++i, a++, b++, c++, d++)
    {
        cout<<"a ["<< i<<"] = "<< *a <<endl;
        cout<<"b ["<< i<<"] = "<< *b <<endl;
        cout<<"c ["<< i<<"] = "<< *c <<endl;
        cout<<"d ["<< i<<"] = "<< *d <<endl;
    }
    
    cout<<"\nA oto zapisane ciagi binarne: "<<endl;
    for( int i = 0; i < rozmiar; ++i)
    {
        cout<< i + 1<<" = "<<a[i]<<" "<<b[i]<<" "<<c[i]<<" "<<d[i]<<endl;        //dziwna sprawa bo dla wskaźnika d nie działa
    }
    
    cout<<"\nUsuwam tablice..."<<endl;
    delete [] a; 
    delete [] b;
    delete [] c; 
    delete [] d;
    delete [] wsk_roz;
    
    cout<<"\nAby zakonczyc dzialanie programu nacisnij Enter"<<endl;
     
    getchar();
    return 0;
}
0

Wskaźnik to tak jak tablica. Np.
"wsk[0]" to to samo co "wsk"
"wsk[1]" to to samo co "
(wsk + 1)" itd.

W C++ nie posługujemy się tablicami jako obiektami, zawsze mamy wskaźniki. Np.
"int tab[20];" - dla kompilatora "tab" to nie tablica tylko wskaźnik const na jej pierwszy element. Wtedy np. "*(tab + 1)" to drugi element tej tablicy, to samo co "tab[1]".

Pisząc funkcję, która jako argument przyjmuje tablicę np. "void fun(int tab[20])" to do funkcji tej nie zostanie przekazana kopia tablicy (co ma miejsce w przypadku zwykłych typów), tak naprawdę przyjmuje ona kopię wskaźnika.

Np. w klasie vector jest już inaczej. Tablica vector jest traktowana jako jeden obiekt w całości, a nie tylko wskaźnik. Przekazując taki vector przez wartość otrzymamy kopię całej tablicy.

0
for(int i = 0; i < rozmiar; ++i, ++a, ++b, ++c, ++d)
    {            
        cout<<"\nPodaj zapis ("<<i + 1<<" / "<<rozmiar<<")"<<" : ";
        cin>>*a>>*b>>*c>>*d;                    //przypisanie wskaźnikom konkretnych, podanych wartości
        cin.ignore();
        //Pomiar I
        cout<<"POMIAR I"<<endl;
        cout<<"*a = "<<*a<<endl;
        cout<<"*b = "<<*b<<endl;
        cout<<"*c = "<<*c<<endl;
        cout<<"*d = "<<*d<<endl;

i chcesz wykonać coś takiego: wsk = wsk[0];
hmm, niepotrzebnie zwiększasz te wskaźniki, ogólnie rzecz biorąc ja jakoś tak mam że uważam, że nie ma sensu wykonywać tych operacji for(...; ++i, ++a, ++b, ++c, ++d)
wystarczy jak podniesiesz tylko i++, a resztę wskaźników niepotrzebnie modyfikujesz, bo możesz do nich zapisywać przez odwoływanie się przez indeks:
cout<<"a["<<i<<"] = "<<a[i]<<endl;
i przez tę całą pętlę nie zmieniać adresów żadnego wskaźnika, ogólnie rzecz biorąc uważam, że jak robisz bufor (tablicę dynamiczną) to już przez całe jej życie nie powinieneś modyfikować jej adresu na pierwszy element, a jedynie odwoływać się przez indeks do poszczególnych elementów, zamiast modyfikować bezwzględnego adresu tej tablicy, chyba, że wcześniej sobie zachowasz ten adres na ten pierwszy element, bo potem nie będziesz mógł za specjalnie wrócić do pierwszej wartości, chyba, że będziesz wiedział ile przeskoków zaszło..
ogólnie rzecz biorąc jak powiedziałem nie modyfikuj adresów, a odwołuj się przez indeksy, chyba, że sobie zachowasz adres na pierwszy element...</i>

0

No tak. Próbowałem też przez te zmienną i odnosić się po wskaźnikach, ale gdy je pokazywałem to niepotrzebnie z * - myślałem, że będzie skakał po adresach wskaźnika bez *. Teraz to działa. Dzięki :-)

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