C/C++的数据类型解读

常用的字符类型

常用的类型包括布尔型(bool)、字符型(char)、整型(int)、浮点型(float)、双浮点型(double)、无类型(void)、宽字符型(wchar_t)
其所占字节长度及其数值范围如下图所示
引用

图片引自 http://www.runoob.com/cplusplus/cpp-data-types.html

计算运存与内存地址

1、一般计算机的系统是32位,这个32位指的是cpu指一次性可处理的数据量是 232 个。

举个例子;
如果一个计算机系统是1位的,则一次性可处理2个数,即:
0,1
如果一个计算机系统是2位的,则一次性可处理4个数,即:
00,01,10,11
如果一个计算机系统是3位的,则一次性可处理8个数,即:
000,001,010,011
100,101,110,111
……
以此类推
如果一个计算机系统是32位的,则一次性可处理 232 个数,即:
0000 0000 0000 0000 0000 0000 0000 0000

1111 1111 1111 1111 1111 1111 1111 1111
那么这些数字表示的就是地址。

简单的说,一个32位系统将内存分割成 232 份,每份内存是一个字节大小(8个bite位)并按顺序排列,某一份内存的顺序号用这个32个二进制位来表示,这个32位的二进制数表示的就是地址。

这个32位的二进制数由于长度较大,所以通常用8个十六进制位来表示,即:
0x00000000至0x f f f f f f f f

所以,一般来说,一个地址指向一个字节长度的内存。

数据类型的含义

对于一个数据类型,本质上就是针对不同类型的内存布局及其相关的操作。

比如定义一个数组:

int arr [3]

其中,arr是变量名,计算机会给这个数组变量申请 3个int长度的内存长度(3*8个字节)。

对于数组来说,arr是数组的名字,也就是数组的首地址。如果执行以下代码:

  1 #include <stdio.h>
  2 
  3 int main()
  4 {
  5 int arr[3]={2,23,4};
  6
  7 printf("address=%p \n",arr); //输出arr的值(地址)
  8 printf("address=%p \n",arr+1); //输出arr+1的值(地址)
  9 printf("address_val=%d \n",*arr); //输出arr指向的数组值
 10 printf("address_val=%d \n",*(arr+1)); //输出arr指向的数组值
 11 return 0;
 12 }

运行结果:

address=0xbfe06e08 
address=0xbfe06e0c 
address_val=2 
address_val=23 

以上代码证明以下结论:
1、arr代表arr[0]的地址,arr+1代表arr[1]的地址
2、arr与arr+1之间,相差一个int的字节长度,即4个字节长度

若定义一个二维数组:

  1 #include <stdio.h>
  2 
  3 int main()
  4 {
  5 
  6 int b[2][3]={{1,2,3},{4,5,6}};     //定义二维数值及赋值
  7 
  8 printf("b=%p \n",b);                //b的值
  9 printf("b+1=%p \n",b+1);            //b+1的值
 10 
 11 printf("b0+1=%p \n",b[0]);          //b[0]的值
 12 printf("b0+1=%p \n",b[0]+1);        //b[0]+1的值
 13 
 14 printf("b00=%p \n",&b[0][0]);       //b[i][j]的地址
 15 printf("b01=%p \n",&b[0][1]);
 16 printf("b02=%p \n",&b[0][2]);
 17 printf("b10=%p \n",&b[1][0]);
 18 printf("b11=%p \n",&b[1][1]);
 19 printf("b12=%p \n",&b[1][2]);
 20
 21 return 0;  
 22 }

运行结果:

b      = 0xbf966554 
b+1    = 0xbf966560 

b[0]+1 = 0xbf966554 
b[0]+1 = 0xbf966558 

b[0,0] = 0xbf966554 
b[0,1] = 0xbf966558 
b[0,2] = 0xbf96655c 
b[1,0] = 0xbf966560 
b[1,1] = 0xbf966564 
b[1,2] = 0xbf966568 

通过上述结果,可以得到以下结论:
1、b、b[0]、b[1]都代表变量名,表示地址;b[i][j]表示存储在内存的数值。
2、b 和 b+1 之间相差12个字节,即3个int位。
3、b[0] 和 b[0]+1 之间相差4个字节,即1个int位。
4、b变量的数据类型是 int [3],类似于 int [3] b[2],数学上代表矩阵的行数
5、b[0]变量的数据类型是 int,类似于 int b[0] [3],数学上代表矩阵的列数

猜你喜欢

转载自blog.csdn.net/qq_39982235/article/details/88609708
今日推荐