Wyrazenia i ich wartosc problem

Wyrazenia i ich wartosc problem
M7
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 13 lat
  • Postów:4
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?

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:16 dni
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M7
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 13 lat
  • Postów:4
0

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

mto9
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 10 lat
  • Postów:380
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:

Kopiuj
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.

M7
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 13 lat
  • Postów:4
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?

edytowany 1x, ostatnio: malin7
_13th_Dragon
A no tak, przy a i b to nie miałeś żadnego problemu.
_13th_Dragon
c. - Tak. d. - przy dodaniu do znaku liczby, dodajesz tą liczbę do kodu ASCII znaku, wychodzi liczba którą można potraktować jako kod ASCII
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:16 dni
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ć.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
mto9
dokładnie !
A7
Ja nieraz tęsknię za czasami gdy net nie był tak dostępny. Ludzie jakoś sprawniej mózgu używali. Siadało się z książką, brudnopisem i główkowało i człowiek wtedy potrafił zrozumieć. Teraz często zamiast mózgu używa się neta. Może korzystanie z komputera i internetu powinno być dozwolone dla ludzi, którzy posiadają odpowienie uprawnienia. Tak jak prowadzenie samochodu wymaga posiadania prawa jazdy.
_13th_Dragon
Zgadza się używało się mózgu dla każdego zadania poczynając od podstawówki, więc mózg się trenował. Teraz jest obserwowano zjawisko zaniku mózgu funkcjonujące dokładnie na takiej same zasadzie co zanik mięśni przy długim pozbyciu się grawitacji np. na stacji kosmicznej.
M7
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 13 lat
  • Postów:4
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!

_13th_Dragon
Jeżeli znam zasady to nie mogę się pogubić, co najwyżej mogę się pomylić. Jeżeli ktoś zna zasady a nadal się gubi oznacza to jedno z dwóch (lub oba naraz): - lenistwo; - zbyt niskie IQ aby pojąc zasady.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.