一道有趣的关于C语言指针的题目

题目及答案

下列程序的输出结果是C
   A) yz        B)z        C)z         D)x
      xyz          yz          yz           xy
                               xyz          xyz
void main(){ 
            char str[]="xyz",*ps=str;
            while(*ps)    ps++;
            for(ps--;ps-str>=0;ps--)    puts(ps);
}

在这里插入图片描述
问题分析:

  1. while里面是*ps意思是什么?while里面不是放条件的么? while (0)和while(1)在之前没有任何表达式的实况下 是判断什么为真假从而执行循环体的?
  2. ps++的意思是从y开始循环的么
  3. for里面的第一个ps–有用么?
  4. 答案是C没错 可是它是怎么循环使x在最后出现?

1、while里的*ps的意思是while (ps != 0)即ps为真,while(0)while(1)这里面的0和1就是表达式,分别为假和真,0为假,非零为真,while(ps)和这个是一个道理;
2、ps++的意思是指针后移一位,刚开始时,赋值ps=str,那么ps就指向str的首地址,即’x’的位置;
3、由于while循环中最后ps指向的位置是’\0’,所以这里ps–是有意义的,是的指针指向’z’;
4、循环的条件是
ps-str >= 0即ps指向的位置在str的右边,显然,ps从’z’的位置一直向前移动过程中,ps一直在str的右边,所以最后输出的是这样的结果。

流程分析:

#include<stdio.h>
void main()
{
char str[] = "xyz";
char *ps=NULL;
ps = str;
//此时ps = &str[0]
while(*ps) //ps指向的内容不为空的继续循环
{
ps++;
}
//此时ps指向z后边的地址str[3] = 0 跳出while循环
//此时ps = &str[3]
//ps = &str[3] 此时ps-- 仍然ps = &str[3] -->*ps=0 而且ps-str>=0不成立 -->puts(ps)不输出-->ps--
//ps = &str[2] 此时ps-- 仍然ps = &str[2] -->*ps=z 所以ps-str>=0成立 -->puts(ps)输出z -->ps--
//ps = &str[1] 此时ps-- 仍然ps = &str[1] -->*ps=yz 所以ps-str>=0成立 -->puts(ps)输出yz -->ps--
//ps = &str[0] 此时ps-- 仍然ps = &str[0] -->*ps=xyz 所以ps-str>=0成立 -->puts(ps)输出xyz -->ps--
//
for(ps--;ps-str>=0;ps--)
{
puts(ps);
}
}

资料来源:
1、https://zhidao.baidu.com/question/1896118848768071460.html
2、https://zhidao.baidu.com/question/218887926.html

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值