指针与强制类型转换
所有类型的数据存储在内存中,都是按照二进制格式存储的。内存中只知道有0和1,不知道它是什么类型的。
int、char、short属于整形,他们的存储方式(数转换为二进制往内存中放的方式)是相同的,只是内存格子大小不同(彼此叫二进制兼容格式);而float、double的存储方式彼此不同,和整形更不同。
int a=5; 时,编译器给a分配4个字节空间,并将5按照int类型的存储方式转化成二进制存到a所对应的内存空间去(a做左值);当printf去打印a的时候此时a做的是右值,printf内部的vsprintf函数会按照格式化字符串所代表的类型(%d,%f)去解析a所对应的内存空间,解析出的值用来输出。
c 语言数据类型的本质是决定了这个数在内存中如何存储,决定了这个数如何转化为二进制。内存只是存储1010序列,而不管1010怎么解析。要求我们对数据类型不能瞎搞。
int short char类型是兼容的 int float dobule数据类型是不兼容的。
指针的本质是变量,指针就是指针变量。
一个指针涉及两个变量:一个是指针变量自己本身,一个是指针变量指向的那个变量。
int *p; :定义指针变量时,p是int 类型, p(p指向的那个变量)是int类型的。int *说白了就是指针类型,只要是指针类型都是占4个字节,解析方式都是按照地址方式来解释(意思是里面存的23个二进制加起来表示一个内存地址)的。
对于指针所指向的那个变量来说,指针类型就很重要。指针指向的变量类型要取决于指针类型。
指针的强制类型转换是有风险的
int和char类型都是整形,是兼容的,强制类型转换时有时候对有时候出错。int有两个字节char只有一个,int能表示的范围比int大,超过范围后int朝char转会出错。char往int就就不会出错(127)。short也有两个字节范围比char大还是比int小(65535)。