#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char *str=(char*)malloc(sizeof(char)*81);
gets(str);
int i, k;
char *p; //假如说str="hello" 那么p=str,就是从h开始,p=str+1就是从e开始,p=str+5就是说p=“ ”(空格)!
len = strlen(str);
p = str + len; //str可以认为是malloc(char*81)然后*p指向str,让p访问str,从而一定程度上p等价于str!!!
//其实我们在while循环是把p当成了str的子字符串
while (1)
{
if ( p == str )
{
printf("%s\n", p);//细节
break;//细节
}
if (*p == ' ' && *(p+1) != ' ') //细节
{
*p = '\0';//赋值!!!
printf("%s ", p+1);
}
p--;//相当于p在取len,len->len-1,len->len-3,len->len-4这么一个循环, 再通俗一点就是*p=str+k相当于str【len】一个的字符,到str 【len】-str【len-1】的字符
//又由于数组的有效长度是0->len-1 ,所以str【len】其实得到的是一个空格,后面的str【len-1】开始得到我们输入的字符(末尾字符)。
//当我们str【】再次取到空格时说明我们已经完全一个单词的指向啦,这时候让*(p+1)来输出str【a】-str【len】的长度(p此时指向的就是str【a】到str【len】的地址)
// 以此反复,最终使p与str最初的地址相同,来输出剩余的第一个单词(在反复取单词的过程中,我们让*p='\0'从而我们能够 在每次取单词的时候只取单个的单词
}
free(str);
return 0;
}
/*输入hello world ----len=11
----str[11]
d ----str[10]->str[11]
ld ----str[9]->str[11]
rld ----str[8]->str[11]
orld ----str[7]->str[11]
world ----str[6]->str[11]
----str[5]=0 此时让p='/0',插入'/0'让p只能指向本单词,不会指向后面的world但是p依旧还是指向着world的地址 ,相当于让str[5]='/0'啦
o ----str[4]->str[11]
lo ----str[3]->str[11]
llo ----str[2]->str[11]
ello ----str[1]->str[11]
hello ----str[0]->str[11]
*/