(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 就只占一個字節,與系統無關。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM