d * p2= pl (4) int num =0: id p=&num print("%d\n", *((int*)p)) 答:(1)非法。任何非指针量不可以具有void类型。 (2)合法。一个指针可以具有void类型 (3)合法。void类型指针可以指向任何类型 (4)合法。不能直接访问void类型指针所指的目标,但可以通过强制类型转换来 实现访问。 7.14分别解释下列语句的语义: (1) const int (2) int const (3)int *const p (4) const int *const p 答:(1)p是一个指向int型常量的指针,p可以指向不同的对象,但p所指向的对象 即*p的值不可改变。 (2)与a等价 (3)p是一个指向it型的常量指针,p的值不可改变(不能指向另一个目标),但 p所指向的对象即*p的值可改变 (4)指针p和p指向的对象都不可变。 7.15解释下列语句的含义: typedef char Word [80] 答:Word是有80个元素的字符数组的类型名;psz是指向80个字符元素数组的指针。 7.16动态内存分配中的常见错误有哪些? 答:最常见的错误是忘记检查所申请的内存是否分配成功:第二个错误就是访问内存时 超越了被分配内存的边界,从而破坏了其它信息:第三个错误是只要求分配而忘记释放,导 致“内存泄漏”的严重错误。所谓内存泄漏是指因持续分配而导致最终耗尽可用内存的一种 现象 7.17分析下列代码段,并给出你的分析结论: float *p[2] p[o]=(float*)malloc(sizeof (3. 14159)) printf(%f\n", *p[O]) 答:由于常数3.14159隐含为 doubl,因此 sizeof(3.14159)等价于 sizeof( double) 这意味着函数 malloc分配了 sizeof( double)个字节空间。设 float和 double型的长度分 别为4和8个字节,则被分配的8个字节中的前4个字节作为 float型指针p[0]所指向的 目标空间。由于动态分配的空间是未初始化的,所以 printf所输出的目标空间的内容是不 可预知的,编译器不会捕获这个错误。 7.18下列代码是否存在错误?为什么? nt*p,a[]={1,2,3,4,5} free(p1)3 void *p2 = p1; (4)int num = 0; void *p = # print("%d\n",*((int*)p)); 答:(1)非法。任何非指针量不可以具有 void 类型。 (2)合法。一个指针可以具有 void 类型。 (3)合法。void 类型指针可以指向任何类型。 (4)合法。不能直接访问 void 类型指针所指的目标,但可以通过强制类型转换来 实现访问。 7.14 分别解释下列语句的语义: (1)const int *p; (2)int const *p; (3)int *const p; (4)const int *const p; 答:(1)p 是一个指向 int 型常量的指针,p 可以指向不同的对象,但 p 所指向的对象 即*p 的值不可改变。 (2)与 a 等价。 (3)p 是一个指向 int 型的常量指针,p 的值不可改变(不能指向另一个目标),但 p 所指向的对象即*p 的值可改变。 (4)指针 p 和 p 指向的对象都不可变。 7.15 解释下列语句的含义: typedef char Word[80]; Word *psz; 答:Word 是有 80 个元素的字符数组的类型名;psz 是指向 80 个字符元素数组的指针。 7.16 动态内存分配中的常见错误有哪些? 答:最常见的错误是忘记检查所申请的内存是否分配成功;第二个错误就是访问内存时 超越了被分配内存的边界,从而破坏了其它信息;第三个错误是只要求分配而忘记释放,导 致“内存泄漏”的严重错误。所谓内存泄漏是指因持续分配而导致最终耗尽可用内存的一种 现象。 7.17 分析下列代码段,并给出你的分析结论: float *p[2]; p[0] = (float*)malloc(sizeof(3.14159)); printf("%f\n",*p[0]); 答:由于常数 3.14159 隐含为 doubl,因此 sizeof(3.14159)等价于 sizeof(double), 这意味着函数 malloc 分配了 sizeof(double)个字节空间。设 float 和 double 型的长度分 别为 4 和 8 个字节,则被分配的 8 个字节中的前 4 个字节作为 float 型指针 p[0]所指向的 目标空间。由于动态分配的空间是未初始化的,所以 printf 所输出的目标空间的内容是不 可预知的,编译器不会捕获这个错误。 7.18 下列代码是否存在错误?为什么? int *p,a[] = {1,2,3,4,5}; int i,*p1 = a; for(i = 0;i < 10;i++) p[i] = i; free(p1);