指针数组,数组指针,指针函数,函数指针的区别及类型间的转换

/*************************************************
此文件包含各种复杂指针用法的区分:
指针数组
数组指针
指针函数
函数指针
指向指针的指针
vector<Line*>类型转换成vector<Point*>类型

vector<Point*>型转换成vector<Line*>类型
注意:这里是Point*类型转换成Line*类型
/*************************************************/
#include <iostream>
#include <vector>
using namespace std;
//const int n=3;
//int *p();
//int (*p)();


int *fun(int* x)
{
 (*x)++;
 return x;
}

int funy(int& y)
{
 y++;
 return y;
}

class Point
{
private:
 int _x;
 int _y;
public:
   
 Point(int x,int y)
 {
  _x=x;
  _y=y;
 }
 //定义拷贝构造函数
 Point(Point& pt):_x(pt._x),_y(pt._y){}
 
 Point(){_x=0;_y=0;}
 ~Point(){}
 int GetX(){return _x;}
 int GetY(){return _y;}
 Point& operator+(Point& pt)
 {
  Point temp;
  temp._x=_x+pt._x;
  temp._y=_y+pt._y;
  return temp;
 }
 
 Point& operator-(Point& pt)
 {
  Point temp;
  temp._x=this->_x-pt._x;
  temp._y=this->_y-pt._y;
  return temp;
 }
 
 virtual Point& GetPoint1(){}
 
 virtual Point& GetPoint2(){}
 
 /*Point operator=(Point& pt)
 {
  _x=pt._x;
  _y=pt._y;
  return *this;
 }*/
 
 
 
};

class Line:public Point
{
private:
 Point _point1;
 Point _point2;
public:
 //不带参的构造函数
 Line()
 {
  _point1=Point(0,0);
  _point2=Point(1,1);
 }
 //带参的构造函数
 Line(Point& p1,Point& p2)
 {
  _point1=p1;
  _point2=p2;
 }
 //拷贝构造函数
 Line(Line& line);
 //计算两点间的距离
 float Distance(Point& p1,Point& p2) const;
 
 Point& GetPoint1()
 {
  return _point1;
 }
 
 Point& GetPoint2()
 {
  return _point2;
 }
};

Line::Line(Line& line)
{
 this->_point1=line._point1;
 this->_point2=line._point2;
}
 
float Line::Distance(Point& p1,Point& p2) const
{
 
}

int main()
{
 
 //线段调用默认构造函数
 Line line1;      //(0,0)---->(1,1)
 Point pt1(3,3);
 Point pt2(5,5);
 Point pt3(pt1);
 Point pt4=pt1+pt2;
 Point pt5=pt2-pt1;
 Line line2(pt1,pt2);
 //Line line3(pt4,pt5);
 
 cout<<"("<<pt1.GetX()<<","<<pt1.GetY()<<")"<<endl;
 cout<<"("<<pt4.GetX()<<","<<pt4.GetY()<<")"<<endl;
 cout<<"("<<pt5.GetX()<<","<<pt5.GetY()<<")"<<endl;
 Point pt6=line1.GetPoint1();
 Point pt7=line1.GetPoint2();
 /*cout<<"线段1的起始点跟终止点是:"<<endl;
 cout<<"("<<pt6.GetX()<<","<<pt6.GetY()<<")"<<endl;
 cout<<"("<<pt7.GetX()<<","<<pt7.GetY()<<")"<<endl;
 
 Point pt8=line2.GetPoint1();
 Point pt9=line2.GetPoint2();
 cout<<"线段2的起始点跟终止点是:"<<endl;
 cout<<"("<<pt8.GetX()<<","<<pt8.GetY()<<")"<<endl;
 cout<<"("<<pt9.GetX()<<","<<pt9.GetY()<<")"<<endl;*/
 
  //将vector<Line*>类型转换成vector<Point*>类型
   vector<Line*> line;
   vector<Point*> point;
    point.push_back(&line1);   //上行转换
   point.push_back(&line2);
   for(int i=0;i<point.size();i++)
   {
    Point ptemp1=point[i]->GetPoint1();
    Point ptemp2=point[i]->GetPoint2();
    cout<<"线段"<<i+1<<"的起始点跟终止点是:"<<endl;
    cout<<"("<<ptemp1.GetX()<<","<<ptemp1.GetY()<<")"<<endl;
    cout<<"("<<ptemp2.GetX()<<","<<ptemp2.GetY()<<")"<<endl;
   }
   line.push_back((Line*) &pt1);   //下行转换,不安全???
   line.push_back((Line*) &pt2);
   
   for(int i=0;i<line.size();i++)
   {
    cout<<"pt"<<i+1<<"坐标为:"<<endl;
    cout<<"("<<line[i]->GetX()<<","<<line[i]->GetY()<<")"<<endl;
   }
   
 //指针数组
 int *p[4];
 
 int a[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
 for(int i=0;i<4;i++)
  p[i]=a[i];
 for(int i=0;i<4;i++)
  for(int j=0;j<4;j++)
   cout<<*(p[i]+j)<<" ";
 cout<<endl;
 //数组指针
 int (*pvar)[4];
 pvar=a;
 for(int i=0;i<4;i++)
  for(int j=0;j<4;j++)
   cout<<*(*(pvar+i)+j)<<" ";
 cout<<endl;
 //指针函数
 int b=1;
 cout<<*fun(&b)<<endl;
 
 //函数指针
 int c=2;
 
 int (*pfun)(int& x);
 pfun=funy;
 cout<<(*pfun)(c)<<endl;
 
 //p=a;
 //for(int i=0;i<4;i++)
 // for(int j=0;j<4;j++)
 //  cout<<*(*(p+i)+j)<<" ";
 //int (*p)[n];
 
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值