Wyrazenia i ich wartosc problem

0

Mam pewien problem z wyrażeniami, tzn: mam takie dane początkowe:

int n=13, t[]={2,5,9,3},*p=&t[2];
double x=7, z[]={4,3,2};
char napis[]="tekst", *tp=napis+3;

a) p-t - wiem, że wynik wychodzi 2, tylko nie wiem skąd..
b) *z=p++-t. wynik rowniez wychodzi 2. tylko nie wiem jak to działa do końca..

w b. wyswietlajac pojedynczo p , i t otrzymuje adresy. Wiec w jaki sposob dokonuje się tu odejmowanie i skad wziąc te wartosci?

1

Mamy:
DowolnyTyp p;
int d;
(p+1) // adres kolejnego elementu, czyli numer komórki który jest sizeof(DowolnyTyp) bajtów dalej.
(p-1) // adres poprzedniego elementu, czyli numer komórki który jest sizeof(DowolnyTyp) bajtów wcześniej.
(p+d) // adres elementu odległego od "p" o d, czyli numer komórki który jest d
sizeof(DowolnyTyp) bajtów dalej.
(p-d) // adres elementu poprzedzającego "p" o d, czyli numer komórki który jest d*sizeof(DowolnyTyp) bajtów wcześniej.
(na tej samej zasadzie działają ++, +=, --, -=)
z powyższego wynika że *(p+d) jest tym samym co p[d] (lub d[p] - mało kto o tym wie)
oraz wynika że (p+d) jest tym samym co &p[d]
Można też odejmować dwa wskaźniki chyba to naturalnie że:
((p+d)-p) == d
czyli odejmując wskaźniki uzyskujemy odstęp w sztukach a nie w bajtach.

0

Nie bardzo mi to pomogło... bo nadal nie potrafię odpowiedzieć na przyklad a i b ..

0

Wyniki są takie dzięki możliwości operacji arytmetycznych na wskaźnikach pokazujących adresy elementów jednej tablicy.

Nazwa tablicy to adres jego pierwszego elementu, czyli dla przykładu:

int tablica[10] = {0,1,2,3,4,5,6,7,8,9};
int* pointer_tab = tablica;
cout << *pointer_tab;  // rezultat: 0;
pointer_tab++;           // teraz wskaźnik pokazuje na drugi element;
cout << *pointer_tab  // rezultat: 1
pointer_tab+= 1;        // wskazuje na 3 element
cout << *pointer_tab   // rezultat: 2
pointer_tab = &tablica[9]; // wskaźnik pokazuje na ostatni element
cout << pointer_tab - tablica; //rezultat 9

Wskaźnik sam wie o ile ma się przesunąć w przód/tył przy dodawaniu/odejmowaniu dzięki swojej definicji. Dla powyższego przykładu wskaźnik wie że jest typu int (4bajty) i przy dodawaniu przesuwa się o 4 bajty do przodu, analogicznie dla odejmowania. Przy odejmowaniu wskaźników od siebie tak naprawdę jest obliczane ile elementów ich dzieli.

0

A w przypadku takim:

c) *napis - tp[1]

*napis pokazuje mi na 't', tp[1] pokazuje mi na 't' . Czyli dostaje 0 ? < a gdyby byly inne litery to kody Ascii ?

d) *tp+(tp-napis)

tutaj już mam problem z interpretacją ..

EDIT: czytanie ze zrozumieniem ;] Podałem dwa przykłady, jeden wydaje mi się ze zrobiłem, a z drugim mam problem z intepretacją, to takie trudne?

2

Czekasz jak ktoś za ciebie kolokwium napisze?
Masz przetoczone wyżej wszystkie zasady operacji wskaźnikowych.
Jeżeli nadal się gubisz to może nie powinieneś zaliczyć.

0

Ty się nigdy nie gubiłeś i wszystko od razu potrafiłeś?
Chyba po to tu jestem żeby się tego nauczyć, co nie ?
A jeśli mas wrzucać posty nic nie wnoszące do tematu tylko zbędną krytykę to prosiłbym żebyś zostawił to dla siebie!

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