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

Wskaźniki c++

Object Storage Arubacloud
0 głosów
312 wizyt
pytanie zadane 21 lipca 2018 w C i C++ przez Nowacx02 Obywatel (1,060 p.)
edycja 21 lipca 2018 przez Nowacx02

Witam dlaczego w tym kodzie gdy napisze się begin bez gwazdki to zadziała? Wytłumaczyłby by mi ktoś kiedy używa się wskaźników bez gwiazdek? Chodzi o funkcje sortuj.
 

#include <iostream>

using namespace std;

void sortuj(int* begin, int* end)
{
   for (int i=0; i<9; i++)
        for (int j=0; j<9; j++)
            if (begin[j]>begin[j+1])
                swap(begin[j], begin[j+1]);

 for (int i=0; i<10; i++)
   {
     cout<<*begin<<" "; begin++;
   }

}

int main()
{
    int tab[ 10 ] = { 0, 9, 1, 3, 8, 2, 6, 7, 5, 4 };
    sortuj( tab, tab + 10 );
    wypisz( tab, 10 );

    return 0;
}

 

komentarz 21 lipca 2018 przez RafalS VIP (122,820 p.)

begin bez gwazdki

O którym miejscu mówisz. begin występuje z gwiazdką i bez w różnych miejscach. 

komentarz 21 lipca 2018 przez Nowacx02 Obywatel (1,060 p.)
w funkcji sortuj
komentarz 21 lipca 2018 przez Nowacx02 Obywatel (1,060 p.)
konkretnie w if i w swap
komentarz 21 lipca 2018 przez RafalS VIP (122,820 p.)
begin[j] == *(begin+j)

Więc generalnie jest tam gwiazdka, ale dla tablic jest taki uproszczony zapis, żeby to jakoś wyglądało

2 odpowiedzi

+1 głos
odpowiedź 21 lipca 2018 przez profesorek96 Szeryf (91,420 p.)

Tablice do funkcji możesz przekazywać w taki sposób:

int tab[]

Lub jako wskaźnik:

int *tab

Ty w tym kodzie robisz nic innego jak przekazujesz wskaźnik na element o indeksie 0 w begin i na ostatni element tablicy w end.

Kolejna kwestia jest taka że operator [] używany przy tablicach to inaczej operator derefernecji i zapis:

*(tab+1)==tab[1]

 

+1 głos
odpowiedź 21 lipca 2018 przez Erodio Nowicjusz (160 p.)
Wszystko masz przejrzyście opowiedziane w odc. o wskaźnikach Mirosława Zelenta w kursie c++...

Ale zasada jest prosta!

- przy deklaracji używasz gwiazdki by program wiedział że chodzi ci o wskaźnik.

-kiedy chcesz pracować na tym co wskaźnik wskazuje, używasz gwiazdki przy wskaźniku.

-natomiast jeżeli chcesz pracować na adresie komórki ram który przypisany jest do danej wartości w pamięci komputera, używaj wskaźnika bez gwiazdki. np. adresy komórek w tablicy intów, charów itd.są ściśle do siebie przystające dlatego używając zwrotu np wskaźnik++(bez gwiazdki)to wtedy zacznie wskazywać na kolejny element w tablicy.

Mimo wszystko odsyłam do tego filmu: Kurs C++ odc. 10: Wskaźniki. Dynamiczne alokowanie pamięci
komentarz 21 lipca 2018 przez Erodio Nowicjusz (160 p.)
(Wskaźnik jest zmienną która zawiera adres komórki ram danej wartości),nawet na wskaźnika może wskazywać wskaźnik...

Pozdrawiam!
komentarz 21 lipca 2018 przez Nowacx02 Obywatel (1,060 p.)

@Erodio, Nie wiem czy chcę się uczyć od Pana Zelenta słyszałem opinie, że uczy złych i starych nawyków

komentarz 21 lipca 2018 przez Piotr Lis Obywatel (1,310 p.)
To że "słyszałeś" nie znaczy, że tak jest, a warto mieć własną opinię - to po pierwsze. Po drugie wcale nie musisz brać do serca każdej literki, którą Pan Mirosław napisze na ekranie. Odcinki są zrealizowane wspaniale głównie pod aspektem merytorycznym i naprawdę wszystko obrazowo i ciekawie zostało wytłumaczone. A co do starych i złych nawyków - mógłbyś zaprezentować? Bedąc szczerym cała moja nauka programowania "na poważnie" zaczęła się właśnie od tego i nie mam zielonego pojęcia o jakich nawykach mówisz...
komentarz 21 lipca 2018 przez nantl Nowicjusz (200 p.)
Jak ma mieć własną opinie, jak nie jest w stanie ocenić tych kursów pod względem merytorycznym, z powodu braku wiedzy? Osoba początkująca kurs może oceniać jedynie pod względem przystępności materiału, a to połowa oceny.
komentarz 21 lipca 2018 przez nantl Nowicjusz (200 p.)

@Piotr Lis, jeśli chodzi o kurs, to tu jest opinia jednego z najbardziej szanowanych programistów c++ w polsce: https://www.wykop.pl/link/3830835/comment/47002277/#comment-47002277

komentarz 21 lipca 2018 przez VirtualMember Pasjonat (15,790 p.)
2) oraz 3) się zgadzam, ale mówienie, że uczenie raw pointerów jest do d*py skoro są smartpointery to argument inwalida i jestem w stanie bronić tego stanowiska. Pzdr.
komentarz 21 lipca 2018 przez mokrowski Mędrzec (155,460 p.)
Oczywiście. Zacznijmy od uczenia wskaźników. Cel jasny. Zniechęcić, frustrować, pokazać jakie to trudne... Zamiast nauczyć wysokopoziomowego myślenia abstrakcyjnego, RAII, wszechobecnego konstruktora/destruktora, polimorfizmu (na referencjach działa) i dopiero po jakimś czasie, dla chętnych, dla tych który chcą ... pokazać techniki na poziomie "jak się nie da to można tak pamiętając o konsekwencjach". Oczywiście jeszcze inną kategorią jest embedded. Ale tu obecnie bez znajomości szablonów nie ma czego szukać. W C++ traktowanym jako "C z klasami" nie powstaje nic z jakimkolwiek sensem.

IMHO ten slajd pokazuje co jest rzeczą najważniejszą w C++: https://youtu.be/ltCgzYcpFUI?t=1323 i to jest rdzeń nauczania.

Czas skończyć z uczeniem "C z klasami":

https://www.youtube.com/watch?v=YnWhqhNdYyk

Straciłem wiele przez to że słuchałem nauczycieli idiotów rozpoczynających 2-3 wykład od wskaźników, optymalizacji zmiany 2 zmiennych przez operację xor oraz mnożenia przez potęgę 2 poprzez przesunięcie (o innych sposobach "chytrej baby z Radomia" nie będę wspominał). Teraz wiem z jakiego powodu. Po prostu zatrzymali się we własnym rozwoju i często nie mieli doświadczenia innego niż wykładowe.
komentarz 21 lipca 2018 przez VirtualMember Pasjonat (15,790 p.)
Rozpoczęcie nauki od wskaźników to poroniony pomysł. Jestem zwolennikiem przechodzenia od podstaw do wyższych poziomów abstrakcji w celu głębokiego zrozumienia tego, co i jak się odbywa. Tak jak i jestem zwolennikiem chociażby rozpoczęcia nauki od normalnych tablic a dopiero później rozpoczęcia zabawy z kontenerami od STL, tak samo warto poznać problemy raw pointerów, nieostrożne obcowanie z nimi, które powodują wycieki pamięci by móc w pełni świadomie korzystać z mocy smart pointerów. Nikt nie mówi by molestować człowieka rawami tak by nimi wymiotował i na prawdę, nie róbmy z siebie męczenników, nikomu od przejścia lekcji z pointerów korona z głowy nie spadła, nawet jeśli niektórzy mieli problem z ich zrozumieniem.

Podobne pytania

0 głosów
1 odpowiedź 162 wizyt
pytanie zadane 25 stycznia 2022 w C i C++ przez Author[] Gaduła (3,130 p.)
0 głosów
1 odpowiedź 656 wizyt
pytanie zadane 30 kwietnia 2020 w C i C++ przez Eriss69 Gaduła (4,470 p.)
0 głosów
1 odpowiedź 847 wizyt

92,548 zapytań

141,390 odpowiedzi

319,509 komentarzy

61,932 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...