遇到指针问题了,求原因

lhyxiaolang 2012-10-18 07:34:13
功能是字符串反转,不知道怎么回事了,输入abcdef 但是反转后变成cba。 前半截怎么没有了?求原因?

char * str(char *q)
{
//int len = strlen(p);
//char *q = p;
char *n = q;
while(*(n+1)!='\0')
{
n++;
}

while(q<n)
{



// *q++ = *n--;
char t = *q;
*q = *n;
*n = t;
q++;
n--;



}
return q;
}

...全文
111 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
pw2156314 2012-10-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
引用 4 楼 的回复:
引用 1 楼 的回复:

你不能直接返回q的,可以事先记录下字符串首地址,留最后返回指针用。

讲讲具体原因嘛


return q;
最后的q已经不再指向字符串的开头了.
可以改成这样:


C/C++ code

char * str(char *q)
{
//int len = strlen(p);
//char *……
[/Quote]++
xiaoxiao8310 2012-10-18
  • 打赏
  • 举报
回复
调用后实际上buf的值是反转了的,虽然你在调用过程中也++了多次,但是调用结束后,它又指向原地址了。
更正:buf指针本身并未++,因形参是实参的一个拷贝,它有自己的内存空间,里面存的值就是你实参传的值
xiaoxiao8310 2012-10-18
  • 打赏
  • 举报
回复
如下调用此函数:
int func()
{
char buf[56] = {0};
strcpy(buf,"aaaaaaaaaaaaaaaaa");
char *p = NULL;
p = str(buf);
return 0;
}

调用后,你本身对buf内容已经做了反转了,但p指向的是buf被++多次之后的地方。
调用后实际上buf的值是反转了的,虽然你在调用过程中也++了多次,但是调用结束后,它又指向原地址了。
lhyxiaolang 2012-10-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 4 楼 的回复:
引用 1 楼 的回复:

你不能直接返回q的,可以事先记录下字符串首地址,留最后返回指针用。

讲讲具体原因嘛


return q;
最后的q已经不再指向字符串的开头了.
可以改成这样:

C/C++ code
char * str(char *q)
{
//int len = strlen(p);
//char *q = p……
[/Quote]
已经知道了,谢谢。
Eleven 2012-10-18
  • 打赏
  • 举报
回复
char * str(char *q)
这个函数最好还是加个参数,指示长度信息
JiMoKuangXiangQu 2012-10-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 1 楼 的回复:

你不能直接返回q的,可以事先记录下字符串首地址,留最后返回指针用。

讲讲具体原因嘛
[/Quote]

return q;
最后的q已经不再指向字符串的开头了.
可以改成这样:

char * str(char *q)
{
//int len = strlen(p);
//char *q = p;
char *s = q;
char *n = q;
while (*(n+1)!='\0')
{
n++;
}

while (q < n)
{
// *q++ = *n--;
char t = *q;
*q = *n;
*n = t;
q++;
n--;
}

return s;
}
mujiok2003 2012-10-18
  • 打赏
  • 举报
回复

char * str(char *q)
{
//暂存字符串首地址
char* pOld = q;
char *n = q;
while(*(n+1)!='\0')
{
n++;
}

while(q<n)
{



// *q++ = *n--;
char t = *q;
*q = *n;
*n = t;
q++;
n--;
}
//return q;
return pOld;
}

lhyxiaolang 2012-10-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

所以说用指针很危险
因为他太强大了

p++;
不应该改的指针就要用多一个变量来传递
[/Quote]
谢谢,你一句话,点醒我了。。。此时P已经指到后面的位置了。我知道了,非常感谢。
order_c 2012-10-18
  • 打赏
  • 举报
回复
“fedcba”
第二个while执行完p指向字符'c',所以输出cba.
「已注销」 2012-10-18
  • 打赏
  • 举报
回复
所以说用指针很危险
因为他太强大了

p++;
不应该改的指针就要用多一个变量来传递
lhyxiaolang 2012-10-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

你不能直接返回q的,可以事先记录下字符串首地址,留最后返回指针用。
[/Quote]
讲讲具体原因嘛
lhyxiaolang 2012-10-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

return q;
q已经被你加了3下

在程序一开始加上
char *pOld=q;
...
最后
return pOld;

pOld不要动
[/Quote]
大哥讲清楚一点嘛,原因?
I_ask_who 2012-10-18
  • 打赏
  • 举报
回复
return q;
q已经被你加了3下

在程序一开始加上
char *pOld=q;
...
最后
return pOld;

pOld不要动
sublimepan 2012-10-18
  • 打赏
  • 举报
回复
你不能直接返回q的,可以事先记录下字符串首地址,留最后返回指针用。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧