(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 就只占一个字节,与系统无关。

posted @ 2019-03-29 15:35  退後。  阅读(5414)  评论(0编辑  收藏  举报