| 
 | 
 
 
发表于 2021-2-15 18:55:18
|
显示全部楼层
 
 
 
 本帖最后由 一叶枫残 于 2021-2-15 18:57 编辑  
 
我知道你那个问题在哪了: 
首先,传入的是一个指针(字符串名就是一个指针,储存的是地址值),因为函数是值传递,它给的是那个地址值,不是那个指针,你只能修改这个地址值的解引用也就是值,你在函数修改其地址值并不对main里面的s的地址值产生任何影响,看下面代码就清楚了 
- #include <stdio.h>
 
 - #include <stdlib.h>
 
 - #define MAXS 20
 
  
- void f( char *p );
 
 - void ReadString( char *s ); /* 由裁判实现,略去不表 */
 
  
- int main()
 
 - {
 
 -         char s[MAXS];
 
 -         printf("主函数里:");
 
 -         printf("开始时s的地址:%x\n",s);
 
 -         printf("请输入字符串:");
 
 -         gets(s); 
 
 -         f(s);
 
 -         printf("主函数里:调用函数后s的地址:%x\n", s);
 
  
-          return 0;
 
 - }
 
  
- /* 你的代码将被嵌在这里 */
 
 - void f( char *p )
 
 - {
 
 -         printf("\n函数f里:\n开始时p的地址:%x\n",p);
 
 -         int i = 0;
 
 -         char *a;
 
 -         printf("开始时a的地址:%x\n",a);
 
 -         while (*p != '\0')
 
 -             {
 
 -                 i ++;
 
 -                 p ++;
 
 -             }
 
  
-             a = (char *)malloc(i);
 
 -             printf("分配内存后时a的地址:%x\n",a);
 
 -             int m = 0;
 
 -             int t = 0;
 
 -     
 
 -             p = p-i;
 
 -             for (m = i-1;m >= 0; m--)
 
 -             {
 
 -                 a[t] = p[m];
 
 -                        t ++;
 
 -             }
 
 -             a[t] ='\0';
 
 -             p = a;
 
 -             printf("结束后p的地址:%x\n",p);
 
 -             printf("结束后a的地址:%x\n\n",a);
 
 - }
 
  复制代码- 主函数里:开始时s的地址:62fe00
 
 - 请输入字符串:abcd
 
  
- 函数f里:
 
 - 开始时p的地址:62fe00
 
 - 开始时a的地址:62fd70
 
 - 分配内存后时a的地址:986ad0
 
 - 结束后p的地址:986ad0
 
 - 结束后a的地址:986ad0
 
  
- 主函数里:调用函数后s的地址:62fe00
 
  复制代码 
你看地址都没有改变,怎么可能实现,还有的是,在PTA里没给出#include<stdlib.h>,意味着你不能使用malloc,一开始出发思路就错了,其实正确做法是调换值,例如字符串是abcd,a和d调换,b和c调换,就变成了dcba了,这个是可以实现的,因为地址值不能改变,但是其解引用后的值可以改变 |   
 
 
 
 |