有以下程序 main() { char s[]=“abcde“; s+=2; printf(“%d\n“,s[0]); } 执行后的结果是(计算机二级)

文章讲述了程序中对字符数组操作的误解,指出`s+=2`导致数组越界,实际输出应是错误值。正确理解是数组索引和指针移动的关系,以及数组元素的局限性。
摘要由CSDN通过智能技术生成

有以下程序

  main()

  {  char  s[]="abcde";

  s+=2;

  printf("%d\n",s[0]);

  }

  执行后的结果是(D

  A)输出字符a的ASCII码         B)输出字符c的ASCII码

  C)输出字符c                    D)程序出错

(第一次见到这种题,也许会有一些人是这么认为的,s是数组名,这里是数组首元素地址,s+=2,指针向后移两位,指向字符c,打印%d,输出c的ASCIL码值。这样的思路是错的,指针如何移动与数组内元素息息相关,加一就是移向下一个元素,而在数组s[]中,只有“abcde”这一格字符串元素,所以加2后向后移动两个元素大小的空间,这会导致数组越界,从而使程序出现问题。)错误。

这么说其实是有明显问题的,之前一直没有纠正。这道题主要考察的是数组名的的用法,数组名是常变量。因此对s采用+=的方式是不合理的,程序会报出编译错误。如果想取数组首元素后的元素的地址,可以再定义一个指针p,对这个指针p进行+=。其次,这里就算s+=成立也不会导致越界,这与指针的类型有关,s是char类型,加1只会向后移动一个字节,s+=2后会指向c的位置,输出c的ASCLL码值,既99.综上所述,这道题选D。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值