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

Argument - wskaźnik a referencja

VPS Starter Arubacloud
0 głosów
1,167 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 Maniak (51,280 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 Ekspert (212,630 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 Ekspert (212,630 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 1,242 wizyt
0 głosów
1 odpowiedź 1,356 wizyt
pytanie zadane 25 sierpnia 2019 w C i C++ przez DamianW Bywalec (2,080 p.)
0 głosów
2 odpowiedzi 14,799 wizyt
pytanie zadane 10 czerwca 2015 w C i C++ przez Ins0mniaC Obywatel (1,400 p.)

92,452 zapytań

141,262 odpowiedzi

319,080 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...