2016-07-17 5 views
-1

Почему все указатели в C имеют одинаковый размер? Я на 64-битной арке.Почему указатели имеют одинаковый размер в C

#include<stdio.h> 

int main(){ 
printf("int\t%ld\n",sizeof(int*)); 
printf("char\t%ld\n",sizeof(char*)); 
printf("void\t%ld\n",sizeof(void*)); 
printf("float\t%ld\n",sizeof(float*)); 
} 

OP : 
int  8 
char 8 
void 8 
float 8 
+1

Почему бы им не иметь такой же размер? –

+0

Они не гарантированы одинакового размера, но обычно они всегда: http://stackoverflow.com/questions/1241205/are-all-data-pointers-the-same-size-in-one-platform-for-all- типы данных – SurvivalMachine

+1

Предположим, что у одного из них был меньший размер, что поставило бы большой предел на то, где вещи такого типа могут существовать в памяти. – harold

ответ

3

Потому что все, что вам нужно, это 64 бита индексировать адреса памяти и все типы данных, которые Вы перечислили только нужно индексировать адреса памяти (где приведенных данных «начинается» в памяти). Обратите внимание, что это верно для C, но в C++, например, указатели на функции-члены могут быть больше.

+0

Да, все они указывают на адрес памяти. Причина, по которой они все еще отличаются от типа данных, таких как int char и т. Д., Является компилятором C для арифметики указателей. Например, добавление указателя «char» будет увеличиваться на один, означающий следующий байт, и четыре для «int». – Nishant

+1

@ Нишан: это следствие причины, но не причина. Если бы это было причиной, для любых 'T' и' U', где 'sizeof (T) == sizeof (U)', мы могли бы сказать, что 'T *' совпадает с 'U *' - явно не так, например различные структуры. Причина в том, что безопасность типов и необходимость в операторе разыменования иметь определенный конкретный тип возврата. Следствием этого является то, что теперь компилятор может сделать значительную арифметику указателей. – lorro

Смежные вопросы