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

Argument - wskaźnik a referencja

Konferencja JOIN! 2018
0 głosów
134 wizyt
pytanie zadane 7 grudnia 2017 w C i C++ przez Mihost Nowicjusz (240 p.)

Witam,

jaka jest różnica w przekazywaniu do funkcji jako argumentu: referencji a wskaźnika?

To znaczy czym różni się to:

void funkcja(int &x) {
	return;
}

int main()
{
	int zmienna;
	funkcja(zmienna);

	system("pause");

	return 0;
}

Od takiego zapisu: 

void funkcja(int *x) {
	return;
}

int main()
{
	int zmienna;
	funkcja(&zmienna);

	system("pause");

	return 0;
}

Pytam, ponieważ spotkałem się ze stwierdzeniem iż nie ma to żadnej różnicy.

2 odpowiedzi

+1 głos
odpowiedź 7 grudnia 2017 przez obl Nałogowiec (43,740 p.)
wybrane 7 grudnia 2017 przez Mihost
 
Najlepsza

Gdyby funkcja była taka:

void funkcja(int x);

to oznaczałoby, że zmienna podana jako argument zostanie skopiowana. Gdy robisz funkcję z referencją wtedy funkcja nie tworzy kopii zmiennej a działa na tej samej zmiennej i może zmieniać jej wartość. Np.

void funkcja(int &x){
    x ++;
}

int main(){
    int x = 0;
    cout << x << endl;
    funkcja(x);
    cout << x << endl;
    return 0;
}

to wynik kodu będzie mniej więcej taki:

0
1

Co oznacza, że zmienna została w funkcji zmodyfikowana. Przez wskaźnik działało by to podobnie:

void funkcja(int *x){
    *x ++;
}

int main()
    int x = 0;
    cout << x << endl;
    funkcja(&zmienna);
    cout << x << endl;
}

Efekt ten sam co w funkcji z referencją, ale tutaj musisz przekazać wskaźnik na zmienną typu int. W rezultacie tworzona jest kopia wskaźnika typu int.

Przekazywanie argumentów przez referencje często stosuje się przy przekazywaniu dużych obiektów klas, których kopiowanie byłoby czasochłonne. Można też celowo określić, że chociaż obiekt jest przekazywany przez referencje to nie chcesz aby uległ on modyfikacji w takim przypadku stosuje się słowo kluczowe const:

void funkcja(const int &x){
}

powyższa funkcja nie może modyfikować zmiennej x.

+2 głosów
odpowiedź 7 grudnia 2017 przez Ehlert VIP (141,270 p.)
  • You can't assign NULL to a reference. This is a crucial difference and the main reason you'd prefer one over the other.
  • When you take the address of a pointer, you get the address of the pointer variable. When you take the address of a reference, you get the address of the variable being referred to.
  • You can't reassign a reference. Once it is initialized it points to the same object for its entire life.

 https://stackoverflow.com/questions/620604/difference-between-a-pointer-and-reference-parameter

komentarz 7 grudnia 2017 przez Ehlert VIP (141,270 p.)
Polecam również sprawdzić prędkość. W jakiejś duuużej pętli zrób wywołania.

Podobne pytania

0 głosów
2 odpowiedzi 225 wizyt
pytanie zadane 16 sierpnia 2017 w C i C++ przez Jakub 0 Stary wyjadacz (10,400 p.)
0 głosów
2 odpowiedzi 3,343 wizyt
pytanie zadane 10 czerwca 2015 w C i C++ przez Ins0mniaC Obywatel (1,350 p.)
0 głosów
2 odpowiedzi 233 wizyt
pytanie zadane 21 lutego 2016 w C i C++ przez dichloroetylobenzen Użytkownik (850 p.)
Porady nie od parady
Pytania na temat serwisu SPOJ należy zadawać z odpowiednią kategorią dotyczącą tej strony.SPOJ

55,235 zapytań

99,529 odpowiedzi

204,778 komentarzy

27,217 pasjonatów

Przeglądających: 216
Pasjonatów: 5 Gości: 211

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.

...