Wpis z mikrobloga

Mirki!

Mamy:

struct S {
int a1;
int a2;
int a3;
};
void f(int a[3]);
void g(S a);
Dlaczego tak jest, że przy wywołaniu f tablica przekazywana jest przez wskaźnik (bo a to wskaźnik), a przy wywołaniu g struktura przekazywana jest przez wartość? Przecież z perspektywy zarządzania pamięcią obie te struktury są identyczne, tzn. obie zaalokowane na stosie, ten sam rozmiar, te same offsety liczb.
Czy da się przekazać tablicę przez wartość? Jeśli opakuję ją w strukturę to i tak cała tablica się nie skopiuje.

Edit: Jednak opakowanie w strukturę powoduje skopiowanie całej tablicy :-).

#programowanie #jezykc #cpp
  • 4
  • Odpowiedz
Bo z technicznego punktu widzenia struktura jest traktowana jako zmienna, wartość jakbyś tego nie nazwał, a tablica cóż... Nie ma czegoś takiego jak tablica. Tak na prawdę to jest wskaźnik ;) Wygląda to mniej więcej tak, że tab[i] to tak na prawdę *(tab + i * sizeof(typ)) i nic poza tym, tablicę to tylko cukier składniowy. Dlatego przekazywanie tablicy jest możliwe tylko przez wskaźnik, i dlatego stosuje się np listy, vectory, kolejki
  • Odpowiedz
@GwnBrz: Chcesz dokonywać modyfikacji, które nie będą trwałe na oryginale tablicy? Czy pytasz tak z ciekawości? Może bardziej zastanawiająca jest kwestia, czemu jeżeli wyślemy coś do funkcji
1. w przypadku tablicy, przesyłamy wskaźnik (adres 0 elementu), którym inicjalizujemy argument w deklaracji i tutaj możemy zrobić z tego adresu albo wskaźnik, albo tablicę. Tak czy inaczej operujemy na oryginale - cokolwiek zrobimy, zmiana będzie trwała
2. w przypadku zmiennej, tworzy się kopię na stosie, cokolwiek z nią nie zrobimy, zmiana nie będzie trwała.
Ktoś wie, po co taki
  • Odpowiedz
@Kadet: @Phallusimpudicus: Ten wzór to raczej *(tab + i), bo arytmetyka wskaźników bierze pod uwagę rozmiar elementu, ewentualnie *((char *)tab + i * sizeof(typ)).

Chcesz dokonywać modyfikacji, które nie będą trwałe na oryginale tablicy?


@Phallusimpudicus: Nie chcę dokonywać modyfikacji, po prostu CUDA ma własny mechanizm do przekazywania argumentów do kernela na GPU, a akurat mam tablicę wielkości 4 (zawsze 4) i nie chciałem jej alokować dynamicznie, a z drugiej strony nie wiedziałem jak ją przekazać statycznie.
  • Odpowiedz