答案是a,那这个point函数里面的p+=3有什么用啊?

charlie811hanson 2008-08-19 01:15:33
point(char *p){p+=3;}
main()
{char b[4]={'a','b','c','d'},*p=b;
point(p);printf("%c\n",*p);
}
答案是a,那这个point函数里面的p+=3有什么用啊?
...全文
771 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
wfcwscwfc 2008-09-17
  • 打赏
  • 举报
回复
明日看!累了!·
wfcwscwfc 2008-09-17
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 guzhilei1986 的回复:]
C/C++ code
void point(char *&p){p+=3;}
int main()
{
char b[4]={'a','b','c','d'},*p=b;
point(p);printf("%c\n",*p);
system("pause");
return 0;
}


这样输出就变成d了
[/Quote]
牛X!
wolfdog1111 2008-09-17
  • 打赏
  • 举报
回复
留着
hyyuanqiang 2008-09-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 charlie811hanson 的帖子:]
point(char *p){p+=3;}
main()
{char b[4]={'a','b','c','d'},*p=b;
point(p);printf("%c\n",*p);
}
答案是a,那这个point函数里面的p+=3有什么用啊?
[/Quote]
传值的问题了
tooooooooooooooooooooooooold了
iamliadai 2008-09-17
  • 打赏
  • 举报
回复
引用当然不是值传递了。
[Quote=引用 20 楼 lunarfan 的回复:]
引用 18 楼 hahhh 的回复:
我的理解,c里面只有传值。
所谓的传地址,也是在传值,只不过这个值是个特殊的值。
你可以通过这个值来“改变”内存,但却不能“改变”这个值(也就是当实参的指针)本身。

拿lz的例子来解释一下:
main()中将p当实参传到point()中去,你能通过这个值(也就是p)来“改变”内存(比如可以修改b[]),但不能“改变”传进去的p(也就是数组首地址)值本身。
所以返回的是'a'

严重同意…
[/Quote]
lbh2001 2008-09-17
  • 打赏
  • 举报
回复
至少有两种方法可以达到你的目的

#include <stdio.h>
char *point(char *p)
{
return p += 3;
}

int main(void)
{
char b[4] = {'a','b','c','d'},*p=b;
p = point(p);
printf("%c\n",*p);
return 0;
}


#include <stdio.h>
void point(char **p)
{
*p += 3;
}

int main(void)
{
char b[4] = {'a','b','c','d'},*p=b;
point(&p);
printf("%c\n",*p);
return 0;
}
NSKevin 2008-09-17
  • 打赏
  • 举报
回复 1
此p非陂p,point(char *p){p+=3;} 将形参传进来的p给屏蔽了.
wuxwe 2008-09-16
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 hahhh 的回复:]
我的理解,c里面只有传值。
所谓的传地址,也是在传值,只不过这个值是个特殊的值。
你可以通过这个值来“改变”内存,但却不能“改变”这个值(也就是当实参的指针)本身。

拿lz的例子来解释一下:
main()中将p当实参传到point()中去,你能通过这个值(也就是p)来“改变”内存(比如可以修改b[]),但不能“改变”传进去的p(也就是数组首地址)值本身。
所以返回的是'a'
[/Quote]

非常非常同意。刚才引用错了哦,请原谅。
wuxwe 2008-09-16
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 cakexiang 的回复:]
地址变了,值没变
[/Quote]

非常非常同意.谢谢
mars_man 2008-09-16
  • 打赏
  • 举报
回复
作为教材用的,让你看清楚这样做是不行的,呵
hyyuanqiang 2008-08-28
  • 打赏
  • 举报
回复
char * 型的 形式参数

guzhilei1986 2008-08-20
  • 打赏
  • 举报
回复
void point(char *&p){p+=3;}
int main()
{
char b[4]={'a','b','c','d'},*p=b;
point(p);printf("%c\n",*p);
system("pause");
return 0;
}

这样输出就变成d了
ww2734 2008-08-20
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 batkkk003 的回复:]
当point()函数调用完后p就变为原来的地址!
[/Quote]
有道理!
ysysbaobei 2008-08-20
  • 打赏
  • 举报
回复
mark
batkkk003 2008-08-20
  • 打赏
  • 举报
回复
#include "stdio.h"
point(char *p){p+=3;} //阁下这里没有对变化进行保存.
char* apoint(char *p){return p+=3; }//这个新函数对变化进行保存.
int main()
{char b[4]={'a','b','c','d'},*p=b;
point(p);//调用后还原p
printf("%c\n",*p);
p=apoint(p);//给p指向个新地址!
printf("%c\n",*p);
return 0;
}
结果
a
d
batkkk003 2008-08-20
  • 打赏
  • 举报
回复
当point()函数调用完后p就变为原来的地址!
wwq100 2008-08-20
  • 打赏
  • 举报
回复
#include<stdio.h>


point(char *m){m+=3;}
main()
{char b[4]={'a','b','c','d'},*p=b;

printf("%c\n",*p);
point(p);

printf("%c\n",*p);

p=p+3;

printf("%c\n",*p);

getch();
}

输出为:
a
a
d
这里自己也没弄明白,呵呵,也感觉很奇怪
cprime 2008-08-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 charlie811hanson 的帖子:]
point(char *p){p+=3;}
main()
{char b[4]={'a','b','c','d'},*p=b;
point(p);printf("%c\n",*p);
}
答案是a,那这个point函数里面的p+=3有什么用啊?
[/Quote]
答案为什么是a,楼主是不是认为把字符b传给指针p,期望输出的是b是吗。如果是这样的话,你应当
这样 *p = b[1]。而你*p=b,是把b[0],也就是字符a传给了指针p。
#include <stdio.h>

point(char *p)
{
p+=3;
}
main()
{
char b[4]={'a','b','c','d'}, *p=b;
printf("%d\n",p);
printf("%c\n",*p);
point(p);
printf("%d\n",p);
printf("%c\n",*p);
}
输出的结果
-1073850452
a
-1073850452
a
lunarfan 2008-08-20
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 hahhh 的回复:]
我的理解,c里面只有传值。
所谓的传地址,也是在传值,只不过这个值是个特殊的值。
你可以通过这个值来“改变”内存,但却不能“改变”这个值(也就是当实参的指针)本身。

拿lz的例子来解释一下:
main()中将p当实参传到point()中去,你能通过这个值(也就是p)来“改变”内存(比如可以修改b[]),但不能“改变”传进去的p(也就是数组首地址)值本身。
所以返回的是'a'
[/Quote]
严重同意,我也认为所有的传递皆是在传值
传地址,引用也是值
freshui 2008-08-19
  • 打赏
  • 举报
回复
point(p);
函数没有修改p啊, 只修改了p的一个拷贝

point(char *p){p+=3;}

的执行过程可以这样理解
point(p)
{
char *_p = p; //将参数变量拷贝到函数调用的栈空间上以作进一步处理, 编译器做的
_p +=3;
}

记住: 函数调用的参数一定会被拷贝一次
加载更多回复(18)

70,012

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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