c语言指针和内存原理(1)

分配内存

c语言常见的分配内存主要为变量声明和malloc方法,这篇文章主要讨论变量声明部分

变量声明包含变量类型与变量名称两个属性,而变量类型又包括非数组变量类型和数组变量类型

非数组变量类型

int,short,float,double,char,结构体,联合体等

数组变量类型

多个同样的变量组成的一维构造类型

包含元素个数元素的变量类型两个属性

如int[2],char[3]

数组变量类型的元素也可以为其他数组变量类型

如int[2][3]的每个元素都是int[3]类型

指针变量类型

指针变量类型其实也是非数组变量类型

任意一种变量类型,都有指向其的指针变量类型

这里要区分一下

int(*)[2]是一个指针变量类型,指向一个int[2]类型

int*[2]是一个数组变量类型,其每个元素是int*指针变量类型

Tip: 把int*作为一个整体来看待,这样后面加上[2]就能理解为什么是数组变量类型了

同理,再拓展一下:int*(*)[2]表示一个指针类型,其指向一个数组类型,数组类型的元素类型是指针类型

值包含两个层面的语义:值,值的类型

一个值记作<V, V_T> V表示值,V_T表示值类型

内存变量类型 vs 表示值类型

内存变量类型:用于内存分配时确定按什么类型去申请内存

表示值类型:用于外部观察这块内存能看到的值的类型

这里有点绕,对于int等非数组类型类型,这两个定义还没有区别,我们举一个数组的例子来理解

int a[10];

内存变量类型:我们要从内存分配的角度去思考,要为这个数组变量申请空间,所以我们可以得知内存变量类型为数组变量类型,每个元素类型为int

表示值类型:我们外部观察该变量时,想要知道这段内存表示的数据信息,因此V表示内存分配的第一个字节编号,V_T是一个指针类型,为int*

内存六元组模型

Address: 这一段内存的第一个字节的编号

Variable_Type:变量类型

Name:变量名字

Size:占用字节数量

Value:这段内存的表示值

Value_Type:表示值的类型