为什么sizeof(int)与sizeof(int *)不同?

时间:2012-06-11 17:18:35

标签: c++ c sizeof

我想知道为什么在以下程序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 个答案:

答案 0 :(得分:15)

intint*的大小完全取决于编译器和硬件。如果您在int*中看到八个字节,则可能有64位硬件,每个指针转换为八个字节。

希望这有帮助!

答案 1 :(得分:7)

sizeof(char) == 1

没有其他保证(*)。

实际上,指针在16位系统上为2,在32位系统上为4,在64位系统上为8。

<小时/> (*)见James Kanze的评论。

答案 2 :(得分:4)

指针的大小是系统,编译器和体系结构相关的。在32位系统上,它通常是32位,而在64位系统上,它们通常是64位。

如果你试图将一个指针存储到一个整数中以便以后再次恢复到指针,你可以使用类型intptr_t这是一个足以保持(我相信)正常的非整数类型的整数类型(非函数) )指针类型。

答案 3 :(得分:2)

  

对于32位系统,'事实上'标准是ILP32 - 即int,   long和指针都是32位数量。

     

对于64位系统,主要的Unix'事实上'标准是LP64 -   long和指针是64位(但int是32位)。 Windows 64位   标准是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   比特等。

请参阅此question