wypisywanie elementów tablicy przez wskaznik

0

Witam, mam pytanie gdzie w tym kodzie jest błąd. Dopiero się uczę i chyba po prostu źle zrozumiałem wskaźniki bo dla mnie wszystko jest dobrze. Jakby ktoś dał jakąś wskazówkę byłbym wdzięczny.

#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;

int main()
{

int *tablica = new int[20];

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


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



system("pause");
return 0;

}

2
tablica++;

To jest twój błąd. Tablica jako tako jest wskaźnikiem.
W twoim wypadku tablica na początku wskazuje na przydzielone jej miejsce dla 20 intów, a pierwsza pętla sprawia, że wskazuje na miejsce dokładnie ZA przydzieloną pamięcią.

0

Oznacza to, że nieprawidłowo przechodzę do kolejnego elementu tablicy? Bo jeśli dobrze myślę to mając *tablica = i; to przy pierwszej iteracji pętli znaczy to, że tablica[0] = 0;, a następnie robię tablica++ czyli przesuwam o wartość int a więc o 4 bajty czyli powinienem się w kolejnej iteracji pętli znajdować w tab[1] i przypisać tam kolejne 'i' czyli 1. Także nadal nie wiem jaki jest mój błąd niestety.

0

Mam to też zrobione na funkcji i tutaj działa prawidłowo.

#include <iostream>

using namespace std;

void srednia(int *tab)
{
for (int i = 0; i < 20; i++)
{
*tab = i;
tab++;
}
}

int main()
{

int tablica[20];


srednia(tablica); // nazwa tablicy jest jodnoeczesnie wskaznikiem do jej zerowego elementu
for (int i = 0; i < 20; i++)
{
	cout << tablica[i] << endl;
}



system("pause");
return 0;

}

0

Nie mieszaj poruszania się po indeksach wraz z poruszaniem się za pomocą wskaźników. Już w połowie iteracji pętla jest błędna.

2

@Kaka33 wersja z funkcją Ci działa tylko dlatego, że parametry funkcji są przekazywane przez wartość, czyli funkcja operuje na kopii wskaźnika, dlatego tablica nie jest modyfikowana przez funkcję.

Wracając do pierwszej wersji, masz 2 wyjścia:

int* tablica = new int[20];
int* pocz = tablica;
....
for (int i = 0; i < 20; ++i)
{
    cout << pocz[i] << endl;
}

albo

for (int i = 0; i < 20; ++i)
{
    tablica[i] = i;
    // albo
    *(tablica + i) = i;
}

Generalnie tablica[i] jest równoważne *(tablica + i).

I jeden ważny nawyk: jak masz new[] to musisz mieć delete[].

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