请问可以详细讲解一下这个程序吗
本帖最后由 baige 于 2020-9-4 21:57 编辑先让p指向e,接着调用函数传入c,e的地址实现交换,然后一直向外扩张去交换直到遇到'\0'结束递归 1、strlen(str) 得到 7,因为它计算的结果不包括字符串最后的结束符 '\0'
2、7/2 得到 3,因为是整型;数组名 str 代表首元素地址,str + 4 表示 str,即字符 'e'
3、f (p, p - 2) 表示将 str 和 str 的地址传入 f 函数
4、将 str 和 str 进行交换 ,得到 str[0] str[1] str[4] str[3] str[2] str[5] str[6] str[7] 的排序
5、s++ 使 s 指向 str ;同理 t-- 使 t 指向 str
6、递归,交换 str 和 str, 得到 str[0] str[5] str[4] str[3] str[2] str[1] str[6] str[7]
7、继续递归,交换 str 和 str ,得到 str[6] str[5] str[4] str[3] str[2] str[1] str[0] str[7]
8、s 指向 str 时,即指向结束符 '\0' ,结束递归,此时得到的数组,其元素排序和原来的相反,所以...
大概是这样的吧 {:10_249:} str 和 str 进行交换 ,得 str str str str str str str str 的排序 s++ 使 s 指向 str ;同理 t-- 使 t 指向 str递归,交换 str 和 str, 得到 str str str str str str str str继续递归,交换 str 和 str ,得到 str str str str str str str strs 指向 str 时,即指向结束符 '\0' ,结束递归,此时得到的数组,元素排序和原来的相反。 本帖最后由 风过无痕1989 于 2020-9-5 09:45 编辑
该程序运行的结果,D是正确的!
#include<stdio.h>
#include<string.h>
void f(char *s,char *t)
{
char k;
k = *s;*s = *t;*t = k;
s++;t--;
if(*s)(f,t);
}
void main()
{
char str ="abcdefg",*p;
p = str + strlen(str)/2 + 1;
f(p,p - 2);
printf("%s\n",str);
}
风过无痕1989 发表于 2020-9-5 09:42
该程序运行的结果,D是正确的!
仔细核对一下代码,亲
第8行抄错了 本帖最后由 风过无痕1989 于 2020-9-7 13:16 编辑
永恒的蓝色梦想 发表于 2020-9-6 19:48
仔细核对一下代码,亲
第8行抄错了
看走眼了,第8行是抄错了,运行后,答案B是正确的
#include<stdio.h>
#include<string.h>
void f(char *s,char *t) // 定义 f 函数,形参是两个指针变量
{
char k; // 定义一个临时变量 k
k = *s; // 将接收的第一个实参赋给临时变量 k (原程序下面几行写在一行,为了解释方便,分开成几行了)
*s = *t; // 将接收的第二个实参赋给第一个实参指向的地址
*t = k; // 将临时变量保存的原第一个实参的值赋给第一个实参指向的地址。至此,就完成了两个实参的互换
s++; // 将第一个实参指向的地址加 1
t--; // 将第二个实参指向的地址减法 1
if(*s)f(s,t); // 递归调用 f 函数
}
void main()
{
char str ="abcdefg",*p;// 定义一个字符数组并赋值,定义一个字符型指针变量p
p = str + strlen(str)/2 + 1; // 用 strlen 计算字符数组的长度,字符的长度是 1,7个字符长度就是7,除 2 就是3.5,自动取整就是 3,于是字符型指针 p 就指向了数组首地址 + 3 + 1,即字符 e
f(p,p - 2); // 将字符型指针指向的地址,及该地址减2,作为函数 f 的两个实参,调用 f 函数
printf("%s\n",str); // 输出字符串,即函数返回的数组各元素的值
}
既然楼主至今没有选出最佳答案,想必是没有得到他想要的结果,而我又将抄错了的程序,纠正后重新出来了。现补充程序每一步实现的功能,帮助楼主理解,希望是楼主想的结果了。
页:
[1]