7.1间接访问NULL指针会发生什么情况? 答:标准未定义。某些编译器可能访问内存0地址,其结果不可预测,某些机器可能引 发一个错误,并终止程序 7.2说明下面两个“*”运算符的区别 int *p=&a n 答:前者将p定义为一个整型指针;后者访问p所指向的对象 7.3下面的说法是否正确?为什么? (1)如果x=y则&x=&y (2)如果x=y则*x==*y 答:(1)不正确。不同的变量其值可以相同,但必须有不同的地址。 (2)显然,如果结论成立,则x和y应为指针 7.4何谓“空悬指针”?对空悬指针间接访问会带来什么后果?如何避免这种后果? 答:(1)空悬指针就是一个未初始化的指针,它可能指向未初始化的空间或不可访问的 空间 (2)对空悬指针间接访问,要么更新不可知变量的值,要么导致程序崩溃 (3)初始化它 7.5为什么说指针的算术运算只有作用于数组中其结果才是可预测的? 答:比如说指针p指向数组的第i个元素,则一般说来,p++,p,p+n,p-n,仍指向 数组中的某个元素,因而是可预测的。但如果p指向任何其它目标,则p++等运算都无法预 测p指向了谁。所以说,对任何非指向数组元素的指针执行算术运算是毫无意义的(编译器 不一定会捕获这个错误)。 7.6下面的代码段是否有问题?如果有的话,问题在哪里?可能会产生什么后果? int array [SIZE] int *ptr for (nPtr &array [0]: nPtr<&array [SIze] **+tnPtr =0 答:有两个错误。其一,如果该循环语句的目的是将数组所有元素清0的话,那么数组 的第一个元素并没有清零。第二个错误比较复杂,分两种情况 如果指针nPtr所在空间与数组空间不连续,指针越过数组右边界后仍进行间接访问, 它将把紧邻数组右边界的长度为 sizeof(int)的内存空间的内容清零。其后果不可预知 如果编译器恰好把nPr分配在紧邻数组右边界的内存位置,结果将是灾难性的。因为 当指针移到数组后面的那个内存位置时,那个最后被清零的内存位置就是指针本身所在的位 置。可见此时指针的值为零,条件nPr<& arrayISIZE]仍然满足,所以循环将继续,指针 在内存中欢快地前行,破坏它所遇见的一切。当它再一次到达这个数组的位置时,恶梦重现, 从而导致一个微妙的无限循环。 7.7下面的代码段是否有问题?为什么? float array [10] float *fPtr &array [o] --fPtr *fPtr=3.14; 答: ANSIC标准规定,一个指向数组的指针经运算后指向了数组第一个元素之前,那么 它是非法的。一fPtr的结果正是如此,所以它是非法的。尽管某些系统在这种情况下仍然 能运行,但 ANSIC认为这种行为是未定义,因此其结果也是不可知的,更何况上述代码已经1 7.1 间接访问 NULL 指针会发生什么情况? 答:标准未定义。某些编译器可能访问内存 O 地址,其结果不可预测,某些机器可能引 发一个错误,并终止程序。 7.2 说明下面两个“*”运算符的区别。 int *p = &a; n = *p; 答:前者将 p 定义为一个整型指针;后者访问 p 所指向的对象。 7.3 下面的说法是否正确?为什么? (1)如果 x == y 则&x == &y (2)如果 x == y 则*x == *y 答:(1)不正确。不同的变量其值可以相同,但必须有不同的地址。 (2)显然,如果结论成立,则 x 和 y 应为指针。 7.4 何谓“空悬指针”?对空悬指针间接访问会带来什么后果?如何避免这种后果? 答:(1)空悬指针就是一个未初始化的指针,它可能指向未初始化的空间或不可访问的 空间。 (2)对空悬指针间接访问,要么更新不可知变量的值,要么导致程序崩溃。 (3)初始化它。 7.5 为什么说指针的算术运算只有作用于数组中其结果才是可预测的? 答:比如说指针 p 指向数组的第 i 个元素,则一般说来,p++,p--,p+n,p-n,仍指向 数组中的某个元素,因而是可预测的。但如果 p 指向任何其它目标,则 p++等运算都无法预 测 p 指向了谁。所以说,对任何非指向数组元素的指针执行算术运算是毫无意义的(编译器 不一定会捕获这个错误)。 7.6 下面的代码段是否有问题?如果有的话,问题在哪里?可能会产生什么后果? int array[SIZE]; int *Ptr; for(nPtr = &array[0];nPtr<&array[SIZE];) *++nPtr = 0; 答:有两个错误。其一,如果该循环语句的目的是将数组所有元素清 0 的话,那么数组 的第一个元素并没有清零。第二个错误比较复杂,分两种情况: 如果指针 nPtr 所在空间与数组空间不连续,指针越过数组右边界后仍进行间接访问, 它将把紧邻数组右边界的长度为 sizeof(int)的内存空间的内容清零。其后果不可预知。 如果编译器恰好把 nPtr 分配在紧邻数组右边界的内存位置,结果将是灾难性的。因为 当指针移到数组后面的那个内存位置时,那个最后被清零的内存位置就是指针本身所在的位 置。可见此时指针的值为零,条件 nPtr < &array[SIZE] 仍然满足,所以循环将继续,指针 在内存中欢快地前行,破坏它所遇见的一切。当它再一次到达这个数组的位置时,恶梦重现, 从而导致一个微妙的无限循环。 7.7 下面的代码段是否有问题?为什么? float array[10]; float *fPtr = &array[0]; --fPtr; *fPtr = 3.14; 答:ANSIC 标准规定,一个指向数组的指针经运算后指向了数组第一个元素之前,那么 它是非法的。--fPtr 的结果正是如此,所以它是非法的。尽管某些系统在这种情况下仍然 能运行,但 ANSIC 认为这种行为是未定义,因此其结果也是不可知的,更何况上述代码已经