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 :-).
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
@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
@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.
#francja We Francji wygrywa partia stalinowska na którą głosują głównie muzułmanie i murzyni a na wykopie święto xD Wykop który nienawidzi rozdawnictwa i islamizacji cieszy się ze zwycięstwa islamskiegosocjalizmu xD #polityka
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
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
@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.