C——《C和指针》第六章读书笔记

    好久没看关于C语言的资料。之前看的比较多,一看到C的东西就想吐。然后最近一年都没看C的知识,感觉有些东西慢慢又遗忘或模糊了。这时候掏出《C和指针》好好的回味一番,感觉味道真TM好~~


1、边界对齐问题。

    在第六章的开头提到了“边界对齐”问题。在绝大多数情况下,它确实很少影响C程序员。但是对于某些不能自动对齐的单片机,如STM32F030(我以前遇到过),就需要注意边界对齐问题,在定义结构体的时候就要考虑到对齐问题;不然调试的时候会各种硬件错误。

    而且就算是对于能够自动对齐的MCU,如果能够做到内存对齐,也会使程序更有效率。

2、变量名与内存位置之间的关系

         假设定义了int a =100;

         这里变量名和内存位置之间的关联不是硬件提供的,它是由编译器为我们实现的。变量给我们更方便的方法记住地址————硬件仍然是通过地址访问内存位置

3、指针常量(P98)

         假定变量a存储于位置100,来看一下下面这条语句

                   *100= 25

         它看上去是把25赋值给a,因为a是位置100所存储的变量。但是,这条语句实际是非法的。因为字面值100的类型是整形,而间接访问操作只能作用于指针类型表达式。如果确实想把25存储于位置100,那么必须使用强制类型转换。

                   *(int *)100 = 25

         强制类型转换把值100从整形转换成“指向整形的指针”。

         书上提到,“使用这种方法的机会是绝无仅有的”,因为我们无法预测编译器把变量放在什么位置。

         但是在单片机中,这种方法倒是大量使用。在单片机中,经常需要通过地址访问硬件本身,如访问某个外设。当然,外设的地址是预先知道的。

4、指针的减法运算:

        两个指针指向的是同一个数组中的元素,指针的减法才有意义。就像如果你把两个位于不同街道的房子的门牌号码相减,不可能获得这两所房子间的房子数一样。程序员无从知道两个数组在内存中的相对位置,如果不知道这一点,那么两个指针之间的距离就毫无意义。

5、在第111页记录了一个关于指针的“深坑”。下面是摘录

        

        int value[n];        //伪码

         for(p = &value[n-1] ; p > =  &value[0] ;  p-- )

                   *p = 0

    这是一个把数组清零的例子,只不过是从后往前清零。当数组的第一个元素被清零后,p的值还将减1,而接下去的比较运算是用于结束循环的。但这就是问题所在:比较表达式p >= &value[0]的值是未定义的,因为p移动到了数组的边界之外。标准允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针进行比较,但是不允许与指向数组第一个元素之前的那个内存位置的指针进行比较。

    实际上,大多数C编译器中,这个循环能顺利完成。但是还是应该避免这样使用,因为标准并不保证它可行。迟早可能遇到一台这个循环会运行失败的机器。

猜你喜欢

转载自blog.csdn.net/fxltsbl007/article/details/80345603