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

Kopie/Oryginał referencj

Object Storage Arubacloud
0 głosów
189 wizyt
pytanie zadane 5 lipca 2015 w C i C++ przez Wiciorny Ekspert (270,770 p.)
Witajce. Jestem dosyć ciekawski i w wielu takich sprawach szukam ... rozwinięcia rozumowania dla Siebie/ innych.

Generalnie podczas referencji mamy doczynienia jak wiemy z oryginalnymi danymi, a nie kopią.

Moje pytanie jest takie, ( odnosi się np. do przykładu tutaj z filmu Pana Mirosława https://youtu.be/0DQl74alJzw

dlaczego- podczas używania Oryginału, zapisując  np do wskaźnika tab*=999; otrzymamy we wszystkich wartosciach to 999, natomiast pracując na kopiach otrzymamy to co siedzi w Main czyli inne wartosci, a te zostana pominięte?

Nasuwa mi się odpowiedź, że skoro "funkcje" działaja jako programy osobne mozna tak powiedziec, a razem tworza jeden wiekszy, to ze Main wypisujac w cout<< wartosc sredniej np. korzysta z danych ktore ma w swoim ciele :). Dzieki w sumie za jakies objasnienie tego ( nie tylko co do tego przykladu ), ale ogolnie sensu - dlaczego to tak dziala, ze oryginal sie podmieni

1 odpowiedź

+5 głosów
odpowiedź 5 lipca 2015 przez Buby Pasjonat (19,590 p.)
wybrane 5 lipca 2015 przez Wiciorny
 
Najlepsza
Spróbuje opowiedzieć Ci to w sposób łopatologiczny, bo takie rozumowanie najbardziej przypadło mi do gustu.

Jak zapewne wiesz, referencja jest aliasem do zmiennej, czyli taką ksywką, dzięki której nie kopiujemy danych tylko pracujemy na oryginale, bo odnosimy się do tej samej rzeczy, korzystając z jej alternatywnej nazwy. Gdy funkcja, czyli podprogram oczekuje jako parametru referencji, to możesz to sobie porównać do poznania kogoś nowego, po przezwisku, nie znając jego imienia. Idąc tym tokiem rozumowania, cokolwiek powiesz komuś, czy to po jego ksywce, czy imieniu zawsze będzie to ta sama osoba. Dlatego też, gdy przekazujesz zmienną do funkcji jako referencję, to pracujesz na oryginalnych danych, bo cokolwiek zrobisz ze zmienną po jej alternatywnej nazwie, będzie to dotyczyć jej samej.

Wskaźniki działają bardzo podobnie, a właściwie referencje są ich następcami. Różnica jest taka, że do wskaźnika zapisujemy adres naszej szufladki w pamięci, w której siedzą nasze dane. Kiedy przekazujemy do funkcji ten adres, to cały czas operujemy na tej samej szufladcce i tych samych danych. Różnicą jest konieczność używania operatora wyłuskania - możesz to sobie wyobrazić w oparciu o ten przykład: nasze adresy, to ponazywane nazwiskami autorów książek szufladki w bibliotece. Aby otworzyć szufladę i przejrzeć spis dzieł autora musimy pociągnąć za uchwyt. Tym uchwytem w języku C++ jest operator wyłuskania, czyli gwiazdka. Referencja jest po prostu wygodniejsza w użyciu. Poza tym możemy utworzyć referencję stałą, która przekaże dane do funkcji bez kopiowania, czyli zaoszczędzimy na pamięci, ale będą one tylko w trybie do odczytu.

Co do ostatniego pytania to tak - main wypisując dane korzysta w pierwszej kolejności ze zmiennych o jej zasięgu lokalnym, czyli wewnątrz funkcji. Jeśli nie odnajdzie zmiennej o zasięgu lokalny to spróbuje skorzystać ze zmiennej o zasięgu globalnym, czyli deklarowanej poza jakąkolwiek funkcją. Jeśli takowej nie odnajdzie kompilator zgłosi błąd.

Być może w jakiś sposób rozjaśniłem Ci to zagadnienie.

Pozdrawiam! ;)

Podobne pytania

0 głosów
1 odpowiedź 548 wizyt
pytanie zadane 21 lipca 2020 w C i C++ przez Kacperek_code Obywatel (1,690 p.)
0 głosów
1 odpowiedź 490 wizyt
pytanie zadane 28 kwietnia 2020 w C i C++ przez Adrian Maj Nowicjusz (160 p.)

92,626 zapytań

141,486 odpowiedzi

319,844 komentarzy

62,009 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!

...