problem ze zrozumieniem sensu korzystania ze wskaźników

0

Witam. Uczę się z Symfonii c++ standard najnowsze wydanie i nie potrafię wyczytać prawdziwego sensu korzystania ze wskaźników.

Jeśli odczytuje tablice np. 150 element z 300 to mogę zrobić

int i; // i tutaj przypisać wartość 150 i dalej z niego korzystać, zwiększać itp

albo wskaźnik

int *wskaznik; // który będzie pokazywał na 150 element tej tablicy i tak samo mogę się przesuwać po tablicy 

więc proszę podajcie mi powody (najlepiej z przykładami - nie koniecznie kod ale gdzie się to stosuje) dla których miałbym z nich korzystać.

0

Sama arytmetyka wskaźników to zło, jest powszechnie uważana za coś czego trzeba unikać. C++ ma referencje, które są w zasadzie wskaźnikami bez arytmetyki wskaźników.

Wskaźniki czy tam referencje są niezbędne, gdy chcesz zaalokować dynamicznie pamięć. Np:
int *tablica = new int[500];

Potem możesz się odwoływać do tej tablicy, np:
tablica[30] = 80;

I usunąć:
delete [] tablica;

0

Np przemieszczanie się po elementach tablicy, gdyż tablice są ustawiane szeregowo w C++ dlatego jeśli masz tablicę tab[2][3] i jesteś w elemencie tab[0][2] (ostatni element pierwszego wiersza), to żeby przejść do elementu tab[1][0] musisz zmienić oba indeksy, natomiast dla wskaźnika przesuwasz się o jeden dalej w prawo i jesteś tak jakby w elemencie tab[1][0] = tab[0][3] (posługiwanie się takimi indeksami w tablicy byłoby niemożliwe)

poza tym, przesyłanie do funkcji, przez wartość, przez wskaźnik i przez referencję. Kiedy przesyłasz przez wartość, umieszczasz zmienną na stosie. Ta zmienna nie jest zwracana i po wyjściu z funkcji ona nie jest taka jaka chciałbyś żeby była. Natomiast przy przesłaniu zarówno przez wskaźnik jak i referencję (gdzie przesyłasz adres) funkcja wykonuje operacje na przesłanej zmiennej i zapisuje je dokładnie pod tym adresem gdzie się ta zmienna znajduje. Po wyjściu z funkcji efekt jest zadowalający ;]

Jest mnóstwo zastosowań wskaźników, sam wszystkich nie znam, ale są potrzebne, wiele ułatwiają.

0

MJay mógłbyś podać przykładowy kod?

nauka samego kodu nie jest strasznie trudna ale jak NIE MA zrozumienia to nawet nie chce iść dalej z tematem dlatego pytam.

0

Wydaje mi się, że w symfoni jest tego typu przykład, chyba z hydraulikiem z tego co pamiętam. Ale masz tu zastosowanie wszystkich trzech przesyłań.
<cpp>#include <iostream>
using namespace std;
// zastosowałem tutaj dosyć ciekawe urządzenie w C++ mianowicie przeładowanie funkcji ;] będzie o tym w 9 rozdziale ;]
void zamien(int liczba, int liczba2)
{
liczba += 100;
liczba2 += 50;
}
void zamien(int* liczba, int* liczba2)
{
*liczba += 100;
*liczba2 += 50;
}
void zamienref(int& liczba, int &liczba2)
{
liczba += 100;
liczba2 += 50;
}
// to dodatkowo jak możesz wykorzystać przesyłanie przez wartość i otrzymać to co planowałeś.
int podmien(int liczba, int liczba2)
{
liczba += 100;
liczba2 += 50;
return liczba;
} // niestety jeśli prześlesz do funkcji dwa argumenty, to w ten sposób będziesz mógł zwrócić tylko jeden z nich, drugi pozostanie bez zmian.

int main()
{
int a = 5, b = 12;
cout << "Liczba a = " << a << ", a liczba b = " << b << endl;

zamien(a, b);
cout << "Liczba a = " << a << ", a liczba b = " << b << endl;

zamien(&a, &b);
cout << "Liczba a = " << a << ", a liczba b = " << b << endl;

zamienref(&a, &b);
cout << "Liczba a = " << a << ", a liczba b = " << b << endl;

a = podmien(a, b);
cout << "Liczba a = " << a << ", a liczba b = " << b << endl;

return 0;
}

0

Ja też kiedyś tak myślałem- po co komuś wskaźniki?! Ale czym głębiej w C++, to wskaźniki okazują są świetną rzeczą np. w klasach abstrakcyjnych (funkcje wirtualne, itd), łatwiejsze poruszanie się po tablicach oraz są bardzo ważne w tablicach dynamicznych.

0

a mógłbym jeszcze prosić o przykład w jaki sposób się przesuwać po tablicy? np. z miejsca [3][4][2] przeskoczyć na [2][3][1] bo jeśli dobrze zrozumiałem to za pomocą wskaźników też się to robi. Jak na razie przeczytałem tylko dział o wskaźnikach i postarałem się rozumieć działanie bo z wykorzystaniem (jak widać po temacie) jest u mnie gorzej i uczę się klas a tam gdzie napotkam wskaźniki to będę szukał odpowiedzi w odpowiednim dziale w książce.

0
Szewy napisał(a)

wskaźniki okazują są świetną rzeczą np. w klasach abstrakcyjnych (funkcje wirtualne, itd), łatwiejsze poruszanie się po tablicach oraz są bardzo ważne w tablicach dynamicznych.

O dziwo inne języki dają potrafią to bez wskaźników.

0

zapomnijmy na chwilkę o zmiennym przecinku
jakie dane istnieją dla procesora?
małe liczby całkowite, wskaźniki, i...?

0

O dziwo inne języki dają potrafią to bez wskaźników.
Na przykład C#, tak. Ale można podać przykład kodu, który w C# będzie 2 lub 3 razy szybszy na wskaźnikach niż bez nich.

Ja też kiedyś tak myślałem- po co komuś wskaźniki?!
w C++ potrzebne są do tworzenia obiektów na stercie (nie zawsze można użyć referencji!), a w C to już w ogóle (brak referencji).

0

typy zdefiniowane przez programistę (klasy), iteratory, i jeżeli nie mówimy że char to int-8 to znaki jeszcze

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