• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dynamiczne alokowanie pamięci - pełne zrozumienie

0 głosów
173 wizyt
pytanie zadane 22 marca 2017 w C i C++ przez MatMarci Początkujący (260 p.)

Witam, 

Wydaję mi się, iż zrozumiałem i rozkminiłem dynamiczne alokowanie pamięci.

Proszę o weryfikację mojej dumy. Z góry dziękuję!

#include <iostream>
#include <iomanip>

using namespace std;

int ile;

int main()
{
    cout << "Ile liczb w tablicy: " << endl;
    cin>>ile;

    int *tablica;                                 //mówię iż zaraz będę rezerwował nowy obszar o konkretnych wymiarach
    tablica=new int [ile];                 //rezerwuję nowy obszar o wymiarach 'ile'
    int *a;                                          //tworze zmienną pomocniczą 'a', tylko dla możliwości odczytu adresu w pamięci komórek

    for(int i=0; i<ile; i++)                //pętla powtarzana 'ile' razy
    {
        cin>>tablica[i];                      //wczytanie wartości z klawiatury do poszczególnych elementów tablicy
        cout<<endl;

        a=&tablica[i];                         //przypisanie zmiennej pomocniczej 'a' adresu w pamięci poszczególnych elementów tablicy
        cout<<a <<endl;                   //pokazanie wartości adresu poszczególnych komórek  16-kowo
        cout<< (int)a <<endl;           //pokazanie wartości adresu poszczególnych komórek zamienione z 16-kowego na 10-tne
        cout<<*a <<endl;                 //pokazanie wartości, która znajduję się pod konkretnym adresem
    }

    delete [] tablica;

    return 0;
}

 

3 odpowiedzi

+2 głosów
odpowiedź 22 marca 2017 przez Piter10p Bywalec (2,340 p.)
Te komentarze nie są potrzebne. Tylko drażnią i skupiają na sobie wzrok nie wnosząc nic konstruktywnego.

"//pętla powtarzana 'ile' razy" Przecież widzę.

Wybacz za krytykę. Ale te komentarze są zbędne. Naprawdę.

Kod zadziała, owszem. Wygląda też całkiem ładnie choć ten wskaźnik a jest zbędny. Dużo ciekawiej by było jakbyś uczył się bezpośrednio operować na tablicy :)

Inną drogą... W rzeczywistości dynamiczna alokacja przyda ci się tak naprawdę dopiero w podejściu obiektowym i większych projektach.

Pozdrawiam
komentarz 22 marca 2017 przez MatMarci Początkujący (260 p.)
Dzięki za odpowiedz.

Masz rację, z tym opisem pętli for to przesadziłem. A pozostałem komentarze pozwalały mi zrozumieć istotę podejścia.

Napisałem o tym natomiast ponieważ rozwiązywałem zadanie na SPOJ-u i trzeba było użyć dynamicznej tablicy i ni hu hu mi nie szło.

Pozdrawiam!
komentarz 22 marca 2017 przez unknown Nałogowiec (39,480 p.)

W rzeczywistości dynamiczna alokacja przyda ci się tak naprawdę dopiero w podejściu obiektowym i większych projektach.

 W rzeczywistości nie używa się new/delete

komentarz 22 marca 2017 przez MatMarci Początkujący (260 p.)
Rozumiem, że mówisz o innym bardziej zaawansowanym sposobie zapisu dynamicznej alokacji?
komentarz 24 marca 2017 przez Piter10p Bywalec (2,340 p.)
Osobiście kilka razy zdarzyło mi się ich użyć. Szczególnie jak przesiadałem się z powrotem z c# na c++ ;)
+1 głos
odpowiedź 22 marca 2017 przez Knayder Nałogowiec (35,230 p.)
a = &tablica[i];  //Przekombinowane

a = tablica + i; //Lepiej i ładniej tak

 

komentarz 22 marca 2017 przez MatMarci Początkujący (260 p.)

Rozumiem, że :

a = tablica + i;

wystarczy, ponieważ w tym przypadku samo 'tablica' odwołuję się domyślnie do miejsca w pamięci 0 komórki całej dynamicznej tablicy?

Ja użyłem '&', żeby właśnie dla potrzeb przykładu odwołać się najpierw do miejsca w pamięci, a później do wartości z tego miejsca w pamięci.

Pozdrawiam!

1
komentarz 22 marca 2017 przez Knayder Nałogowiec (35,230 p.)
Tak, samo tablica to wskaźnik na pierwszy element tablicy. Dodawanie liczby o wartości 'n' zwróci nam wskaźnik na n-ty element.
1
komentarz 22 marca 2017 przez Antero00 Bywalec (2,800 p.)
Zapamiętaj, że " Nazwa tablicy jest równocześnie adresem jej zerowego elementu " :)
komentarz 22 marca 2017 przez unknown Nałogowiec (39,480 p.)

Nazwa tablicy jest równocześnie adresem jej zerowego elementu 

 Nie jest. Nazwa tablicy to nazwa tablicy. W niektórych przypadkach zachodzi niejawna konwersja na wskaźnik na 1 element tablicy.

komentarz 25 marca 2017 przez QizmoPL Stary wyjadacz (11,580 p.)
Podasz jakis dowod/przyklad?
komentarz 25 marca 2017 przez unknown Nałogowiec (39,480 p.)

C++17 §4.2/1

An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be converted to a prvalue of type “pointer to T”. The temporary materialization conversion (4.4) is applied. The result is a pointer to the first element of the array.

0 głosów
odpowiedź 25 marca 2017 przez MatMarci Początkujący (260 p.)

Już sporo mi pomogliści i uświadomiliście, iż nie jedno rozwiązanie jest prawidłowe, nie mówiąc o tym, że można zapisywać wiele rzeczy bardziej klarownie. 

A co sądzicie o mojej deklaracji tablicy 2 wymiarowej? 

Ocenicie moje rozwiązanie?

#include <iostream>

using namespace std;

int w=2,k; // k - ilosc partii, w - liczba graczy, w tyl przypadku 2
int r1;

int main()
{
    cin>>k;

    //stworz i wypełnij
    int **tab_zet;
    tab_zet = new int *[k];
    for (int i=0; i<k; i++)
    {
        tab_zet [i] = new int [w];
        for (int j=0; j<w; j++)
        {
            cin>>tab_zet[i][j];
        }
    }

    //wypisz
    for (int z=0; z<k;z++, cout<<endl)
    {
        for (int y=0; y<w; y++)
        {
            cout<<tab_zet[z][y];
        }
    }

    //zniszcz tab2
    for ( int i(0); i < k; ++i )
    delete [] tab_zet[i];
    delete [] tab_zet; 
    tab_zet = NULL;

    return 0;
}

 

Podobne pytania

0 głosów
2 odpowiedzi 124 wizyt
pytanie zadane 10 stycznia 2017 w C i C++ przez czujek22 Mądrala (5,840 p.)
0 głosów
2 odpowiedzi 606 wizyt
pytanie zadane 26 stycznia 2017 w Java przez Jonbi2 Dyskutant (8,260 p.)
Porady nie od parady
Publikując kody źródłowe korzystaj ze specjalnego bloczku koloryzującego składnię (przycisk z napisem code w edytorze). Nie zapomnij o ustawieniu odpowiedniego języka z rozwijanego menu oraz czytelnym formatowaniu kodu.
Ciekawy innych porad? Odwiedź tę stronę!

48,556 zapytań

90,186 odpowiedzi

181,559 komentarzy

23,506 pasjonatów

Przeglądających: 195
Pasjonatów: 13 Gości: 182

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...