Wskaźnik i tablica dynamiczna działa przez funkcję tylko

0

void funkcja(int*tablica)
{
    for(int i=0;i<=15;i++)
    {
        *tablica=i;
        tablica++;

    }
}

int *tablica;
tablica = new int [15];

 funkcja(tablica);

cout<<tablica[0]<<endl;
cout<<tablica[5]<<endl;
cout<<tablica[10]<<endl;
cout<<tablica[13]<<endl;
cout<<tablica[15]<<endl;
delete [] tablica;

Wszystkie wyniki wyświetla mi poprawnie.
Natomiast:

 int *tablica;
tablica = new int [15];

    for(int i=0;i<=15;i++)
    {
        *tablica=i;
        tablica++;

    }

cout<<tablica[0]<<endl;
cout<<tablica[5]<<endl;
cout<<tablica[10]<<endl;
cout<<tablica[13]<<endl;
cout<<tablica[15]<<endl;
delete [] tablica;

wyświetla "chińskie" liczby.

  1. Przy okazji zapytam dlaczego jak ustawię

delete [] tablica;
przed
cout<<tablica[0]<<endl;

to tylko zły wynik mi pokazuję tylko dla tej wartości tablica[0] a nie dla wszystkich ??

1

Popraw te rzeczy:

for(int i = 0; i < 15
....
cout << tablica[15] << endl;   //   <-- nie ma czegoś takiego jak tablica[15]

A teraz główna część problemu:

        tablica++;
    }

cout<<tablica[0]<<endl;     

Po wyjściu z pętli tablica już nie wskazuje na początek tablicy. W przeciwieństwie do wersji z funkcją, gdzie modyfikowałeś kopię tego wskaźnika.

0

Pierwsza część faktycznie nie ma tablica[15] gdyż od 0 do 14 - to jest wlasnie 15 szufladek
(tylko pytanie) czemu w takim razie wyświetlała się poprawna liczba.

int tablica[0];
for(int i=0;i<15;i++)
{
    tablica[i]=i;
    cout<<tablica[i]<<endl;
} 

Czemu ten kod się wyświetla poprawnie, czy jest to absolutnie zakazana forma ???

Wracając do głównego wątku w takim razie jak mam zapisać aby wrócić z powrotem na początek tablicy ???

EDIT

    for(int i=0;i<15;i++)
    {
        tablica--;
    }

dodanie tej instrukcji rozwiązuję problem, a czy jest to poprawna forma rozwiązywania tego typu problemu ?

0

Używasz tego jako tablicy, więc najprościej będzie

tablica[i] = i;

Jak koniecznie chcesz się bawić wskaźnikiem to możesz:
a) zapamiętać początek

int* poczatek = tablica;
for (...) { ... }
tablica = poczatek;

b) wrócić do początku

tablica -= 15;

Tablica rozmiaru 0 to jest brzydki kod, który pozwolił w C deklarować tablicę nieznanego rozmiaru. Dlatego kompilator nie protestuje nawet gdy mażesz nie po swojej pamięci.

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