用内存的视角来剖析C/C++语言中的变量、数组、结构、指针等概念的本质
对于C/C++中的很多概念从内存的视角可以深入理解它们的本质
注:对于多个连续的字节存储,根据CPU平台以及开发环境的不同,分为大端和小端存储。如下图所示,存储int类型的变量a=0xABCDEFAA(4个字节)时,图1是小端存储,图2是大端存储。
内存是用于存储数据的物理器件,拆开计算机就可以发现一块长方形的内存条。数字最终是以二进制的形式存储于内存中,因为二进制只有2个符号,便于用物理量进行表示,类似于开关量,即每个字节有8个开关,其不同组合可以表示不同的数。
(1)变量
对于变量来说,首先要知道变量的类型,即确定用几个字节来表示这个变量的值,不同类型的变量对应于不同区域的内存,区域大小即字节个数,由变量的类型决定。不管是基本类型还是派生类型,本质并无区别,仅仅是所占用的内存字节数大小不同而已C/C++中的数据类型如下图所示。
(2)数组
数组用于表示若干个相同类型的变量(结构体用于表示若干个不同类型的变量),对于数组来说,它也是变量,仅仅相当于若干个相同基本类型变量连续排列在一起,在内存中连续排列。如short a[3]={0x1111,0x2222,0x3333};内存视图如下所示。
(3)结构体
与数组并无本质区别,不同的是结构体内的变量可以是不同类型的数据。
struct Body
{
int a;
short b;
char c;
};
struct Body d={0x12345678,0x1234,0x12};
内存视图如下:
(4)指针
指针即变量的首地址,本质是一个整数,理论上可以用int或short进行表示,但为了突出强调它是一个内存地址,提出一个新的类型,指针类型来表示,如指向int型变量的指针int *P=0xABCDEFFF。
1、指向不同类型的变量表示不同的指针类型:int*,short*,char*
2、指针也是变量,变量就是可以改变的,即指向的地址改变。
3、不同类型的指针不能相互赋值,指向不同类型的数据,占据不同的字节数
4、指针本质就是一个整型
5、指针有星号操作,即取指针指向的变量的值