hmmm mam nadzieję, że masz jakiś podstawy bo może Ci się to wydać niezrozumiałe, no to jedziemy!
Zmienna 'napis' jest tylko wskaźnikiem na pewien obszar pamięci gdzie wrzucone są kolejno bajty w kodach oznaczające napis "programowanie" (każdy znak zajmuje jeden bajt). W uproszeniu w pamięci wygląda to następująco:
Kod: Zaznacz cały
INDEX ADRES(HEX) WARTOŚĆ
0 0x00000000 p
1 0x00000004 r
2 0x00000008 o
3 0x0000000C g
i tak dalej. Zauważ że adres zwiększa się o 4, nie o jeden ponieważ pod adresem leżą 4 bajty (na architekturach 32 bitowych) do kolejnego znaku (podkreślam ZNAKU, nie adresu) odwołujesz się przez nawias klamrowy
\(\displaystyle{ napis[0]}\),
\(\displaystyle{ napis[3]}\) itp.
Kompilator, w dużym uproszeniu przekształci to w odwołanie do odpowiedniej komórki pamięci zwiększając adres bazowy (adres pierwszego znaku) o wartość przesunięcia podaną w nawiasie.
I teraz ciekawa rzecz, otóż, mając wyrażenie
\(\displaystyle{ napis = napis+3}\), zmienna napis nie zwiększy się o 3, tylko o 12 (google: arytmetyka pointerów)! Oczywiście tym zajmuje się kompilator w locie, wiedząc że ma do czynienia ze wskaźnikiem. tak więc wyrażenie
\(\displaystyle{ *napis+3 == napis[3]}\) (indeksujemy od 0) (nie muszę tłumaczyć że * zwróci to co jest pod adresem).
d) Ponieważ znak zapisany jest pod postacią bajtu w kodzie ASCII to wyrażenie
\(\displaystyle{ *napis -tp[1] == napis[0] = tp[1]}\) a ponieważ
\(\displaystyle{ tp = napis+3}\) czyli wskazuje na pamięć od znaku 3 (ogramowanie) to wynikiem tego działania będzie
\(\displaystyle{ 'o'-'a' = 111 - 97 = 14}\) (liczę w pamięci mogło mi się coś przesunąć)
Myślę, że z takimi podstawami dasz radę z resztą zadań.