• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Arytmetyka wskaźnikowa

Object Storage Arubacloud
0 głosów
642 wizyt
pytanie zadane 6 lipca 2015 w C i C++ przez mrcnsct Nałogowiec (36,390 p.)
#include <stdio.h>
int main()
{int x1,x2;
double y1,y2;
int *px1, *px2;
double *py1,*py2;
x1 = 10;
x2 = 333;
y1 = 9.99;
y2 = 999.999;
px1 = &x1;
py1 = &y1;
px2 = px1 - 1;
py2 = py1 - 1;
printf("\n zmienna x1 = %10d, adres = %8u",*px1,&x1);
printf("\n zmienna x2 = %10d, adres = %8u",*px2,&x2);
printf("\nzmienna y1 = %10.4f,adres = %8u",*py1,&y1);
printf("\nzmienna y2 = %10.4f,adres = %8u",*py2,&y2);
return 0;
}

Uczę się programowania w C i nie rozumiem dlaczego, gdy od adresu zmiennej x1 odejmiemy 1 razy rozmiar zmiennej, da to adres zmiennej x2. Taka sama sytuacja ze zmiennymi y1 i y2 (linijki 13 i 14). I jeszcze jedno pytanie, jaki specyfikator do wypisywania adresu? %p, czy %u tak jak w przykładzie powyżej?

1 odpowiedź

+5 głosów
odpowiedź 6 lipca 2015 przez hit02 Nałogowiec (33,970 p.)
wybrane 7 lipca 2015 przez mrcnsct
 
Najlepsza
Najpierw drugie pytanie, bo prostrze. Do pointerów zazwyczaj używa się %p, ale oczywiście wszystko zależy od potrzeb.

To, że po odjęciu 1 (rozmiaru zmiennej) od pointera uzyskujesz adres następnej zmiennej, wynika z budowy stosu i tego, że kompilator nie poprzestawiał zmiennych. Stos na x86 (procesor w komputerze) rośnie w dół (ku mniejszym adresom), a to właśnie na stosie są zmienne lokalne. Jeśli zmienne są jedna po drugiej, to po odjęciu rozmiaru od adresu zmiennej zadeklarowanej wcześniej spowoduje uzyskania adresu następnej zmiennej.

Na stosie możesz też znaleźć kilka innych ciekawych żeczy. Jeśli cię to bardziej interesuje, to polecam poczytać o takiej strukturze, jak Ramka Stosu (ang. Stack Frame).

Podobne pytania

0 głosów
1 odpowiedź 517 wizyt
pytanie zadane 14 marca 2019 w C i C++ przez Curiosis Użytkownik (540 p.)
0 głosów
1 odpowiedź 248 wizyt
0 głosów
2 odpowiedzi 1,678 wizyt
pytanie zadane 3 kwietnia 2017 w C i C++ przez Kamil Duljas Użytkownik (990 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...