C语言------指针

1. 每个字节包含8个位,为了存储更大的值,我们把两个或更多个字节合在一起作为一个更大的内存单位。每个字一般由2个或4个字节组成。需要注意的是,尽管一个字包含了4(或2)个字节,它仍然只有一          个地址。

2. 指针的初始化是用&操作符来完成的,它用于产生操作数的内存地址。

3. 一个变量的值就是分配给这个变量的内存位置所存储的数值,即便是指针变量也不例外。

4. 通过一个指针访问它所指向的地址的过程称为间接访问(indirection)或解引用指针(dereferencing the pointer)这个用于执行间接访问的操作符是单目操作符 “*”。

5. 对指针进行解引用操作可以获得它所指向的值。从定义上看,NULL指针并未指向任何东西。因此,对一个NULL指针进行解引用操作是非法的,在对指针进行解引用操作前,你首先必须确保它非NULL指针

6. 对所有的指针变量进行显式的初始化是种好做法,如果你已经知道指针将被初始化为什么地址,就把它初始化为该地址,否则就把它初始化为NULL,风格良好的程序会在指针解引用之前对它进行检查,这种初始化策略可以节省大量调试时间。

7. 变量(除了const变量外)都是左值。指针变量可以作为左值,并不是因为它们是指针,而是因为它们是变量。

8. 指向指针的指针。例如:*b = &a; c = &b; 那么**c就是指向指针的指针。

  举个例子帮助理解:

    int a = 12;

    int *b = &a;

    int **c = &b;

    让我们来分析一下最后一个表达式的值是多少。*操作符具有从右向左的结合性,所以这个表达式相当于*(*c),我们必须从里向外逐层求值。*c访问c所指向的位置,我们知道这是变量b。第2个间接访                   问操作符访问这个位置所指向的地址,也就是变量a。

表达式 相当的表达式
a 12
b &a
*b a, 12
c &b
*c b, &a
**c *b, a, 12

9. 优先级表格显示后缀++操作符的优先级高于*操作符。因此*cp++这个表达式是先执行cp所指地址加1,然后再执行解引用操作。这个表达式常常在循环中出现,首先用一个数组的地址初始化指针,然后使用这个表达式就可以依次访问数组的内容了。

10. 指针运算

  当一个指针和一个整数量执行算术运算时,整数在执行加法运算前始终会根据合适的大小进行调整。这个“合适的大小”就是指针所指向类型的大小,“调整”就是把整数值和“合适的大小”相乘。为了更好的说明,试想在某台机器上,float占据4个字节。在计算float型指针加3的表达式时,这个3将根据float类型的大小(此例中为4)进行调整(相乘)。这样,实际加到指针上的整型值为12.

11. 指针运算只有作用于数组中其结果才是可以预测的。对任何并非指向数组元素的指针执行算术运算是非法的(但常常很难被检测到)。如果一个指针减去一个整数后,运算结果产生的指针所指向的位置在数组第一个元素之前,那么它是非法的。加法运算稍有不同,如果结果指针指向数组最后一个元素后面的那个内存位置仍然是合法的(但是不能对这个指针进行间接访问操作),不过再往后就不合法了。

12. 如果两个指针都指向同一个数组中的元素,那么它们之间可以相减。指针减法的结果经过调整(除以数组元素类型的长度),表示两个指针在数组中相隔多少个元素。如果两个指针并不是指向同一个数组的元素,那么它们之间进行相减就是错误的。

13. 任何指针之间都可以进行比较,测试它们相等或者不相等。如果两个指针都指向同一个数组中的元素,那么它们之间还可以执行<、<=、>、>=等关系运算,用于判断它们在数组中的相对位置。对两个不相关的指针执行关系运算,其结果是未定义的。

14. 警告的总结

  1. 错误的对一个未初始化的指针变量进行解引用。

  2. 错误的对一个NULL指针进行解引用。

  3. 向函数错误的传递NULL指针。

  4. 未检测到指针表达式的错误,从而导致不可预料的结果。

  5. 对一个指针进行减法运算,使它非法地指向了数组第1个元素的前面的内存位置。

原文地址:https://www.cnblogs.com/kennyael/p/9761680.html