题目
现有一个字符串"eeddccbbaa",要求写一个函数(接口),实现字符串的反转。
代码
#include<stdio.h> #include<stdlib.h> #include<string.h> char* recv_str(char *from,int len) { // 判断字符串是否存在 if (from==NULL) { printf("from字符串不存在\n"); return NULL; } // 使得p 指向字符串的尾部 char *p = from + len -1; // 为了使 len 的值一直保存的是字符串的长度 int l = len; char *to = (char*)malloc(100); // 转化成的目的字符串 if (to==NULL) { printf("to字符串malloc失败!\n"); return NULL; } // 根据字符串的长度,让字符串 from 最后一个字符换到字符串 to 的第一个字符以此类推 for (;l>0;p--,to++,l--) { *to = *p; } // 使字符串的最后一个字符是‘\0’ *to = '\0'; // 使得 to 指针从新指向字符串的开头 to = to - len; return to; } int main() { char from[100] = "eeddccbbaa"; int len = strlen(from); // 求出字符串长度 char *to = recv_str(from, len); printf("%s", to); // 打印出字符串 return 0; }
解析
1. 调用者与被调用者
在参考代码中我们可以看到 rev_str 函数和 main 函数,在 main 函数中调用了 rev_str 函数,那么我们就说 main 函数是调用者,rev_str 函数是被调用者。
2. 指针的输入输出
指针的输入输出是站在被调用者的角度上的,也就是站在此题答案中rev_str 函数的角度上。
rev_str 函数有两个参数 from,len,调用者 main函数在栈区给字符串“eeddccbbaa“分配了空间,通过指针 form 使得被调用者 rev_str 函数得到字符串”eeddccbbaa”的地址,像这种调用者分配空间让被调用者使用的指针参数我们称之为输入参数。而被调用者 rev_str 函数分配了空间通过指针 to 传回给调用者 main 函数,我们称之为指针的输出。