指针可以简单的想象成一个空间中分成连续的无数个小空间,然后每个空间都有一个连续的编号,这些小空间是存储单元,这个编号就是指针。
指针直接操作内存,可以更高效。
存储单元可以单独操纵,也可以连续成组的操纵。
通常情况下一个字节存放一个char类型的数据,两个相邻的字节存储单元可存储short类型的数据,4个相邻的字节存储单元可存储一个long类型的数据。
指针也是变量
指针是能够存放一个地址(编号)的存储单元。
指针存储的数据是另一个数据的地址。
简单来说存放另一个数据地址的变量,就是指针。
&运算符取一个对象的地址。应用于内存中的对象,包括变量鱼数组元素。不能作用于立即数(已经在编译时生成相应的代码)。(这里不作用于表达式、常量和固定的变量不是绝对的,常数在编译时也有一个地址,)
(这里我还没找到一个准确的说法,等之后再研究)
一元运算符“*”是间接寻址或间接引用,它不作用于它的表达式本身,而是作用于表达式的内容,用作指针时它将直接访问指针所指向的对象,
指针的声明
int ip;
这个声明语句说明表达式ip指向的是int类型。
这里需要说明一下为啥需要声明类型,每种类型的存储长度都不一样,所以需要制定类型,如果制定的类型与实际不一样会多余或缺少正确的存储单元,比如char类型需要两个字节,int需要四个,那如果需要的数据是int类型的,而指针只操作了char类型的数据,那么就是个很大的错误(个人理解)
书上后面的函数声明同理,函数atof返回的值和*dp所指向的值都是double类型,而atof的参数是char类型的。这么理解也不太难。
书上之后就写了指针只能指向特定类型的数据类型。这里有个例外就是void空指针可以指向所有数据类型。但是不能间接引用自身(不知道这个间接引用自身是干什么的)
这一节最后重点提到了指针也是变量。指针作为变量存储的就是一个内存中的地址而已。
后面的getint函数有一个地方需要说一下。
判断完输入数的正负之后的for循环。
前面两个分号的号理解,第一个初始化,第二个判断是不是数,第三个是执行循环体后的操作。
这里执行循环体之后会调用getch()函数对变量c进行赋值,然后继续进行判断,每循环一次都会执行getch函数,而getch函数是获取缓冲区的一个值,所以就是每次执行循环体之后再缓冲区取一个值赋给变量c。
然后如果没到文件最后就终止了,那么说明文件末尾之前有不是数字的字符,那么ungetch就把这个字符拿回缓冲区,返回变量c的值(这个c是最后的数字。这里的目的是告诉主函数到什么地方因为什么才终止的。)并结束函数。
练习5.1比较简单,习题解答上也解释了修改的地方,就不写了。
练习5.2也没什么,之前都一样就有一点小数点之后又点问题。简单说一下就行。
前面的都一样,然后读取到小数点,继续读取后面的数字直到结束,这里power记录了小数点之后一共有几位数,1位是1,十位是10,百位是100。
总体的数都是一样计算的,只是口面将数去除以小数点之后的位数,这样就是小数了。
习题解答上也有写。