zoukankan      html  css  js  c++  java
  • (C/C++学习)23.C++中指针的长度

    引言:先看下面一个程序会打印出什么?

      1 #include<iostream>
      2 using namespace std;
      3 int main()
      4 {
      5     int a = 2;  	    int *p = &a;
      6     double b = 1;   	double *q = &b;
      7     float c = 3;    	float *l = &c;
      8     char d = 's';      	char *s = &d;
      9 
     10 
     11     cout << sizeof(a) << "" <<sizeof(p) << endl;
     12     cout << sizeof(b) << "" << sizeof(q) << endl;
     13     cout << sizeof(c) << "" << sizeof(l) << endl;
     14     cout << sizeof(d) << "" << sizeof(s) << endl;
     15     return 0;
     16 }

    64 位Linux 下测试结果:

      1 4 8
      2 8 8
      3 4 8
      4 1 8

    64 位Windows下测试结果:

      1 4  4
      2 8  4
      3 4  4
      4 1  4
      5 

    好奇的人可以自己去测试结果,这里留点悬念!我只告诉你不同的电脑、不同的编译器都有可能得出不一样的结果。为什么呢?请往下看:

    首先:

          1. 操作系统有32/64位之分,但同时CPU也有32/64位之分(Windows 在cmd终端下用 systeminfo 命令可以查看自己的操作系统以及cpu位数);

          2. 32位CPU只能安装32位系统,64位CPU可以安装32位操作系统,也可以安装64位操作系统;

          3. 一般来说,在64位系统下,指针长度为8,32位系统下,指针长度位4;但是有的编译器为了不同的操作系统之间相互兼容,内部对指针进行了包装,使得不管在64位还是32位系统下,指针都是4个字节长度。

          4. 64位系统,这个位数指的是CPU里面的通用寄存器的数据宽度为64位,也就是说一个地址占二进制位数是64,而指针其实是一个地址,所以:

      1 sizeof(double *)==sizeof(int *)==sizeof(char *)==64/8==8

           这里除以8是因为,我们用sizeof()计算的是某个数据类型所占的字节个数,用此字节个数来表示这个数据类型的大小 ,而我们都知道,一个字节所占的二进制位为8位,因此才除以8.

          5. 32位系统,同理,一个地址占32位二进制空间,sizeof(double *)==sizeof(int *)==sizeof(char *)==32/8==4   

    注意:地址艮系统的位数有关,但是基本的数据类型所占字节数(大小)是由C语言本身决定的,如:int 就只占4个字节,char 就只占一个字节,与系统无关。

  • 相关阅读:
    1152 Google Recruitment (20 分)
    1095 解码PAT准考证 (25 分)
    1093 字符串A+B (20 分)
    1094 谷歌的招聘 (20 分)
    拖动无边框窗体
    全屏显示窗体
    动态按钮的窗体界面
    以树形显示的窗体界面
    设计软件启动界面
    动画显示窗体
  • 原文地址:https://www.cnblogs.com/tuihou/p/10621647.html
Copyright © 2011-2022 走看看