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

检测点7-11

[复制链接]

630

主题

370

回帖

2538

积分

管理员

积分
2538
发表于 2026-3-7 19:24:55 | 显示全部楼层 |阅读模式
检测点7-11

1.若左值的类型分别是指向const char的指针、const char和const限定的指向char的指针,则左值转换后,这些值的类型各是什么?
答:分别是const char、char和char *。

2.在源文件c0708.c中,语句S2、S5、S7、S12和S17的第二个参数都是左值且要执行左值转换,转换后的值各自是什么类型?
答:直接就程序以注释的形式作答。
void f1 (const int * p1)
{
    * p1 = 65533;        //S1
    printf ("%d\n", * p1);//S2:左值* p1的类型是const int,故左值转换后的类型是int。
}

void f2 (const int * const p2)
{
    int m = 0;

    p2 = & m;                                        //S3:非法!
    * p2 = 260;                                //S4:非法!
    printf ("%d\n", * p2);        //S5:左值* p2的类型是const int,故左值转换后的类型是int。
}

int main (void)
{
    const int cx = 0;
    cx = 65533;                                //S6:非法!
    printf ("%d\n", cx);        //S7:左值cx的类型是const int,故左值转换后的类型是int
    * (int *) & cx = 65533;        //S8:合法,但非常危险!

    int x = 0, y = 0;
    const int * pc = & x;
    * pc = 77;                                //S9:非法!
    pc = & y;                                        //S10:合法
    * pc = 78;                                //S11:非法,与指向哪个对象无关!
    printf ("%d\n", * pc);        //S12:左值* pc的类型是const int,故左值转换后的类型是int。
    f1 (& x);                                        //S13:合法
    f1 (pc);                                        //S14:合法

    const int * const cpc = & x;
    * cpc = 79;                                //S15:非法!
    cpc = & y;                                //S16:非法!
    printf ("%d\n", * cpc);        //S17:左值* cpc的类型是const int,故左值转换后的类型是int。
    f2 (& x);                                        //S18:合法
    f2 (cpc);                                        //S19:合法
}

3.若对象的类型是const限定的指向int的指针,则该对象的值可以修改吗?该对象所指向的对象的值可以修改吗?
答:该对象不可修改,该对象指向的对象可以修改。

0

主题

5

回帖

24

积分

新手上路

积分
24
发表于 2026-10-6 16:36:38 | 显示全部楼层
指向const char的指针左值转换不是 const char *?

630

主题

370

回帖

2538

积分

管理员

积分
2538
 楼主| 发表于 2026-10-7 09:27:26 | 显示全部楼层
fengshidi 发表于 2026-10-6 16:36
指向const char的指针左值转换不是 const char *?

左值转换会丢失最外层限定符。

0

主题

5

回帖

24

积分

新手上路

积分
24
发表于 2026-10-8 22:02:20 | 显示全部楼层
站长 发表于 2026-10-7 09:27
左值转换会丢失最外层限定符。

指向const char的指针 这个也算最外层吗,最外层不应该类似于const char * const var;第二个const才是最外层吧,const char * var1 的const不是限定指针指向的对象吗,这不是内部的限定符吗?

0

主题

5

回帖

24

积分

新手上路

积分
24
发表于 2026-10-8 22:50:23 | 显示全部楼层
fengshidi 发表于 2026-10-8 22:02
指向const char的指针 这个也算最外层吗,最外层不应该类似于const char * const var;第二个const才是最 ...

更加疑惑的是这种不该属于是隐式转换吗? int x =0; const int * pc = &x => const int * pc =(const int *)&x;  int * p = pc=> int * p = (int *)pc才会警告 warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
    8 |         int * p = pc;    这样才合理吧

630

主题

370

回帖

2538

积分

管理员

积分
2538
 楼主| 发表于 2026-10-9 21:32:25 | 显示全部楼层
fengshidi 发表于 2026-10-8 22:02
指向const char的指针 这个也算最外层吗,最外层不应该类似于const char * const var;第二个const才是最 ...

const 指针才算最外层。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-11-15 07:25 , Processed in 0.893976 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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