Przekazywanie tablicy przez referencję i jej zwracanie

0

Cześć, mam takie pytanie.

Mam 2 fragmeny kodu robiące identycznie to samo.

Ze zwracaniem wskaźnika.

int *reverseTab(int &tablicaKopia){

	int *ptr = &tablicaKopia;

	for (int i = 0, j = 10; i < 10; i++, j--)
		ptr[i] = j;

	return ptr;
}

Wywołanie:

int tablica[10];
int wsk*;

...

wsk = reverseTab(tablica[0]); //lub *tablica

...

Bez zwracania wartości:

void reverseTab (int &tablica){

	int *ptr = &tablica;

	for (int i = 0, j = 10; i < 10; i++, j--)
		ptr[i] = j;

}

Wywołanie:

int tablica[10];
int wsk*;

...

reverseTab(tablica[0]); //lub *tablica

	for (int i = 0; i < 10; i++)
		cout << tablica[i] << endl;
...

Moje pytanie się tyczy tego czy w tym wypadku jest w ogóle sens zwracać wskaźnik?
No bo w sumie przesyłamy adres tablicy, wykonujemy na niej operacje i już w pamięci te dane się zmieniają bo nie jest tworzona żadna kopia tej tablicy, a nawet jak by sobie kopie stworzył w samej funkcji to zostanie ona zniszczona po zakończeniu funkcji.
Gdybyśmy chcieli do funkcji przesłać sobie kopię naszej tablicy, a następnie utworzyć np. drugą tablicę tablica2 w której umieścilibyśmy wynik odwracania to tablica2 musi być globalna prawda? Albo tworzyć wskaźnik na tablica2 jako zmienną lokalną w ciele main i razem z tablica przekazywać go do funkcji, a później zwracać? Dobrze myślę czy źle?
Może i to takie pierdoły ale będę wdzięczny za odpowiedź.

Czy oba fragmenty kodu są poprawne i można je używać tożsamo?

2

Ja bym zwracał w tym przypadku void, bo zwracanie wskaźnika sugeruje że jest to jakaś nowa tablica, przetworzona, a tak nie jest.

int &tablicaKopia

To jest referencja na int, na jeden element. Nie można tego utożsamiać ze wskaźnikiem na całą tablicę, nawet jeśli się kompiluje i działa (bo nagle może przestać, na skutek np. optymalizacji kompilatora).

Obie funkcje są zatem błędne.

int *tablica // — wskaźnik na jeden lub więcej elementów
0

Właśnie działały poprawnie obie wersje dlatego się chciałem dowiedzieć. Dzięki za wyjaśnienie.
Czyli rozumiem, że powinno się to wykonać po prostu w taki sposób:

Wywołanie:

...
reverseTab(tablica1);
...

i sama funkcja:

void reverseTab(int tablicaCpy[]){

	for (int i = 0, j = 10; i < 10; i++, j--)
		tablicaCpy[i] = j;
}
0

Jeżeli tablica ma
[0 1 2 3 4 5 6 7 8 9]
a po wywołaniu funkcji ma mieć:
[9 8 7 6 5 4 3 2 1 0]
to faktycznie powinno być:

for (int i = 0, j = 9; i < 10; i++, j--)
tablicaCpy[i] = j;

Bardziej chodziło mi o poprawność konstrukcji funkcji i operacji na tablicy.

dodanie znaczników <code> - furious programming

1

ale to nie jest odwrócenie tablicy tylko wypełnienie tablicy malejącymi wartościami...

odwróć taką tablicę:
[1,6,4,19,666,42,667,9,88,-5]
żeby uzyskać
[-5,88,9,667,42,666,19,4,6,1]

0

No tak, może trochę źle to nazwałem, chodziło mi o jakąś prostą modyfikację tablicy żeby widzieć efekt po wykonaniu funkcji.
Z odwracaniem uniwersalnym można by to tak rozwiązać (chociaż przydałoby się też przekazywać rozmiar tablicy, bo tu akurat jest na sztywno)

void reverseTab(int *tablicaCpy){

    int temp;

	for (int i = 0; i < 5; i++){
            temp = tablicaCpy[i];
            tablicaCpy[i] = tablicaCpy[9 - i];
            tablicaCpy[9 - i] = temp;

            //swap(tablicaCpy[i], tablicaCpy[9 - i]);
        }
}
0
std::reverse(tab, tab+tabLength);

1 użytkowników online, w tym zalogowanych: 0, gości: 1