C和指针读书笔记(第六章)

1. 通过一个指针访问它所指向的地址的过程称为间接访问或者解引用指针。这个用于执行间接访问的操作符是单目操作符 * 。


2. NULL指针是一个特殊的指针变量,表示某个特定的指针不指向任何东西,要使一个指针变量为NULL,可以给它赋一个零值。
对指针进行解引用操作可以获得它所指向的值,但是NULL指针并未指向任何东西,所以对NULL指针进行解引用操作使非法的。在对指针进行解引用操作之前必须确定它并非NULL指针。


3. 指针变量可以作为左值,并不是因为使指针,而是因为是变量。对指针变量进行间接访问表示访问指针所指向的位置。间接访问指定了一个特定的内存位置,这样可以把间接访问表达式的结果作为左值使用。

int a;
int *d = &a;
*d = 10 - *d;   // 1
d = 10 - *d;    // 2
  1. 正确,包含两个间接访问操作,右边产生的值是d所指向的位置存储的值(a的值),所以d所指向的位置(a)把赋值符右侧表达式的计算结果作为它的新值。
  2. 错误,表示把一个整形变量(10-*d)存储与一个指针变量中

4. 假设变量a存储于位置100

*100 = 25;

错误,因为字面值100的类型是整型,而间接访问只能作用于指针类型表达式。
使用强制转换,将100从“整型”转换为“指向整型的指针”即可。

*(int *)100 = 25;

5. 指针的指针

int a = 12;
int *b = &a;
int **c = &b;   //* 操作符具有自左向右的结合性,所以这个表达式相当于*(*c)
  • 双重间接访问
    C和指针读书笔记(第六章)_第1张图片

6. C语言中的assert()函数:如果它的条件返回错误,则终止程序执行。


7. P99-107 指针表达式


8. 指针的算数运算

  • 指针加上一个整数的结果是另一个指针,当一个指针和一个整数量执行算术运算时,整数在执行加法前会根据一阵所指向类型的大小进行调整,“调整”就是把整数值和“合适的大小”相乘,合适的大小就是指针目标类型的长度。
  • 只有当两个指针都指向同一个数组中的元素时,才允许从一个指针减去另一个指针,指针的运算结果和数据的类型无关。如果两个指针所指向的不是同一个数组中的元素,那么他们之间相减的结果是未知的。

9. 指针的关系运算
当指针都指向同一个数组的元素时,可用下列关系操作符对两个指针值进行比较
<,<=,>,>=
比较表达式将告诉我们哪一个指针指向数组中更靠前的或更靠后的元素。可以测试指针之间相等与否。


10. 指针运算只有作用于数组才是可以预测其结果的。如果指针减去一个整数后,运算结果产生的指针所指向的位置在数组第一个元素之前,那么它是非法的。如果指针加上一个整数产生的结果指向了最后一个元素后面的那个内存位置,仍是合法的(但不能对这个指针执行间接访问操作),再往后就不合法了。


11. 声明一个指针变量并不会自动分配任何内存,对指针执行间接访问之前,必须对指针进行初始化,或者使他指向现有的内存,或者给它分配动态内存。对未初始化的指针变量执行间接访问是非法的。


2016.9.27

你可能感兴趣的:(学习笔记,C和指针,c语言,读书笔记,指针)