Skocz do zawartości

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Tramwaj z Bombaju

C++ i wskaźniki, definiowanie tablicy o rozmiarze określonym przez użytkownika

Rekomendowane odpowiedzi

Czy ktoś może mi teoretycznie rozłożyć ten zapis:

int *tablica;
tablica = new int [ile];

int w pierwszej linii informuje, że wskaźnik będzie zawierał liczbę całkowitą. * to informacja, że robię wskaźnik, a tablica to jego nazwa.

 

I teraz się tu dziwne rzeczy dzieją, moje źródła wiedzy albo przedstawiają gotową drugą linię, albo coś mgliście wyjaśniają o co kaman. tablica w drugiej linii to poinformowanie, co będzie siedzieć we wskaźniku, new to informacja, że program będzie sobie zajmował pamięć ram, int - co będzie siedzieć w tym ramie, a [] że robię tablicę. Tak ogólnie to te dwie linie mają mi otworzyć tablicę, ale o takim rozmiarze, jaki zdefiniuje użytkownik.

 

Tylko mi coś tu nie pasuje. No bo... po co w ogóle ten wskaźnik? W sensie, on ma wskazywać na coś już zrobionego, a ja przecież nawet nie wiem, jak ta tablica się nazywa - bo jej sam nie zdefiniowałem. No i co to znaczy, że używam znaku =? Że wsadzam do wskaźnika całą tablicę? oO Że wskaźnik jest wskaźnikiem całej tablicy...? Ktoś, coś?

 

A przy okazji:

 

 

    int *tablica;
   tablica = new int [ile];

   for (int i=0; i<ile; i++)
   {
      tablica[i] = i;
   }

W tym zapisie w pętli znajduje się tablica o nazwie "tablica". I teraz to po prostu zbieżność nazw ze wskaźnikiem? Czy zapis przed pętlą tworzy tablicę o nazwie tablica, czyli o takiej samej jak wskaźnik? oO

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wskaźnik nic nie zawiera, tylko wskazuje. Liczba jest zapisana w komórce pamięci, a wskaźnik na nią (komórkę) wskazuje. Więc to:

int *tablica;

tworzy wskaźnik, który wskazuje na jakąś komórkę pamięci, w której oczekujesz, że będzie zapisany int.

 

To:

new int [10];

alokuje gdzieś na RAMie ciągły obszar pamięci, w którym zmieści się 10 intów oraz zwraca wskaźnik do pierwszego z nich.

 

A więc całość:

tablica = new int [10];

Alokuje pamięć dla 10 intów, a wskaźnik do pierwszego z nich zostaje przypisany do zmiennej tablica. Jest ona typu wskaźnikowego, więc wszystko gra i buczy

 

W tym zapisie w pętli znajduje się tablica o nazwie "tablica". I teraz to po prostu zbieżność nazw ze wskaźnikiem? Czy zapis przed pętlą tworzy tablicę o nazwie tablica, czyli o takiej samej jak wskaźnik? oO

Jaka zbieżność? Przecież sam zadeklarowałeś tę zmienną, a w pętli się do niej odwołujesz.

 

Tak przy okazji - zmienna tablicowa to wskaźnik na jej pierwszy element.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

To wiele wyjaśnia. W:

int *tablica;

tablica to nazwa wskaźnika, a w:

tablica = new int [ile];

przypisuję obszar (czyli powstaje tablica) po prawej stronie znaku = wskaźnikowi o nazwie tablica. I teraz ponieważ jest to tablica, to ten wskaźnik jest przypisywany pierwszemu intowi tego obszaru? Pytam, bo w tym zdaniu:

wskaźnik do pierwszego z nich zostaje przypisany do zmiennej tablica
pojawiają się dwa wskaźniki. W sensie, zmienna tablica jest zmienną, którą ja zadeklarowałem (jest to wskaźnik), a "wskaźnik do pierwszego z nich", o którym wspominasz, zostaje przypisany do niej? Trochę to dla mnie niejasne, ten "wskaźnik do pierwszego z nich" to zmienna tablicowa i deklaruje się z automatu, tak?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeszcze raz:

new int[ile];

Alokuje pamięć pod tablicę i zwraca wskaźnik do tej tablicy. Możesz go gdzieś zapisać, ale nie musisz. W powyższym przypadku nie robisz z nim nic, więc w kolejnych linijkach kodu nie masz już do niego dostępu i zaalokowana tablica gdzieś sobie wisi w RAMie - wyciek pamięci.

 

Tutaj "łapiesz" zwrócony wskaźnik i go sobie zapisujesz pod swoją zmienną:

tablica = new int[ile];

 

Ogólnie wywołanie new[] bez zapisania gdzieś referencji do stworzonej tablicy jest bez sensu, bo tracisz możliwość odwołania się do niej.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Trochę to dla mnie niejasne, ten "wskaźnik do pierwszego z nich" to zmienna tablicowa i deklaruje się z automatu, tak?

int tab[10]; masz zadeklarowaną tablicę 10-elementową. Jest to pewien obszar pamięci, gdzie zapisane są int-y i dzięki [] możesz się odwołać do poszczególnych liczb.

Magia jest w tym, że nie podajesz jawnie, że tab jest wskaźnikiem. Jak byś spróbował wypisać zawartość tab (bez nawiasów), to otrzymasz adres pamięci. Jeżeli potraktujesz tab jako wskaźnik i wypiszesz jego zawartość, to otrzymasz pierwszy element tablicy.

Operator [] zwraca zawartość pamięci wskaźnika przesuniętego o podany offset (nasz indeks tablicy).

 

Taki mały przykład

#include <iostream>

using namespace std;

main()
{
int tab[10];

for(int i=0;i<10;++i) tab[i]=11-i;

cout<<tab<<endl;  //wypisze adres początku tablicy
cout<<*tab<<endl; //wypisze to co jest na początku tablicy, czyli pierwszy element
cout<<*(tab+1)<<endl;  //wypisze co jest na drugiej pozycji tablicy: mamy wskaźnik na pamięć [i]tab[/i] powiększony o 1 i odwołujemy się do jego zawartości
cout<<tab[1]<<endl;  //to samo ale z wykorzystaniem []
}

 

Trochę rozjaśniło, czy bardziej zagmatwało?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

tytuł brzmi "Odpowiadanie na C++ i wskaźniki, definiowanie tablicy o rozmiarze określonym przez użytkownika"

 

przykład wygląda tak:

int *tablica;
tablica = new int [ile];

 

tak więc zmień tytuł bo to nie jest C++ tylko C

 

hint: VLA nie jest częścią C++

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Widzę że wziąłeś sobie c++ jako pierwszy język. Z racji że dopiero uczysz się programować, to na Twoim miejscu na chwilę obecną odpuściłbym sobie wskaźniki.

Alokowanie pamięci i operacje na wskaźnikach to względnie niskopoziomowy koncept, do którego najlepiej dojrzeć już w momencie jak się potrafi programować.

U większości początkujących wskaźniki kończą się na wciskaniu * i & w losowych miejscach i przekonaniu, że c++ jest piekielnie trudny i nic w nim się nie da w prosty sposób napisać ;)

 

Jak potrzebujesz tablicy o znanym rozmiarze z góry - użyj std::array. Jak nie znasz i możesz chcieć zmieniać w trakcie - użyj std::vector.

 

No chyba że bardziej chcesz uczyć się samego języka niż programowania - ale jaki to ma sens, jeżeli brak tego drugiego?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

  • Tematy

  • Odpowiedzi

    • Wiem co czujesz 🙂.Ja przy nim prawie pada z kompa wyrwałem.A ile było Pi.....e nie gram to nie zliczysz 😄.Ale najważniejsze że się udało.I masz satysfakcję bo to jeden z najtrudniejszych soulsowych bossow https://ebd.cda.pl/620x368/15092229f8 Patrz to
    • Więc wytłumacz mi jakim cudem bez mierzenia wystarczy odpalić gówno kalibrator HDR WINDOWS i zobaczyć w jakim trybie pokazuje detal na 1000 nit, a w jakim na 570. Potem to samo zrobić w dowolnej grze z kalibracja HDR. I w każdym innym ustawieniu niż HDR + APL HIGH, ustawienie gry na 1080 nit prześwietla obraz. Więc w swoim ustawieniu masz niby 1000 nit z uciętymi w opór detalami. Faktycznie, genialna sprawa A jak ustawisz detale na 570 to on nie ma prawa zaświecić 1000 bo właśnie to ograniczyłeś w ustawieniach.  Ale żeby nie było, zjem i odpalę grę I będę srogo zdziwiony jak nie ujrze przepalonych jasności. 
    • Przy każdej zmianie traci się na tym, że kupuje się nową kartę, a sprzedaje używaną, dlatego częste zmiany są niekorzystne finansowo, chyba że się zmienia używaną na używaną.
    • Intel kompletnie tutaj nie ma sensu raz że to do gier, a dwa że jeszcze do 1440p. Powinieneś skupić się na wydajności GPU i bić po RTX 4070 Ti Super - tutaj możesz trzymać się RTX ale CPU spokojnie brałbym 7500F bo to będzie idealne najlepsze połączenie. Za 7100 zł masz właśnie taki zestaw https://proline.pl/koszyk/2878bd11 a celując w maksa to przy dopłacie za 7500 zł z 7900 XTX https://proline.pl/koszyk/316e8335 
    • 14700F nigdy bym nie brał bo to totalny crap. Dostaniesz zawyżone napięcie, to ten CPU będzie siorbał niesamowicie dużo papu i nic z tym nie zrobisz. Do tego kompletnie nic nie wiesz jakie podzespoły otrzymasz. Druga sprawa, połączenie i7 + RTX 4070S jest dalekie od opłacalnej wydajności w zestawie do gier. Za 9200 zł na gotowo masz https://proline.pl/koszyk/35ad9d7d z Ryzen 7 7700 i RTX 4080 Super albo możesz dać i https://proline.pl/koszyk/8f26d0eb 7800X3D + RX 7900 XTX Office w jakiej wersji? 
  • Aktywni użytkownicy

×
×
  • Dodaj nową pozycję...