Lista po przekazaniu do funkcji nie "ginie" (o ile funkcja jej nie zdealokuje). Przekazując listę do funkcji przekazujesz tak naprawdę wskaźnik (na jej pierwszy element), zatem przy każdym przekazaniu zawartość listy nie jest w funkcji kopiowana (duplikowany jest jedynie wskaźnik). Nie wiem zbytnio w jaki sposób wywołujesz te funkcje, anie chce mi się analizować kodu, więc dam Ci przykład:
void first(int *list)
{
// tutaj `list' jest wskaźnikiem
}
void second(int *list)
{
// tutaj też jest wskaźnikiem
}
Teraz, jeśli chcesz wywołać powyższe dwie funkcje na tym samym poziomie, robisz to w ten sposób:
int my_list[100];
first(my_list);
second(my_list);
Jeśli jedna funkcja wywołuje drugą i chcesz przekazać listę "w dół", to przesyłasz wskaźnik bez kombinowania:
void first(int *list)
{
// tu robimy coś z listą
}
void second(int *list)
{
first(list);
}
// I wywołanie (np. w main())
int main(void)
{
int my_list[100];
second(my_list);
// ...
Warto pamiętać, że przekazując wskaźnik między funkcjami przekazujesz jego wartość, a nie zmienną. Często potocznie mówi się o "przekazywaniu zmiennej", ale to tylko skrót myślowy.
Aby wyjaśnić to prościej... Zmienna jest jak kontener, pojemnik z naklejoną nazwą, który może przechowywać dane określonego typu. Zmienna wskaźnikowa także jest takim kontenerem, przechowującym informację gdzie można znaleźć dane, na które wskazuje. Przekazując listę do funkcji dajesz jej taki wskaźnik-kontener z wiadomością "tablica zaczyna się pod adresem X" (zwróć uwagę, że nie mówi ona jak pojemna jest ta tablica, ani ile elementów w niej ma nadane przez Ciebie wartości). Funkcja tworzy sobie własny pojemnik (w powyższych przykładach pojemnik ma naklejkę `list'), kopiuje przekazaną przez Ciebie wiadomość i tę kopię wrzuca do swojego pojemnika. Tablica, na którą wskazuje wiadomość nie jest kopiowana i dalej siedzi w tym samym miejscu w pamięci. W funkcji możesz wykorzystać wiadomość we wskaźniku do znalezienia tablicy i dostania się do jej zawartości.