知识点1【数据类型】
数据类型的本质作用:合理地利用空间
数据的基本类型包括:char short int long float double。
知识点2【指针变量的定义】
内存的管理:将内存抽象成一个很大的一堆字符数组。对内存中的每一个字节分配一个32位或64位的编号(与32位和64位处理器有关),这个编号被称作内存地址。定义一个变量来储存上述编号,这样的变量就被称为指针变量。
#include<stdio.h>
int main(){
int num=100;
printf("%p\n",&num);
return 0;
}
代码中 & 用来取变量的地址,依据知识点1的内容,int类型的变量num在内存中占用四个字节,而&num代表的是变量num的起始地址,也就是它占用的四个字节中的第一个。
我们在上面已经说过,定义指针变量的目的是保存num的地址,在上图第四行代码,也就是定义指针变量时,【*】是表示p是指针变量,而不是普通变量。将“NULL”赋值给【*p】则是将指针变量初始值定义为空。第五行代码,计算出了指针变量p在内存中占有8个字节。指针“一般”占4字节,任何一个数据类型的大小都是不固定的,要看机器和标准库,64位8个字节32位4个。在第六行代码执行后,num的地址便与p建立了关系。如第八行代码,在指针变量的使用中,*p表示取p保存的地址对应空间的内容,即num的地址。
知识点3【指针变量的类型】
自身的类型:在指针变量定义的时候,定义语句除去变量名,剩下的便是指针变量自身的类型。
例如,p自身的类型便是int *
指向的类型:在指针变量定义的时候,定义语句除去变量名及离它最近的一个*,剩下的便是指针变量指向的类型。
例如,p指向的类型便是int
指针变量指向的类型决定了指针变量所取空间的宽度,决定了指针变量+1跳过的单位跨度。
如上图代码及其运行结果,不难发现,指向的类型为int的变量p+1之后表示num地址的数值增加了4,而指向的类型为char的变量p1经过如此变化之后数值仅增加了1。这个跨度是由指针变量指向的类型决定的,根据知识点1,int变量占4个字节,char变量占1个字节,给指针变量加上一个整数实际上加的数是这个整数和指针数据对应字节数的乘积。
p只保存了num的首地址,但能把空间里面的东西取出来的原因就是指针变量指向的类型决定了指针变量取物空间的宽度。同样根据知识点1,int变量占4个字节,char变量占1个字节,short变量占2个字节,而16进制数每2位占用一个字节,由此便出现这种情况。