Почему sizeof(int) отличается от sizeof (int*)?

мне интересно, почему в следующей программе sizeof(int) возвращает другое значение, чем sizeof(int*).

вот небольшая программа:

int main(){
    std::cout<<sizeof(int)<<endl;
    std::cout<<sizeof(int*)<<endl;
    return 0;
}

и вот результат:

4
8

до сих пор я помню, что размер целочисленного указателя-4byte(компилятор gcc). Как проверить правильный размер указателя? Это зависит от компьютера?

я запускаю ubuntu 12.04

# lsb_release -a

Distributor ID: Ubuntu 
Description: Ubuntu 12.04 LTS 
Release:    12.04 
Codename:   precise

размер указателя не является постоянным(стандартный размер) 8 байт.

4 ответов


размер int и int* полностью зависят от компилятора и оборудования. Если вы видите восемь байтов, используемых в int*, у вас, вероятно, есть 64-разрядное оборудование, которое преобразуется в восемь байтов на указатель.

надеюсь, что это помогает!


sizeof(char) == 1

других гарантий (*) нет.

на практике указатели будут размером 2 в 16-битной системе, 4 в 32-битной системе и 8 в 64-битной системе.


( * ) См. комментарий Джеймса Канзе.

размер указателя зависит от системы, компилятора и архитектуры. В 32-разрядных системах это обычно 32 бита, в то время как в 64-разрядных системах это обычно 64 бита.

Если вы пытаетесь сохранить указатель в целое число для последующего восстановления в указатель снова, вы можете использовать тип intptr_t который является интегральным типом, достаточно большим, чтобы удерживать (я считаю) нормальные (нефункциональные) типы указателей.


для 32-разрядных систем стандартом "de facto" является ILP32-то есть int, long и pointer - все 32-разрядные величины.

для 64-разрядных систем основным стандартом "de facto" Unix является LP64 - long и pointer-64-разрядные (но int-32-разрядные). 64-разрядная версия Windows стандарт LLP64-long long и указатель 64-бит (но long и int оба 32-бит).

в свое время некоторые системы Unix использовали организацию ILP64.

ни один из эти стандарты де-факто законодательно закреплены стандартом C (ISO / IEC 9899: 1999), но все разрешены им.

и

если вы относитесь с удобоносимостью, или вы хотите имя тип отражает размер, вы можете посмотреть заголовок, где доступны следующие макросы:

int8_t int16_t int32_t int64_t

int8_t гарантированно будет 8 бит, и int16_t гарантированно 16 биты, так далее.

посмотреть этот вопрос.