ReadingLab / Discussion-for-Cpp

C++ 中文讨论区
MIT License
88 stars 63 forks source link

sizeof(arr) 时的一些问题 #21

Closed PeteHenry closed 9 years ago

PeteHenry commented 9 years ago
    unsigned long long ival1 = 1024;
    unsigned long ival2 = 1024;
    unsigned int ival3 = 1024;
    unsigned short ival4 = 1024;
    cout << ival1 << " | " << sizeof(ival1) << endl; // char 8位,sizeof char类型为1, long long 64位,所以此行为 8
    cout << ival2 << " | " << sizeof(ival2) << endl; // long 32位,同理行为 4
    cout << ival3 << " | " << sizeof(ival3) << endl; // 一般定义 int 会自动提升为 long 的精度,所以也为 4,是这样?
    cout << ival4 << " | " << sizeof(ival4) << endl; // short 为16位,此行为 2    , 无符号 8位, Math.pow(2,8)=256, 1024 会溢出,所以自动提升了精度?

    int arri[10], *p = arri;
    cout << sizeof(arri) / sizeof(*arri) << endl;   // *arri 为指向数组 arri 第一个元素的指针,sizeof(arri) 为40, sizeof(*arri) 为4
    cout << sizeof(p) / sizeof(*p) << endl;

话说,最后两个的一开始的答案是:11/10cout << sizeof(arri) / sizeof(*arri) << endl;我后面的注释如果对,就应该了解了 最后一个,还是不怎么理解 对 p*p 的理解,如下:

    int ival = 1024, *p = &ival;    //  p 是指向整型变量 ival 的指针
    *p = 0;                         //  对 p 进行解引用,其实得到的是指针 p 所指向的对象 ival, 所以相当于 ival = 0; 这条赋值语句
    p = 0;                          // 没有解引用时就是自己,所以 p 指针就变成了空指针,不指向任何对象

Q:cout << sizeof(p) / sizeof(*p) << endl; 来帮我解释下,谢谢

pezy commented 9 years ago
  1. sizeof 返回的是字节(byte)。通常,1 byte = 8 bits. 但这取决于体系结构,并非一定如此。
  2. 《C++ Primer 5th》Table 2.1 上列出的是 Minimum Size,标准规定的也是最小长度。于是,long long 最小长度是 64 bits,即 8 byte,故返回 8long 最小是 32 bits,即 4 byte,故返回 4int 最小是 16 bits,即 2 byte,但因为我们的机器目前至少是 32 bits 机器了,甚至是 64 bits 机器。所以 int 目前通常被规定为 32 bits(没错,就是为了和机器的【字】大小对齐),即 4 byte。而最小长度却被保留下来了(上个时代,16 bits 机器是主流)。这里不存在你说的【自动提升】。
  3. unsigned shortshort 最小都是 16 bits,即 2 bytes2 ** 16 == 65535,1024 并未溢出。
  4. 指针的长度,与机器【字】长保持绝对一致(实际表现为与编译环境的【字】长保持一致)。故在 32 bits 编译器下,长度为 32 bits, 4 byte,等于 int 的长度;在 64 bits 编译器下,长度为 64 bits, 8 byte,是 int 的两倍。故 sizeof(p) / sizeof(*p) 的输出在 32 bits 环境下为 1,在 64 bits 环境下为 2
  5. 数组那块,你理解的没错。
PeteHenry commented 9 years ago

short 的确是 2^16, char 才是 2^8, - -!!

对于 sizeof(p) / sizeof(*p)

  1. 因为指针 p 是指向 int 型的变量, 所以 sizeof(*p) 一定为 4
  2. 根据 @pezy 所说, 指针的长度, 与机器 【字长】保持一致, 所以 sizeof(p)64 bits 下为 8, 在 32 bits 下为 4, 是这样吧, @pezy thk
pezy commented 9 years ago

@PeteHenry Yes.