Tablica i wskaźnik

0

załóżmy ,że mam tablicę
char bufor[10];
oraz wskaźnik do niej
char *p;
p=&bufor;

Załóżmy też ,że wpisuję dane do tej tablicy , zwiększając każdorazowo wskaźnik *p++

Mam pytanie : Na co wskaże wskaźnik po przekroczeniu wielkości tablicy - czy na kolejne pole pamięci nie należące już do tablicy, czy cyklicznie bedzie wskazywał pierwsze pole tablicy , czy tez zgłosi błąd przekroczenia?
Wiem ,że pytanie jest trywialne , ale dopiero przymierzam się do C++ , a w dostepnej dla mnie literaturze (stosunkowo niezaawansowanej) nie znalazłem jednoznacznej odpowiedzi.

0

Looknij sobie tam i poczytaj:
http://www.4programmers.net/forum/viewtopic.php?id=36321

Nie wiem czy z tym wskaznikiem bedzie podobnie ale ale tak mi sie wydaje :)

0

Jak na moje oko to *p++; zwiekszy to co znajduje sie pod adresem p, czyli powinno zwiekszyc bufor[0] o 1; A co do miejsca na które będzie wskazywał dany wskaznik (zakładając, że stosujesz p++) to po przekroczeniu zakresu kompilator nic nie wskaze :( gdyz nie moze sledzic tego co jest przypisane do wskaznika i co sie z tym dzieje.
Czyli zakładając ze wskaznik p wsazuje na obiekt (tablice) typu char ktorego rozmiar wynosi jeden bajt to po dziesieciokrotnym p++; wskażnik p będzie wskazywał na bajt zaraz po tablicy byfor[10];
Moze to byc inna tablica zawierająca znaki lub jakis typ liczbowy czy jeszcze co innego ;-) ale nie ma pewnosci, że wskazuje (p) na zmienna zadeklarowaną zaraz po *bufor;.
I z tego co mi sie wydaje nie musisz pisac p=&bufor; wystarczy p=bufor.
Ale co do tego to nie jestem pewny (bufor to wskaznik czyli tak powinno byc gdyz przechowuje adres). [nuda] [nuda] [nuda]

0

Dzięki ale chyba już wiem. Wydaje mi się ,że mechanizm nalezy ukryć w sposobie inkrementacji wskaźnika.
Dodając nową wartość np 'wartość' tak należy ustawić wskaźnik:
*((p++)%10) = wartość;
Muszę to dokładnie sprawdzić , ale wydaje się, że wtedy wpisywanie będzie cykliczne , w obrębie zadanej tablicy.

0

Dzięki ale chyba już wiem. Wydaje mi się ,że mechanizm nalezy ukryć w sposobie inkrementacji wskaźnika.
Dodając nową wartość np 'wartość' tak należy ustawić wskaźnik:
*((p++)%10) = wartość;

no nie jestem pewien czy tak w ogóle może być , a co jak adres zerowej komórki tablicy ( p ) to 501 ??. wtedy zapisze do miejsca w pamięci o adresie : 1 a to by było nie za dobrze .
wg mnie powinno być tak :

[code]int i=0; //zmienna która zwiększamy
const int rozmiar_tablicy=10;
int tab[rozmiar_tablicy];
*(tab+(i++)%rozmiar_tablicy)=wartość;[/code]

0

no nie jestem pewien czy tak w ogóle może być , a co jak adres zerowej komórki tablicy ( p ) to 501 ??. wtedy zapisze do miejsca w pamięci o adresie : 1 a to by było nie za dobrze .

O tym nie pomyślałem. Masz 100%racji. Ale byłoby smiesznie :-)

0

A po co aż tak kombinować?
Nie łatwiej:
p[i];
i tylko inkrementujesz i++? A tak zabawa z adresami to troszkę niebezpieczne.
Jeżeli chcesz mieć bufor kołowy to:
int i;
char *p;

p[i%10] czy jak tam szło.

0

Jeżeli chcesz mieć bufor kołowy to:
int i;
char *p;

p[i%10] czy jak tam szło.

Czy mógłbyś rozwinąć tą mysl? Ja zapis p[i%10] odczytuję jako stworzenie dodatkowej tablicy wskaźników o rozmiarze 10 ,przeglądanej cyklicznie.
Problem polega na tym ,że zależy mi na miejscu w pamięci.
Bufor ma byc zaimplementowany w jednoukładowym procesorze ,gdzie cały RAM ma zaledwie 256 Bajtów.
Myślałem ,że operacje na adresach dają najwiekszą możliwą oszczędność miejsca. Jeśli się mylę - popraw mnie, proszę.

0

ten zapis :
p[i%10]
jest równoważny temu :
*(p+i%10)

0

ten zapis :
p[i%10]
jest równoważny temu :
*(p+i%10)

Dzięki. Chyba muszę jeszcze troche poczytać ...

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