C 语言 ,搞不懂你,搞不动你,搞不来你
答案:6 悬赏:40 手机版
解决时间 2021-11-11 21:47
- 提问者网友:蓝莓格格巫
- 2021-11-11 16:58
C 语言 ,搞不懂你,搞不动你,搞不来你
最佳答案
- 五星知识达人网友:傲气稳了全场
- 2021-11-11 17:25
补充:遇到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") ;
所以要去看看函数递归式怎样的哈。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") ;
全部回答
- 1楼网友:摆渡翁
- 2021-11-11 20:59
那是因为a4又偷着生了三个,
- 2楼网友:怙棘
- 2021-11-11 19:53
*a 是地址,if是指*a为真,为真就是1,就是*a 为1时开始执行if.
- 3楼网友:孤独的牧羊人
- 2021-11-11 19:06
你好!!!
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
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
- 4楼网友:像个废品
- 2021-11-11 19:01
if(*a)是判a是否为字符串尾\0 否就 递归fun(a+1)。直到最后 从尾向头输出 dcba
这个程序就是 将字符串反向输出
这个程序就是 将字符串反向输出
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯