Wypełnianie tablicy za pomocą wskażników

0

Witam chciałem za pomocą wskazników wypełnić tablice

 #include <iostream>

#using namespace <std>

int main()
{
    int *wsk;
    int tab[10];

    wsk=tab;
    cout << "wskaznik pokazuje na zerowy adres tablicy:" << wsk << endl;
    cout << "wskaznik pokazuje (co kryje w sobie zerowy adres tablicy:" << *wsk << endl;

    cout << "wypelniam tablice za pomoca wskaznika w petli" << endl;

    for (int i = 0 ; i < 10 ; i++)
    {
        *wsk=i;
        wsk++;
        cout << "Wypelnienie tablicy:"<< i << "."<<*wsk<<endl;
    }


    return 0;
}





Niestety program mi nie wypełnia tej tablicy od 0 do 9 tylko czyms takim :

okno.png

2

Zamień kolejność tych 2 linijek:

wsk++;
cout << "Wypelnienie tablicy:"<< i << "."<<*wsk<<endl;
1

albo zamiast przesuwac wskaznik zrob tak

wsk[i] = i;
0

Pewnie nie chodzi o optymalizację, a o naukę, niech się uczy, łatwiej będzie zrozumieć iteratory, jak zrozumie co tu się wykonuje.

0

Dokładnie o nauke chodzi :P
Jakbym chcial to zrobic w jednej linijce ze wskaznikami podobnie jak w 2 petli to bym zapisal *(wsk++)
Dlaczego jak zamienilem linijki to byla az tak drastyczna roznica w wartosciach nawet jezeli pokazalbym Od razu na nastepny element tablicy (czyli zostawil to w++ przed wyrzuceniem na ekran ) to i tak powinienem dostac wartosci od 1 do 9 a nastepny to jakas (pamiec z kompa)

   for (int i = 0 ; i < 10 ; i++)
    {
        *(wsk++)=i
        cout << "Wypelnienie tablicy:"<< i << "."<<*wsk<<endl;
    }
  for (int i = 0 ; i < 10 ; i++)
    {
        tab[i]=i;

        cout << "Wypelnienie tablicy:"<< i << "."<<tab[i]<<endl;

    }
  



 
0

Pierwszy przykład może być wolniejszy, bo powstanie tymczasowy obiekt, dodatkowo, będą wartości z kosmosu, bo przestawiasz przed wypisaniem wskaźnik na dalsze miejsce, więc wyświetlane będą przypadkowe dane.

0

No tak przestawiam wskaznik na kolejny element tablicy czyli zamiast robic to na wsk[0] (chodzi mi o to co pokazuje wskaznik a pokazuje na tablice na jej pierwszy element) robie to na elemencie jednym dalej czyli wsk[1]; Czyli z pierwszym elementem tablicy (wsk[0]) nic nie robie (ide dalej na nastepny element ) i na nim pracuje w petli czyli nadal mi wychodzi ze zakres tej tablicy zmniejszy sie jakby o jeden no bo Od razu przesunalem na nastepny element tablicy czyli niczym nie wypelnilem pierwszego elementu tablicy . Noi i nadal wydaje mi sie ze powinno mi wypisac od 1 do 9 a nastepny element to byla by jakas wartosc dziwna . Niestety w kazdym elemencie tej tablicy na ktora pokazuje wskaznik sa dziwne wartosci. Nie wiem wlasnie dlaczego tak jest .

1
balti napisał(a):

Dlaczego jak zamienilem linijki to byla az tak drastyczna roznica w wartosciach nawet jezeli pokazalbym Od razu na nastepny element tablicy (czyli zostawil to w++ przed wyrzuceniem na ekran ) to i tak powinienem dostac wartosci od 1 do 9 a nastepny to jakas (pamiec z kompa)

wsk to wskaźnik, jego wartość to jakiś adres. Wartość pod tym adresem ma się nijak do wartości pod adresem wsk + 1. Jeżeli pokazujesz element tablicy, który nie został inicjalizowany, to dostajesz śmieci, które nijak się mają do innych komórek tablicy.

1

Generalizując popełniłeś błąd off by one

0

Myślałem że jak wpisze tą instrukcje *(wsk++)=i przed wyrzuceniem jej na ekran to tablica normalnie sie wypelni tymi wartosciami ktorymi chcialem ;(

Wracajac do tego

 
 *wsk=i;
        wsk++;
        cout << "Wypelnienie tablicy:"<< i << "."<<*wsk<<endl;

Na ekran wyrzucam smieci tej tablicy bo nie zostala zainicjalizowana ale mimo wszystko tablica sie wypelni od 0 do 9 :P i jestem w stanie to pokazac robiac nastepna petle :D

Dziękuje wszystkim za odpowiedzi :)

2

Tablica dobrze się wypełnia, ale wyświetlasz zły element. Odpal sobie to:

for (int i = 0 ; i < 10 ; ++i)
{
    *(wsk++) = i;
    cout << "Wypelnienie tablicy:" << i << "." << *(wsk-1) << endl;
}
0

W takim programie

 
 #include <iostream>

using namespace std;

int main()

{
    int tabint[10]={1,2,3,4,5,6,7,8,9,10};
    float tabflo[10];

    int *wint;
    float *wflo;

    wflo=tabflo;

    for ( int i = 0 ; i < 10 ; i ++)
    {
        *wflo=i;
        cout << *wflo << endl ;
    }




    return 0;
}

To tylko dla pewnosci pytam wflo pokazuje na 1 adres tablicy a w petli te wszystkie liczby przypisuje do jego 1 elementu tzn 1 elementu tablicy
czyli jakbym chcial wywolac 5 element tablicy za pomoca wskaznika to by pokazal jakams dziwna wartosc tak ?
Pytanie jak np za pomoca wskaznika wywolac odpowiedzi element ? chodzi mi o cos takiego jak w tablicach np tab [5] to tutaj nie moge *wflo[5] jedynie to mi przychodzi do glowy to stworzyc nowy wskaznik ktory pokaze mi ten element tablicy ?

2
//1
*(wflo+5)
//2
wflo[5]
//3
*(5+wflo)
//4
5[wflo]
1

Nie pokazał by żadnej dziwnej wartości, tylko to co w tym miejscu wcześniej sobie w pamięci było, czytaj. smieci.
Jakbyś chciał odwołać się(nie wywołać) do 5 elementu, dodajesz po prostu do wskaźnika 5, czyli *(wflo+5)

0
 
 #include <iostream>

using namespace std;

int main()

{
    int tabint[10]={1,2,3,4,5,6,7,8,9,10};
    float tabflo[10];

    int *wint;
    float *wflo;

    wflo=tabflo;

    for ( int i = 0 ; i < 10 ; i ++)
    {
        *wflo=i;
        cout << *wflo << endl ;
        wflo++;
    }
cout << *wflo<< endl; // tutaj ten wskaznik juz mi nie pokaze zerowego elementu tablicy ? ani nie pokaze wartosci zadnej z od 1 do 9// Nie rozumiem dlaczego tak





    return 0;
}

1

bo znowu sie do nieswojej pamięci odwołujesz.
dopisz przed coutem wflo-- i pomyśl co tam sie dzieje.

1

Po wyjściu z pętli wskazuje na pierwszy element za tablicą.
Ot początekTablicy = x, początekTablicy + 10 = x+10, z czego magicznie wynika, że początekTablicy+10!=początekTablicy

#include <iostream>
#include <iterator>
using namespace std;

int main(){
	int tab[10], *beg=tab;
	for(size_t i = 0; i < 10; ++i, ++beg){
		cout << "distance: " << distance(tab, beg) << endl;
	}
	cout << "distance: " << distance(tab, beg) << endl;
	return 0;
}
distance: 0
distance: 1
distance: 2
distance: 3
distance: 4
distance: 5
distance: 6
distance: 7
distance: 8
distance: 9
distance: 10

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