永发信息网

C 语言 ,搞不懂你,搞不动你,搞不来你

答案:6  悬赏:40  手机版
解决时间 2021-11-11 21:47
C 语言 ,搞不懂你,搞不动你,搞不来你
最佳答案
补充:遇到a4就该结束的了,怎么还有还要a3,a2。a1?
所以要去看看函数递归式怎样的哈。fun(a+4)在fun(a+3)里面,所以fun(a+4)执行完后要返回fun(a+3)把fun(a+3)所有语句执行完,而剩下一条printf("%c", *a+3) ;自然就把*a+3(就是'd')打印出来了。
类推:fun(a+3)在fun(a+2)里面,所以fun(a+3)执行完后要返回fun(a+2)把fun(a+2)所有语句执行完,printf()自然就把*a+2(就是'c')打印出来了。
.......直到回到fun(a)执行完,才把整个fun()函数的调用执行完毕

此函数综合了:函数,函数递归,指针与数组等知识。建议先看书看好这些部分

//此程序的作用是把一个字符串的内容反向。就是输入"abcd",输出"dcba"
fun (char *a) //参数是一个指针,就是地址
{
if (*a)//*a是指针a指向的内容,即传入数组的元素的值。当*a不为0的时候可以进入if判断
{
fun(a+1) ;
printf("%c", *a) ;
}
}
int main(int argc, char* argv[])
{
char s[10]="abcd";
printf("处理前字符串=%s\n处理后字符串=", s);
fun(s);//把数组s的地址传给fun函数,就是把s的第1个元素‘a’的地址传给fun函数
printf("\n") ;
system("pause");
return 0;
}

一些基本知识:
1。if (*a);表示当*a不为0的时候可以进入if判断
字符串的末尾是以是字符'\0'结束的,而'\0'就等于十进制的0;所以当a指向一个字符串的时候,
只要没有指向字符串的末尾'\0',那么这个if就是成立的,可以进入if判断
2。指针的基本知识
*a的两种含义
当定义的时候,如char *a,表示定义一个char *型的指针a,当fun(s);时表示char *a=s;就是a
指向了s这个字符串的开头字母'a'

当定义了指针a后再单独使用*a的时候,*a表示a指向的变量的值。即a指向s,则表示*a='a';
a指向s+1,则表示*a='b';

再来看程序
char s[10]="abcd";
fun(s)
第1次判断if:*a='a',所以不为0。进入if判断,遇到fun(a+1),这里是一个递归调用
相当于函数
fun (char *a+1) //参数是一个指针,就是地址
{
if (*a+1)//*a是指针a指向的内容,即传入数组的元素的值。当*a不为0的时候可以进入if判断
{
fun(a+1+1) ;
printf("%c", *a+1) ;
}
}
第2次判断if:*a+1='b',,所以不为0。进入if判断,遇到fun(a+2)。类似。。。
第3次判断if:*a+2='c',,所以不为0。进入if判断,遇到fun(a+3)。类似。。。
第4次判断if:*a+3='d',,所以不为0。进入if判断,遇到fun(a+4)。类似。。。
第5次判断if:*a+4='\0',,所以为0。不进入if判断,则返回上一层第4次判断,printf("%c", *a+3) ;打印出'd'
再返回上一层第3次判断,printf("%c", *a+3) ;打印出'c'
再返回上一层第2次判断,printf("%c", *a+2) ;打印出'b'
再返回上一层第1次判断,printf("%c", *a+1) ;打印出'a'
到此fun(s)执行完毕
printf("\n") ;
全部回答
那是因为a4又偷着生了三个,
*a 是地址,if是指*a为真,为真就是1,就是*a 为1时开始执行if.
你好!!!
fun (char *a) //**
{
if ( *a )
{ fun(a+1) ;
printf("%c", *a) ; //**
}
} 这是递归调用的函数,形参char *a是指针变量。即指针a指向字符串的第一个元素,if ( *a ) *a是字符串的第一个元素即‘a’,注意字符‘a’的ascll码是97,,系统存放字符是按ascll码存的。还有if()语句的判断条件是真是假,在c原则语言真就是非零,假就是0,那么97就代表真,那就指向fun(a+1) ; 这就是递归,再次调用函数(此时printf("%c", *a) 并没有执行呢)

过程:
fun(a)
fun(a+1)
fun(a+2)
fun(a+3)
fun(a+4)
此 时的*(a+4)的值是‘\0’也是ascll码代表0,那么if语句不成立,那就执行fun(a+4)后面的输出一句,注意此时*a的值是字符的最后一个字符,然后再返回来执行输出语句
fun(a+4) 的printf("%c", *a);为d
fun(a+3) 的printf("%c", *a);为c
fun(a+2) 的printf("%c", *a);为b
fun(a+1) 的printf("%c", *a);为a

因此调用函数后输出的是:dcba
if(*a)是判a是否为字符串尾\0 否就 递归fun(a+1)。直到最后 从尾向头输出 dcba
这个程序就是 将字符串反向输出
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
已知f(x)+2f(-x)=x²+2x,求(1)f(
求问赫字的属性是什么
英语演讲比赛将在教学楼4层415房间举行
我车撞了奔驰车,对方修了11万,我的车损险限
岭南村地址在什么地方,想过去办事,
删除文件时不提示放入回收站
一般地线埋在地下要多深
星巴克的门店都是一样的吗?
浴室用的风暖1 风暖2一样吗?
为什么 pcr后有两条带???拜托了各位 谢谢
定兴县东落堡乡中学地址好找么,我有些事要过
喜峪中学地址在什么地方,我要处理点事!
7月13号从福建邵武去北京玩,找北京的 旅行社
河北省保定易县坡仓乡坡仓中学地址在哪,我要
营养跟不上吃什么好?
推荐资讯
家用汽油发电机长期不用应当如何存放
雅思复议是在当地找考官重新评分还是把资料送
俄罗斯历史书上元朝是他们的吗
这个到底叫什么
新手想买DS车,开过的速来科普
TOUS金色桃丝熊女银色哪个味道更长久更好啊?
济公是那个佛的化身
家里装修角阀一共需要多少个
关于春风的古诗句
维修基金该由谁来收
会宁县第二中学的会宁二中大事记(2006- )
美洁洗熨店地址在哪,我要去那里办事,
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?