指针和函数问题请教

zsfzhoushanfeng 2010-04-02 07:53:56
最近做C语言的练习题,遇见了几个没大想明白的题(由于我是初学,问题弱智请大家不要见笑),在此写出请各位解答,谢谢先。
题1、有以下程序
#include<stdio.h>
main()
{char str[]="xyz",*ps=str;
while(*ps) ps++;
for (ps--;ps-str>=0;ps--)
puts(ps);
}
最后的输出结果是:B
A.yz B.z C.z D.x
xyz yz yz xy
xyz xyz
我分析下去好像应该是
z
zy
zyx,答案解析看了也没大明白,希望得到更好的解析,谢谢
题2、以下程序的输出结果是:f
#include<stdio.h>
main()
{char *p="abcdefghijklmnopq";
while (*p++!='\e');
printf("%c\n",*p);
}
而我认为应该是在e之前结束循环,答案则为d,谢谢能替我解析
题3、请读以下程序:
#include<stdio.h>
void fun(int *s)
{static int j=0;
do
s[j]+=s[j+1];
while(++j<2);
}
main()
{int k,a[10]={1,2,3,4,5}
for(k=1;k<3;k++)
fun(a);
for(k=0;k<5;k++)
printf("%d",a[k]);
}
上面程序输出的结果是:35745
我自己认为答案是35845,不知道应给怎么弄,求解
题4、有以下程序:
#include<stdio.h>
void f(int y,int *x)
{y=y+*x;
*x=*x+y;
}
main()
{int x=2,y=4;
f(y,&x);
printf("%d %d\n",x,y);
}
执行后输出的结果是:8 4可是我则认为是6 10,请帮忙解析
...全文
223 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zsfzhoushanfeng 2010-06-04
  • 打赏
  • 举报
回复
谢谢各位的帮助,以91分的成绩通过了
zsfzhoushanfeng 2010-04-03
  • 打赏
  • 举报
回复
第一次和第二次循环懂的了,可是就是不懂输入为什么就成了3、5、7、4、5
[Quote=引用 11 楼 huayu_huayu 的回复:]
第三题首先应该要明确的是:j是static的,第一次进入fun()函数时执行了两次s[j]+=s[j+1];第一次循环使值变成:3 2 3 4 5 ,第二次循环使值变成:3 5 3 4 5;然后退出fun()函数,进入主函数,再执行主函数里的循环,又进入fun()函数,执行一次s[j]+=s[j+1];使值变成3 5 7 4 5
[/Quote]
电信用户 2010-04-03
  • 打赏
  • 举报
回复
#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);
}
}
zsfzhoushanfeng 2010-04-03
  • 打赏
  • 举报
回复
你说的很对,不过当执行for (ps--;ps-str>=0;ps--)
puts(ps);时是怎么输出的,谢谢解析
[Quote=引用 12 楼 sixways 的回复:]
while(*ps)
ps++;
分清楚循环条件,*ps不为0的时候才加1,一共加三次
[/Quote]
电信用户 2010-04-03
  • 打赏
  • 举报
回复
while(*ps)
ps++;
分清楚循环条件,*ps不为0的时候才加1,一共加三次
异界工程师 2010-04-02
  • 打赏
  • 举报
回复
第三题首先应该要明确的是:j是static的,第一次进入fun()函数时执行了两次s[j]+=s[j+1];第一次循环使值变成:3 2 3 4 5 ,第二次循环使值变成:3 5 3 4 5;然后退出fun()函数,进入主函数,再执行主函数里的循环,又进入fun()函数,执行一次s[j]+=s[j+1];使值变成3 5 7 4 5

jbz001 2010-04-02
  • 打赏
  • 举报
回复
第一个”我觉得楼主的答案是正确的,我运行了一下,也是这个答案。

第二个“while循环后面有一个分号。实际这段代码只是把指针移到字符‘e’,然后再加一。后面的输出并不属于while循环。

第三个:虽然调用了两次fun函数,但是fun函数里的j是个静态变量。第一次调用fun函数时,执行了两次循环,j的值是2.第二次调用fun时,只执行了一次s[j]+=s[j+1];。三次执行s[j]+=s[j+1];后数组的值分别为://3,2,3,4,5 //3,5,3,4,5 //3,5,7,4,5

第四个:两个参数,y传的是值,x传的是指针。
yanran_hill 2010-04-02
  • 打赏
  • 举报
回复
第3题中,首先明确static int j变量在函数第一次调用时,初始值是0,但是第一次调用后i的值已经是2了,
所以在do while循环中,第二次调用,是从i=2开始,只循环一次.
答案35745是对的
zsfzhoushanfeng 2010-04-02
  • 打赏
  • 举报
回复
每次指针确实是往前移动的,它顺序输出控制puts是用来输出字符串的,原来如此,懂了,谢谢,现在等着解决第3个问题了[Quote=引用 2 楼 ericming200409 的回复:]
1 每次指针往前移动一个字节,
第一次 ps -> "z"
第二此 -> "yz"
第三次 -> "xyz"
[/Quote]
zsfzhoushanfeng 2010-04-02
  • 打赏
  • 举报
回复
谢谢你的解答,我懂了,可是能否麻烦你再帮我解析下第1和第3题,特别是第3题,第1题我看了2楼的回答懂了一点点,不过第3题真的是还没想出来错在哪儿了,谢谢[Quote=引用 6 楼 linyongzuo 的回复:]
while (*p++!='\e');//先判断后++;意思就是在判断等于e的时候循环结束后++,指向f
4中,y值是传值。相当于在fun函数中拷贝了y的值,作用域只是在fun中,外面的y值不变,而x是引用,在进入fun函数就在修改x的值,如果还是不清楚再引用前加个const你就明白了。
[/Quote]
linyongzuo 2010-04-02
  • 打赏
  • 举报
回复
while (*p++!='\e');//先判断后++;意思就是在判断等于e的时候循环结束后++,指向f
4中,y值是传值。相当于在fun函数中拷贝了y的值,作用域只是在fun中,外面的y值不变,而x是引用,在进入fun函数就在修改x的值,如果还是不清楚再引用前加个const你就明白了。
zsfzhoushanfeng 2010-04-02
  • 打赏
  • 举报
回复
2 中++后置我认为是先用了p,再让p+1,直到遇见了e的地址结束循环,当然就不能指向f了,而指向前面的d,麻烦帮我详细分析下,我错哪了,谢谢
3 中我没理解static int j=0;while(++j<2);赋值的过程
4 中地址指针我能区分,就是不知道每一步的算式是什么,能否写出,谢谢[Quote=引用 1 楼 haoxiang12345 的回复:]
2 中++是后置;
3 中是2个和赋值给第一个s[0]=s[0]+s[1]'s[1]=s[1]+s[2];s[2]=s[2]+s[3];
4 中一个是传值一个是传指针。
[/Quote]
zsfzhoushanfeng 2010-04-02
  • 打赏
  • 举报
回复
谭老书上讲的是实参往形参的数据传递是值传递,单向传递,值传递又分为普通数据传递和地址传递两种,可是我还没能很好的体会它们,能详细写下分析过程吗?哪怕只给其中一个题的都好,谢谢了![Quote=引用 3 楼 ericming200409 的回复:]
4 c语言的参数传递是值传递,虽然有的书说有指针传递,实际上也是值传递,只不过传递的是指针而已
[/Quote]
ericming200409 2010-04-02
  • 打赏
  • 举报
回复
4 c语言的参数传递是值传递,虽然有的书说有指针传递,实际上也是值传递,只不过传递的是指针而已
ericming200409 2010-04-02
  • 打赏
  • 举报
回复
1 每次指针往前移动一个字节,
第一次 ps -> "z"
第二此 -> "yz"
第三次 -> "xyz"
haoxiang12345 2010-04-02
  • 打赏
  • 举报
回复
2 中++是后置;
3 中是2个和赋值给第一个s[0]=s[0]+s[1]'s[1]=s[1]+s[2];s[2]=s[2]+s[3];
4 中一个是传值一个是传指针。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧