Jaki jest rozmiar wskaźnika?

Czy wielkość wskaźnika jest taka sama jak wielkość typu, na który wskazuje, czy wskaźniki zawsze mają stały rozmiar? Na przykład...

int x = 10;
int * xPtr = &x;
char y = 'a';
char * yPtr = &y;

std::cout << sizeof(x) << "\n";
std::cout << sizeof(xPtr) << "\n";
std::cout << sizeof(y) << "\n";
std::cout << sizeof(yPtr) << "\n";

Jaki byłby wynik tego? Czy sizeof(xPtr) zwróci 4 i sizeof(yPtr) zwróci 1, Czy 2 wskaźniki zwrócą ten sam rozmiar? Powodem, dla którego pytam, jest to, że wskaźniki przechowują adres pamięci, a nie wartości ich odpowiednich przechowywanych adresów.

Author: gobernador, 2011-07-19

7 answers

Wskaźniki zazwyczaj mają stały rozmiar, np. na 32-bitowym pliku wykonywalnym są zwykle 32-bitowe. Istnieją pewne wyjątki, jak na starych 16-bitowych oknach, kiedy trzeba było rozróżniać wskaźniki 32-bitowe i 16-bitowe... Zazwyczaj można założyć, że będą one jednolite w obrębie danego pliku wykonywalnego na współczesnych systemach operacyjnych.

Edit: mimo to, zdecydowanie przestrzegałbym przed dokonaniem tego założenia w Twoim kodzie . Jeśli masz zamiar napisać coś, co absolutnie ma aby mieć wskaźnik o określonej wielkości, lepiej to sprawdzić!

Wskaźniki funkcji to inna historia -- zobacz odpowiedź Jensa aby uzyskać więcej informacji.

 64
Author: Nathan Monteleone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:37

Wskaźniki funkcji mogą mieć bardzo różne rozmiary, od 4 do 20 bajtów na maszynie X86, w zależności od kompilatora. Więc odpowiedź brzmi nie-rozmiary mogą się różnić.

Inny przykład: weźmy program 8051, który ma trzy zakresy pamięci, a więc ma trzy różne rozmiary wskaźników, od 8 bitów, 16 bitów, 24 bitów, w zależności od tego, gdzie znajduje się cel, nawet jeśli rozmiar celu jest zawsze taki sam (np. char).

 62
Author: Jens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-19 18:07:28

Na maszynie 32-bitowej wskaźnik ma 32 bity( 4 bajty), podczas gdy na maszynie 64-bitowej ma 8 bajtów. Niezależnie od tego, na jaki typ danych wskazują, mają stały rozmiar.

 11
Author: peeyush,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-19 18:01:45

Wskaźniki nie zawsze są tego samego rozmiaru na tej samej architekturze.

Możesz przeczytać więcej o pojęciu wskaźników "bliskich", "dalekich" i "ogromnych", jako przykład przypadku, w którym rozmiary wskaźników różnią się...

Http://en.wikipedia.org/wiki/Intel_Memory_Model#Pointer_sizes

 7
Author: Soumajyoti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-06 21:24:53

Aby odpowiedzieć na twoje inne pytanie. Wielkość wskaźnika i wielkość tego, na co wskazuje, nie są ze sobą powiązane. Dobrą analogią jest uważanie ich za adresy pocztowe. Wielkość adresu domu nie ma związku z wielkością domu.

 6
Author: Jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-19 20:49:35

Mogą być różne na maszynach word-adresowalnych (np. systemy Cray PVP).

Większość dzisiejszych komputerów to Maszyny adresowalne bajtami, gdzie każdy adres odnosi się do bajtu pamięci. Tam wszystkie wskaźniki danych mają zwykle ten sam rozmiar, a mianowicie rozmiar adresu maszyny.

Na maszynach z adresami word, każdy adres maszyny odnosi się zamiast tego do słowa większego niż bajt. Na nich wskaźnik (char*) lub (void*) do bajtu pamięci musi zawierać zarówno adres słowa, jak i Bajt przesunięcie w obrębie dodanego słowa.

Http://docs.cray.com/books/004-2179-001/html-004-2179-001/rvc5mrwh.html

 2
Author: Markus Kuhn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-12 14:17:18

Wielkość wskaźnika jest wielkością wymaganą przez system do przechowywania unikalnego adresu pamięci (ponieważ wskaźnik zawiera tylko adres, na który wskazuje)

 0
Author: J T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-19 18:02:05