第六章 指针

1.内存中的每个位置由一个独一无二的地址标识符。

 

2.内存中的每个位置都包含一个值。

 

3.高级程序语言,通过名字而不是地址来访问内存位置,这些名字就是我们说的变量。名字与内存间的关系不是由硬件决定,而是由编译器决定的,硬件依然是通过地址访问内存。

 

4.不能简单地通过检查一个值的位来判断它的类型,而是要通过观察这个程序的使用方式。

 

5.变量的值就是分配给该变量的内存位置所储存的数值。即使是指针变量也不例外。

 

6.

1 int a,*p,**f;
2 p=&a;
3 f=&p;

p=(a的地址)                        *f=(p的地址)                **f=(a的地址)

 

7.

1 int *p=NULL;
2 printf("%d\n",p)/printf("%p\n",p);

 

8.把整型值转化为指针或把指针转化为整型是极其罕见的。

 

9.如果函数失败是因为粗心大意的调用者懒得检查参数的有效性而引起的,那它活该如此。

 

10.NULL相当于0,用于悬空指针。宏定义#define 0 NULL      而在其他硬件中可能是#define其它的。NULL其实是空。    ‘\0’字符串结尾,字符串自动加上,不占位。

 

11.

 

12.对指针进行加减时,如果指针指的位置在数组第一个元素前面或者最后一个元素后面,其效果是未定义的。让指针指向数组最后面那个元素后面的·位置是合法的,但这个指针执行间接访问可能会失败。

 

13当两个指针都指向同一数组时,可以执行减法,结果是指向位置之差,例如int a[10] ;     *p=&a[1];     *f=&a[5];     f-p=5-1=4;

 

14.内存存储地址由低到高。

 

15.除了NULL指针外,再也没有任何内建的记法来表示指针常量,因为程序员通常无法预测编译器会把变量存储在内存的什么位置。偶尔使用指针常量可以通过把整型值强制转换为指针类型来创建它。

 

16.指针中存放的是整型值。

 

17.对任何非指向数组元素的指针执行算术运算是非法的(但常常很难被检测到)

 

18.全局变量(在数据段中);在编译时由编译器给它们分配存储空间。

     自动变量(在线程的栈中):函数调用时,在调用栈上分配

     堆变量(在堆内存区):通过malloc,calloc,realloc(等函数分配)。

 

19.对NULL指针进行解引用操作,结果因编译器而异。(不能正常运行)。

 

posted @ 2018-01-26 19:12  Hk_Mayfly  阅读(168)  评论(0)    收藏  举报