Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kopiowanie zmiennych a tablic poprzez argumenty w funkcjach

Ostatnio zmodyfikowano 2016-01-02 10:11
Autor Wiadomość
Erpeg
Temat założony przez niniejszego użytkownika
Kopiowanie zmiennych a tablic poprzez argumenty w funkcjach
» 2016-01-01 22:47:44
Witam, czytając tutaj kurs skupiłem się mocno na funkcjach i nie rozumie zależności co się dzieje z argumentami w funkcjach.
Pozwolę sobie zacytować fragmenty kodu z poszczególnych części kursów.


Fragment z Poziom 2/Funkcje a slowo kluczowe return
Zrozumiałem go w ten sposób, że tablice nie są kopiowane w funkcjach tylko operujemy na oryginalnych danych.
int dopisz( int iLiczba, int tablica[], int ile )
{
    tablica[ ile ] = iLiczba;
    ile++;
    return ile; //zwraca ile jest elementów po dodaniu nowego
}

int main()
{
    int liczbaElementow = 0;
    int tablicaLiczb[ 10 ];
    wyswietl( tablicaLiczb, liczbaElementow );
  
    liczbaElementow = dopisz( 123, tablicaLiczb, liczbaElementow );
    wyswietl( tablicaLiczb, liczbaElementow );
  
    liczbaElementow = dopisz( 321, tablicaLiczb, liczbaElementow );
    wyswietl( tablicaLiczb, liczbaElementow );
    return 0;
}

Tutaj obrazek z Poziom 3 Przekazywanie argumentow funkcji przez referencji
Tutaj znowu obrazek przedstawia, że zmienna są kopiowane ale nie operujemy na oryginalnych danych.
http://cpp0x.pl/!images/!manual/Kurs-C++/Dzialanie-argumentu-funkcji.png

No i teraz moje pytanie, czy ja coś pominąłem? Czy po prostu tak już jest, że tablice w argumentach zachowują się inaczej niż pojedyńcze zmienne?
P-142671
Monika90
» 2016-01-01 23:55:05
Jeżeli zadeklarujesz parametr funkcji tak: void f(int tablica[]), czy nawet tak: void f(int tablica[114]), to kompilator i tak zamieni sobie tę deklarację na taką void f(int* tablica). Tzn parametr tablica, to nie jest żadna tablica lecz wskaźnik. Najlepiej nie deklarować parametrów postaci Typ nazwa[], od dawna jest to niemodne i wprowadza tylko zamieszanie, i zamiast tego pisać Typ* nazwa (Jeszcze lepiej byłoby w ogóle zrezygnować ze wskaźników i zacząć używać tego co oferuje C++).

C/C++
void f( int tablica[], int ile ) //to nie tablica to wskaźnik
{
}

int main()
{
    int tablica[ 114 ]; //to jest tablica
   
    f( tablica, 114 ); //gdy użyjesz tablicy w miejscu w którym oczekiwany jest wskaźnik,
    //to kompilator automatycznie w miejsce tablicy podstawi wskaźnik do jej pierwszego elementu,
    //zupełnie jakbyś napisał tak: f(&tablica[0], 114);
}
P-142673
Erpeg
Temat założony przez niniejszego użytkownika
» 2016-01-02 10:11:54
Dziękuje Monika, już rozumiem. Chociaż nie do końca wiem, czemu najlepiej nie używać wskaźników. I co ukryłaś pod zdaniem, że najlepiej wykorzystać to co daje nam C++.
P-142680
« 1 »
  Strona 1 z 1