正在加载图片...
更新了指针所指向的未知空间的内容,即使程序能得到结果,该结果也是不可信赖的。 7.8下面的代码段有什么错误? int i, a[100] (i=0;i<100;i++) 答:数组名是一个指针常量,不能施加“+”运算 7.9下面的代码有什么错误? float x = 3.14 float *fp = &x: short k 36 short *sp 答:错误出在最后一个赋值表达式语句:不同类型的指针不能赋值,即fp不能指向 short 型对象。 7.10对于数组a和int型变量i,下面的条件是否成立?为什么? (a+i)=i[a] alil=i[al 答:条件成立。首先我们来分析表达式a[i]。表达式a[i]的值是通过下标运算符返 回的。a[]作为左值表达式时,下标运算计算表达式a+i,返回一个地址值(即数组第i个 元素的地址):a[i]作为右值表达式时,下标运算计算表达式a+i得到一个地址值,然后返 回该地址空间的内容的一个副本。设数组a的元素类型为T,则无论a[i]是作为左值还是右 值,下标运算都是将a+i转化为a+i* sizeof(T)。 至于表达式*(a+i),按指针运算法则,*(a+i)即*(a+i* sizeof(T),显然,它无论是作 为左值还是右值,与a[i]都是等价的 表达式i[a]转换为等价的间接访问表达式是*(i+[a]),显然,里面的下标运算符是冗 余的,于是有*(i+a)。 7.11下面表达式合法吗?为什么? (int*)200=10 答:由于强制类型转换把值200从“int”型转换为“指向int型的指针”,再对它间接 访问当然是合法的。但阁下什么时候需要这样做呢? 7.12如果pl和p2都是指向int型的指针,n为int型数,则下列表达式中哪些是非法 的? (1)pl+p2 (2)pl-p2 (3) pI+n (4)p1-n (5)n+p1l (6)n-p2 答:pl+p2和np2是非法的 7.13下列语句中,哪些是非法的?哪些是合法的?为什么? (2) void *p (3) int num =0,2 更新了指针所指向的未知空间的内容,即使程序能得到结果,该结果也是不可信赖的。 7.8 下面的代码段有什么错误? int i,a[100]; for(i = 0;i<100;i++) *a++ = 0; 答:数组名是一个指针常量,不能施加“++”运算。 7.9 下面的代码有什么错误? float x = 3.14; float *fp = &x; short k = 36; short *sp = &k; fp = sp; 答:错误出在最后一个赋值表达式语句:不同类型的指针不能赋值,即 fp 不能指向 short 型对象。 7.10 对于数组 a 和 int 型变量 i,下面的条件是否成立?为什么? a[i] == *(a+i); *(a+i) == i[a]; a[i] == i[a]; 答:条件成立。首先我们来分析表达式 a[i]。表达式 a[i]的值是通过下标运算符[]返 回的。a[i]作为左值表达式时,下标运算计算表达式 a+i,返回一个地址值(即数组第 i 个 元素的地址);a[i]作为右值表达式时,下标运算计算表达式 a+ i 得到一个地址值,然后返 回该地址空间的内容的一个副本。设数组 a 的元素类型为 T,则无论 a[i]是作为左值还是右 值,下标运算都是将 a+i 转化为 a+i*sizeof(T)。 至于表达式*(a+i),按指针运算法则,*(a+i)即*(a+i*sizeof(T)),显然,它无论是作 为左值还是右值,与 a[i]都是等价的。 表达式 i[a]转换为等价的间接访问表达式是*(i+[a]),显然,里面的下标运算符是冗 余的,于是有*(i+a)。 7.11 下面表达式合法吗?为什么? *(int*)200 = 10; 答:由于强制类型转换把值 200 从“int”型转换为“指向 int 型的指针”,再对它间接 访问当然是合法的。但阁下什么时候需要这样做呢? 7.12 如果 p1 和 p2 都是指向 int 型的指针,n 为 int 型数,则下列表达式中哪些是非法 的? (1)p1+p2 (2)p1-p2 (3)p1+n (4)p1-n (5)n+p1 (6)n-p2 答:p1+p2 和 n-p2 是非法的。 7.13 下列语句中,哪些是非法的?哪些是合法的?为什么? (1)void a; (2)void *p; (3)int num = 0,*p1 = 0;
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有