找回密码
 立即注册
搜索
热搜: 活动 通知
查看: 76|回复: 0

检测点8-15

[复制链接]

620

主题

336

回帖

1057

积分

管理员

积分
1057
发表于 2026-3-7 19:42:59 | 显示全部楼层 |阅读模式
检测点8-15

1.在什么情况下,数组类型的表达式会自动转换为指针?
答:除非是作为sizeof和一元&运算符的操作数,或者是一个字面串且被用于初始化数组对象,否则,一个数组类型的表达式会被转换为指向该数组首元素的指针,而且不再是一个左值。如果数组的(元素)类型为T,则转换后的类型为指向T的指针。

2.若左值的类型是数组且元素类型为short int,则执行数组-指针转换后得到左值还是值?转换后的类型是什么?
答:数组-指针转换的结果不是左值。是值。
转换后的类型是指向short int的指针。

3.给定声明:
int a [5] = {37, 1, 62, 58, 33}, b [7];
编写程序将数组a的内容复制到数组b,要求分别使用下标运算和指针运算。
参考答案:
# include <stdio.h>


int main (void)
{
    int a [5] = {37, 1, 62, 58, 33}, b [7];


    for (size_t x = 0; x < sizeof a / sizeof * a; x ++)
        //b [x] = a [x];
        * (b + x) = * (a + x);


    for (size_t x = 0; x < sizeof a / sizeof * a; x ++)
        printf ("%5d", b [x]);
}

4.请论证声明
int a [] = {1, 2}, * p = & a [0];
和声明
int a [] = {1, 2}, * p = a;
是等价的。
答:实质是要证明表达式a和& a [0]是等价的。前者执行数组-指针转换,转换为指向数组a首元素的指针,而后者也是得到指向数组a首元素的指针。

5.对数组a,请论证表达式a [5]和(& a [0]) [5]以及* (a + 5)是等价的。
答:
A.表达式a [5]是个左值,代表数组内的第5个元素。在这里,数组a自动执行数组-指针转换,转换为指向其首元素的指针,而表达式& a [0]也是得到指向数组a首元素的指针。所以a [5]和(& a [0]) [5]等价。
B.在表达式* (a + 5)里,数组a自动执行数组-指针转换,转换为指向其首元素的指针。将这个指针加上5,得到一个新的指针并指向数组a内下标为5的元素。所以表达式* (a + 5)是个左值,代表数组内的第5个元素。所以* (a + 5)和a [5]等价。
由于a [5]和(& a [0]) [5]等价,* (a + 5)和a [5]等价,所以a [5]和(& a [0]) [5]以及* (a + 5)是等价的。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|鼠侠网 ( 吉ICP备19001332号 )

GMT+8, 2026-3-30 16:15 , Processed in 0.223519 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表