C语言学习记录-12.28

学习内容:

一. 浮点型在内存中的存储和读取方式

1)存储-二进制

组成:“符号位(S)+有效数据(M)+有效位数(E)

就是人为规定,忘了就查。简单来说,三个量确定一个浮点型,有点类似二进制下的科学计数法

占多少内存:

对于32位,S占1bit,E占8bit,M占23bit
对于64位,S占1bit,E占11bit,M占52bit
疑问:E给的bit位是不是太多了,你像E占8bit,可以表达255个有效位数,但是对M来讲它只能保存23bit,等于浪费了“255-23=232”个位数。(我即使把5bit给E,2^5-1=31bit也够M的23bit用的了)
解答:为了表达很小或很大的值,这涉及浮点型取出的规定,E全为0,说明输入的浮点型数太小了,趋近于0;E全为1,说明输入的浮点型数太大了,趋近于无穷大。
两个小点
1.M的第一位永远为1,所以23bit只存小数位,不足,在后面补零。
2.E为无符号数,对32位,要加上127存储起来,对64位,要加1023存储起来。

2)取用-二进制

a) E不全为0,不全为1:E减去127还原最初值,M左边添加1还原被省略没存的1。
b) E全为0: 规定按E=1-127还原最初值,M左边添加0还原。(说明输入的浮点型数太小了,看作于0)
c) E全为1,M全为0:无穷大。(说明输入的浮点型数太大了,看作无穷大)

总的来说,就是规定,用之即可。这也说明,浮点型数据和整型数据不可以乱用,它们的存储和取用的规定方法都是不相同的,在强制类型转化时要注意

二. 再识指针

1)字符指针

例子:char * p= “hello”;
两层意思:
1.指针变量p存储的时字符串“hello”的首字符地址
2.字符串“hello”在这里是常量字符串,是不可以被更改的,有固定的内存地址。

2)指针数组

例子: int* arry[2]={a,b};//a,b都是指针
存放指针的数组。

3)数组指针

int arry[3][2]={{1,2},{3,4},{5,6}};
int (*p)[2]=&arry[1];
p为数组指针,存放的是arry第二行的含有{3,4}的数组地址。对p进行加减可以实现对arry的行的访问。

疑问:*p解引用出来依旧是一个地址(arry第二行的首元素地址)而不是一个值。
解答:参考
https://blog.csdn.net/never___give_up/article/details/104332846
1)*p不是指针变量,p也就不是二级指针,像二级指针但是不是。
2)*p解引用本来该是arry的第二行的一维数组,但是经过隐式转换,arry[1]的数组名由左值退化为右值,右值就是第二行的首元素地址。

这里涉及的左右值

1)左值:在赋值符号的左边,相当于变量。数组名本身是一个左值,等着表达式给它赋值。
2)右值:在赋值符号的右边,相当于表达式。
当数组名放在赋值符号“=”右边时,它就不能再是一个左值了,它就退化为右值(表达式),退化为首元素的地址,然后赋值给“=”左边的左值。
(个人感觉,就像参考文章说的,数组名在“=”右边时,如果还是代表着数组名,它没有意义,一个名字有什么意义,
像“ int a=0; int b=a;",是把变量a里面的赋值给了b,a本身这个变量名赋给b没有意义,是里面的值有意义。a本身在”=“左边是个左值,但是在b中在”=“的右边了,a变成右值(表达式)了。这好像也是隐式转换吧?)(希望理解没错,文章里说的是数组名,我这里举例是整型变量,好像也能说得通)总之,要有意义。

指针和数组名是一回事吗?

https://blog.csdn.net/qq_41680771/article/details/121362810
太复杂了,就了解一部分:
数组类型: arry[]------->arry
指针类型: arry[]------->&arry[0]
说这两者不同,暂且就知道不同,该怎么用还怎么用,都是首元素地址。(有没有可能arry这个数组名能代表的选择多呢?)

数组名可指数组这种数据结构,也可指一个指针常量。数组名从数组创建出什么什么就固定(不求甚解,就首元素地址固定),但数组指针可变(可以指向别的数组)。

总结一下:

什么别管,*p,*x,*y,解引用解出来就看作是刚开始定义的名字,变量名也罢,数组名也罢,就看做那个名字,那个名字代表变量就当变量用,那个名字代表数组名就当首元素地址用。


学习产出:

  • CSDN 无技术博客 1 篇

你可能感兴趣的:(c语言,学习,开发语言)