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

question-closed referencja + wskaźnik C++ (dokładne informacje w treści)

0 głosów
1,565 wizyt
pytanie zadane 16 sierpnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 16 sierpnia 2017 przez Jakub 0

hej, mam dzisiaj proste pytane ,wiem że takim operatorem '&' można pobrać adres zmiennej lub wskaźnika a w tym przypadku :

int n = 10;

int *wsk = &n;

cout<<*&wsk<<endl; 

wyświetlimy adres zmiennej n, będzie taka sama sytuacja jak w przypadku cout<<wsk<<endl; 

Nie rozumiem jednak czemu taki zapis został użyty tu (dodawanie elementów do drzewa binarnego) :

void push(struct node *&korzen,int x) { //tu w argumentach 
	if(korzen==NULL) {
		korzen=(struct node*)malloc(sizeof(struct node));
		korzen->lewy=NULL;
		korzen->prawy=NULL;
		korzen->key=x;
		return;
	} else {
		if(x<korzen->key)
			push(korzen->lewy,x);
		else push(korzen->prawy,x);
	}
}

czy zamiast tego nie możemy napisać po prostu 'node **korzen' (wskaźnika drugiego stopnia) . Dziękuje za pomoc :) a jak coś jest nie jasne to piszcie ...

komentarz zamknięcia: Już znam odpowiedź

2 odpowiedzi

+2 głosów
odpowiedź 16 sierpnia 2017 przez PoetaKodu Stary wyjadacz (10,990 p.)
edycja 16 sierpnia 2017 przez PoetaKodu
 
Najlepsza

W tym przypadku 'korzen' to referencja na wskaźnik, co daje Ci możliwość używania 'korzen' jak zwykły pojedynczy wskaźnik, z tym tylko, że możesz go modyfikować i te zmiany wpłyną na oryginał przekazany do funkcji.

A na pytanie

czy zamiast tego nie możemy napisać po prostu 'node **korzen'

można odpowiedzieć tak: można, ale jest to taka sama sytuacja jak ta:

void fooRef(int &abc)
{
    abc = 100;
}

void fooPtr(int *abc)
{
    if(abc)
        *abc = 100;
}

Możesz wybrać dowolną z tych dwóch metod. W pierwszej będzie wymagane podanie prawidłowego parametru a w drugiej możesz podać po prostu nullptr.

komentarz 16 sierpnia 2017 przez Jakub 0 Pasjonat (23,120 p.)
dzięki za pomoc ,jednak referencja jest lepsza od "podwójnego wskaźnika" ... . Mam tylko jedno pytanie, co oznacz nullptr ? (Wiem co oznacza samo null)
1
komentarz 16 sierpnia 2017 przez PoetaKodu Stary wyjadacz (10,990 p.)
nullptr jest nowym słowem kluczowym dodanym do C++11 oznaczającym po prostu pusty wskaźnik (wyzerowany). Wcześniej używało się

#define NULL 0

Jeszcze z języka C ale postanowiono to rozwiązać lepiej - właśnie za pomocą nullptr.
komentarz 16 sierpnia 2017 przez Jakub 0 Pasjonat (23,120 p.)
Dzięki
+2 głosów
odpowiedź 16 sierpnia 2017 przez j23 Mędrzec (195,220 p.)

Odpowiedz sobie na proste pytanie: który zapis jest czytelniejszy? Ten, który masz teraz, czy taki:

void push(struct node **korzen,int x) { 
    if(*korzen==NULL) {
        *korzen=(struct node*)malloc(sizeof(struct node));
        (*korzen)->lewy=NULL;
        (*korzen)->prawy=NULL;
        (*korzen)->key=x;
        return;
...

Użycie referencji daje także gwarancję, że wskaźnik korzen istnieje.

 

PS. w C nie ma przekazywania argumentów przez referencję.

Podobne pytania

0 głosów
2 odpowiedzi 1,628 wizyt
pytanie zadane 7 grudnia 2017 w C i C++ przez Mihost Nowicjusz (240 p.)
0 głosów
1 odpowiedź 2,078 wizyt
pytanie zadane 25 sierpnia 2019 w C i C++ przez DamianW Bywalec (2,080 p.)
0 głosów
2 odpowiedzi 1,643 wizyt
pytanie zadane 21 lutego 2016 w C i C++ przez dichloroetylobenzen Użytkownik (850 p.)

93,604 zapytań

142,526 odpowiedzi

322,991 komentarzy

63,088 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

Kursy INF.02 i INF.03
...