Czesc
Problem 1: error: cast from ‘int*’ to ‘int’
‘int *’ to jest wskaznik na typ int.
To jest adres komorki w pamieci, w ktorej znajduje sie typ int.
Ten adres w obecnyh komputerach jest zawarty w 64 bitach, czyli 8 bajtach.
Dla uproszczenia (bo to jest bardziej skompilokwany temat) mozna sobie o nim pomyslec,
ze jest to zwykla liczba okreslajaca numer bajta w pamieci RAM.
‘int’ to jest zwykla liczba calkowita.
W obenych komputerach jest to standardowo wartosc 32 bitowa (4 bajtowa).
Ten ‘error’ oznacza, ze nastapila proba wcisniecia liczby, ktora sklada
sie z 64 bitow (8 bajtow) do zmiennej, ktora moze pomiescic jedynie 32 bity (4 bajty).
Moze sie to udac, jezeli ta ‘liczba’ jest mala, przykladowo:
'int *' ===> 0x0000000011223344 (dec: 287454020)
'int' ===> 0x11223344 (dec: 287454020)
Jezeli liczba jest za duza to sie nie zmiesci i zostanie obcieta:
'int *' ===> 0x1122334455667788 (dec: 1234605616436508552)
'int' ===> 0x55667788 (dec: 1432778632)
Generlanie konwersja jakiegokolwiek wskaznika na typ calkowity
nie jest prawidlowa. Takich rzeczy sie nie powinno robic.
W obecnych komputerach typ long jest w stanie pomiescic 64 bity.
Podejrzewam, ze ten kurs bazowal na architekturze 32 bitowej, gdzie standrdowo int to 32 bity i wskaznik ‘int *’ takze miescil sie w 32 bitach. Takie problemy wynikaja prawdopodbnie z tego, ze autor nie trzymal sie standardu C/C++.
Problem 2: "chce wrocic wskaznikiem na komorke zerowa tablicy"
Generalnie nie powinno sie ruszac adresu otrzymanego od funkcji new / malloc itd.
Taki kod przewaznie zadziala, ale nie jest poprawny.
{
int * tablica = new int [ile];
tablica += 345;
...
tablica -= 345;
delete [] tablica;
}
Operacja delete WYMAGA podania dokladnie tej samej wartosci otrzymanej podczas alokacji.
Nalezy pamietac, ze w tym przypadku tablica jest to adres (wskaznik) komorki w pamieci,
a wskazniki maja to do siebie, ze moga podlegac specjalnemu traktowaniu.
Moze byc sytuacja, ze rozne wartosci wskaznikow wskazuja tak na prawde
na ta sama komorke w pamieci (porownywanie wskaznikow musi byc robione z ta swiadomoscia).
Tutaj wazne info, delete wymaga, aby ta wartosc byla dokladnie taka sama jak podczas alokacji,
nie moze to byc inna wartosc, nawet, gdyby wskazywala na ta sama komorke w pamieci.
Najlepsze rozwiazanie, w ktorym nie trzeba sie o to martwic to uzycie dodatkowego wskaznika bazowego,
ktorego nie ruszamy podczas dzialania programu:
{
int * tablica_base = new int [ile];
int * tablica = tablica_base;
...
tablica += 345;
...
tablica -= 123;
...
delete [] tablica_base;
}
Problem 3: "po wyjsciu z petli for wskaźnik jest poza tablica"
Tak na prawde ten wskaznik wskazuje adres konca tablicy.
Jest to ok, gdyz koniec tablicy (zaalokowanego obszaru) to tez jest adres poprawny.
Nie mozna tam juz nic wpisac, ale adres jest poprawny.
Generalnie wskanikiem mozna ‘latac’ po calym obszarze zaalokowanym,
wliczajac w to adres konczacy ten obszar.
Pzdr.