一个关于引用和指针的问题

mading0817 2012-03-19 08:20:07
大家好,关于C++我有个问题不太明白
Point a(3,5)
Point b(4,6)
sort(&a,&b)

sort(*a,*b)
{
a->x=6;
b->x=8;
}
cout<<a.x<<b.x<<endl
为什么最后这个a和b的x值其实没有改变啊请问?
谢谢大伙!
...全文
272 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
mading0817 2012-03-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 buer3587 的回复:]

二楼的代码:a和b这两个指针并没有发生变化,但a->x和b->x的值已经交换,三楼的sort(point* a,point *b)函数 对指针指向的结构体的x进行操作,所以a.x=6 b.y=8 楼主能否贴下具体代码跟结构
[/Quote]源代码是这样的。
Point a(100, 100, 255, 0, 0);
Point b(100, 50, 0, 255, 0);
Point c(50, 50, 0, 0, 255);

sortTriVertices(&a, &b, &c);
cout<<"after sort a.x,a.y :"<<a.x<<","<<a.y<<endl;
cout<<"after sort b.x,b.y :"<<b.x<<","<<b.y<<endl;
cout<<"after sort c.x,c.y :"<<c.x<<","<<c.y<<endl;


void Core::sortTriVertices(Point *a, Point *b, Point *c)
{

cout<<"a.x,a.y :"<<a->x<<","<<a->y<<endl;
cout<<"b.x,b.y :"<<b->x<<","<<b->y<<endl;
cout<<"c.x,c.y :"<<c->x<<","<<c->y<<endl;
cout<<"before :::::::"<<endl;

Point *p1;
Point *p2;
Point *p3;

if((a->y < b->y && a->y < c->y) || ((a->y == b->y || a->y == c->y) && (a->x < b->x || a->x < c->x)))
{
p1 = a;
p2 = b;
p3 = c;
}
else if(b->y < a->y && b->y < c->y || ((b->y == a->y || b->y == c->y) && (b->x < a->x || b->x < c->x)))
{
p1 = b;
p2 = a;
p3 = c;
}
else if(c->y < a->y && c->y < b->y || ((c->y == b->y || c->y == a->y) && (c->x < b->x || c->x < a->x)))
{
p1 = c;
p2 = a;
p3 = b;
}

a = p1;
if(p1->x >= p2->x && p1->x >= p3->x)
{


b = (float)(p2->y - p1->y)/abs((p2->x - p1->x)) > (float)(p3->y - p1->y)/abs((p3->x - p1->x)) ? p3:p2;
c = (float)(p2->y - p1->y)/abs((p2->x - p1->x)) < (float)(p3->y - p1->y)/abs((p3->x - p1->x)) ? p3:p2;

if(p2->x >= p1->x && p3->x >= p1->x )
{
b = (float)(p2->y - p1->y)/(p2->x - p1->x) > (float)(p3->y - p1->y)/(p3->x - p1->x) ? p2:p3;
c = (float)(p2->y - p1->y)/(p2->x - p1->x) < (float)(p3->y - p1->y)/(p3->x - p1->x) ? p2:p3;

}

if((p2->x > p1->x && p3->x < p1->x) || (p2->x < p1->x && p3->x > p1->x))
{
b = p2->x < p3->x ? p2:p3;
c = p2->x > p3->x ? p2:p3;
}
cout<<"a.x,a.y :"<<a->x<<","<<a->y<<endl;
cout<<"b.x,b.y :"<<b->x<<","<<b->y<<endl;
cout<<"c.x,c.y :"<<c->x<<","<<c->y<<endl;
}


//////////////
最后执行结果是这样的:
a.x,a.y :100,100
b.x,b.y :100,50
c.x,c.y :50,50
before :::::::
a.x,a.y :50,50
b.x,b.y :100,100
c.x,c.y :100,50
after sort a.x,a.y :100,100
after sort b.x,b.y :100,50
after sort c.x,c.y :50,50
mading0817 2012-03-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pathuang68 的回复:]

俺咋觉得没错呢?

C/C++ code

#include <iostream>
using namespace std;

typedef struct _Point
{
int x;
int y;
}Point;

void swap(Point *a, Point *b)
{
int x = a->x;
a->x = b->x;
b->x ……
[/Quote]对阿我也很奇怪,我就怕是个特弱智的问题。我贴原码您帮忙看看。
mading0817 2012-03-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ivers0n 的回复:]

传值会发生拷贝
[/Quote]感谢关注!
不二Se 2012-03-19
  • 打赏
  • 举报
回复
二楼的代码:a和b这两个指针并没有发生变化,但a->x和b->x的值已经交换,三楼的sort(point* a,point *b)函数 对指针指向的结构体的x进行操作,所以a.x=6 b.y=8 楼主能否贴下具体代码跟结构
自信男孩 2012-03-19
  • 打赏
  • 举报
回复
传递地址过去,可以修改的。没有发现有什么错误。
赵自行 2012-03-19
  • 打赏
  • 举报
回复



#include<iostream>
using namespace std;
struct point
{
int x;
int y;
point(int x,int y)
{
this->x=x;
this->y=y;
}
};
void sort(point* a,point *b)
{
a->x=6;
b->x=8;
}
int main()
{
point a(3,5);
point b(4,6);
cout<<a.x<<" "<<a.y<<endl;
cout<<b.x<<" "<<b.y<<endl;
sort(&a,&b);
cout<<a.x<<" "<<a.y<<endl;
cout<<b.x<<" "<<b.y<<endl;
return 0;
}

试了试,可一改变啊!!
等候解释中!
pathuang68 2012-03-19
  • 打赏
  • 举报
回复
俺咋觉得没错呢?


#include <iostream>
using namespace std;

typedef struct _Point
{
int x;
int y;
}Point;

void swap(Point *a, Point *b)
{
int x = a->x;
a->x = b->x;
b->x = x;
}

void main()
{
Point a = {1, 2};
Point b = {2, 3};
swap(&a, &b);
cout << a.x << endl;
cout << b.x << endl;
}


传指针的本质是传递指针的拷贝,指针本身是不会改变的,但是指针所指向的内容可以改变。所以上面我给出的示例代码,a和b这两个指针都没有发生变化,但a->x和b->x的值却能够正确地交换。

这个和两个int的交换稍有点不同。

对于楼主给出的代码sort的写法,如果是这样的话:
sort(Point *a, Point *b)
{
a->x=6;
b->x=8;
}
个人认为不应该有问题。
IVERS0N 2012-03-19
  • 打赏
  • 举报
回复
传值会发生拷贝

65,186

社区成员

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

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