c语言中变量数据类型

c中变量数据类型有两个作用:指定变量所占内存的长度(n个字节);指定变量的解析方法(告诉编译器如何看待、理解这个变量)。

1.指定变量所占内存的长度

int a;          //指定变量a所占内存为4个字节长度(32位机器中)

2.指定变量所占内存的解析方法

要知道所有的类型的数据存储在内存中,都是按照二进制格式存储的。所以内存中只知道有0和1,不知道是int的、还是float的还是其他类型。int、char、short等属于整形,他们的存储方式(数转换成二进制往内存中放的方式)是相同的,只是内存格子大小不同(所以这几种整形就彼此叫二进制兼容格式);而float和double的存储方式彼此不同,和整形更不同。

如:定义变量int a = 5;时,编译器给a分配4字节空间,并且将5按照int类型的存储方式转成二进制存到a所对应的内存空间中去(a做左值的);我们printf去打印a的时候(a此时做右值),printf内部的vsprintf函数会按照格式化字符串(就是printf传参的第一个字符串参数中的%d之类的东西)所代表的类型去解析a所对应的内存空间,解析出的值用来输出。也就是说,存进去时是按照这个变量本身的数据类型来存储的(譬如本例中a为int所以按照int格式来存储);但是取出来时是按照printf中%d之类的格式化字符串的格式来提取的。此时虽然a所代表的内存空间中的10101序列并没有变(内存是没被修改的)但是怎么理解(怎么把这些1010转成数字)就不一定了。譬如我们用%d来解析,那么还是按照int格式解析则值自然还是5;但是如果用%f来解析,则printf就以为a对应的内存空间中存储的是一个float类型的数,会按照float类型来解析,值自然是很奇怪的一个数字了。

int * p ;     //告诉编译器如何看待p:它是一个指针变量,其内部存储的是int类型变量的地址。

C语言中的数据类型的本质,就是决定了这个数在内存中怎么存储的问题,也就是决定了这个数如何转成二进制的问题。一定要记住的一点是内存只是存储1010的序列,而不管这些1010怎么解析。

关于类型(不管是普通变量类型int float等,还是指针类型int *   float *等),只要记住:
类型只是对后面数字或者符号(代表的是内存地址)所表征的内存的一种长度规定和解析方法规定而已。

(int *)0和(Int)0都是将0这个数字变成一个地址,不同在于:(int *)0是将0变成这样一个地址:该地址所在的内存用来存储一个int类型变量的地址;(Int)0是将0变成这样一个地址:该地址所在的内存用来存储一个int类型变量。

题外话:指针变量的类型对指针变量的影响

C语言中的指针,全名叫指针变量,指针变量其实跟普通变量没有任何区别。譬如int a和int *p其实没有任何区别,a和p都代表一个内存地址(譬如是0x20000000),但是这个内存地址(0x20000000)的长度和解析方法不同。a是int型所以a的长度是4字节,解析方法是按照int的规定来的;p是int *类型,所以长度是4字节,解析方法是int *的规定来的(0x20000000开头的连续4字节中存储了1个地址,这个地址所代表的内存单元中存放的是一个int类型的数)。

猜你喜欢

转载自blog.csdn.net/weixin_39330853/article/details/81604884