本站首页    管理页面    写新日志    退出


 

 

 


最新日志

练车
今天是2011年07月02号
温馨
CInternetSession 类
CHttpFile实现Get/Post
在MFC中加一个控制台DOS界面
strtol 函数
outputParam
有关CTime和ColeDateTime
variant_t ,_bstr_t 与

 


 

最近的评论

回复:CHttpFile实现Get/Po
回复:好久没有来了
回复:参数自整定的模糊PID
回复:电子设计大赛自由命题可参考的题目
回复:数字万用表使用方法
回复:公交车上巨搞笑的一幕
回复:电子设计大赛自由命题可参考的题目
回复:电子设计大赛自由命题可参考的题目
回复:电子设计大赛自由命题可参考的题目
回复:暑假回来

 


 

连接




    

引用方式处理数组(原创)
sccwqiang 发表于 2008/10/24 13:43:52

 我们知道c++中不能建立数引用的数组,因为数组名只是代表数组的首地址,而不是一个变量(显然它是常数嘛),所以不能建立引用的数组。当用数组作为参数进行传递时,一般相到指针方式的值传递。而有了C++的引用,它的优点使得有时候可能想这样做,就是形参用引用方式来进行处理。由于不能用引用形的数组(int &arr[2][3])作为形参,所以象我等初学者认为这是不可能的。今天没事我就自己弄弄看,居然可以用引用。思路大体如下:因可以建立指针的引用,所以想到中间代换,即先用一指针指向数组的首地址,然后再建立该指针的引用,这就相当于有了中间指针的别名,当改变别名的值时,就改变了中间指针变量中的值,而中间指针变量又是指向数组元数的,自然就改变了数组的值了。例如:int a[2];先建立指向数组的指针int *p=a;然后就可建立指针的引用:int *&pt=p;这是pt 其实就是指针p的别名了,也就是p和pt是同一个变量了,改变pt就等于改变p,而改变指针p就是改变了p指向的变量的值了。 下面是一个二行三列矩阵的加法运算,并输出结果,由于需要重载了<<和+,数据成员data是数据成员,一个二行三列的数组。多的就不说了,好多地方都标出来了,仔细看一下就知道了。 #include <iostream.h> /*====================声明矩阵类=========================*/class Rect{public: Rect();//声明无参构造函数 Rect(int *&p);  //带一个参数的构造函数,用于二维数组的引用算法 friend ostream & operator<<(ostream &,Rect &); //友元重载<<运算符 Rect operator+ (Rect &other); //成员重载+运算符private: int data[2][3]; //二行三列矩阵 }; /*===============类体外相关定义=======================*/Rect::Rect(){for(int i=0;i<2;i++)  for(int j=0;j<3;j++)  {   data[i][j]=0;  }} Rect::Rect(int *&p){ int *pt=data[0]; int *&p1=pt; for(int i=0;i<6;i++) *(p1++)=*(p++); }Rect Rect::operator+(Rect &other) //定义成员重载+运算符{ Rect ret; for(int i=0;i<2;i++)  for(int j=0;j<3;j++)  {   ret.data[i][j]=data[i][j]+other.data[i][j];  }  return ret;} ostream &operator<<(ostream & output,     Rect &rect)//定义友元重载<<运算符{    for(int i=0;i<2;i++) {  for(int j=0;j<3;j++)   output<<rect.data[i][j]<<" ";  output<<endl; } return output;} /*==================主函数=====================*/void main(){ int data1[2][3];//等待输入 int data2[2][3]={{1,1,1},{2,2,2}};  //int *pt=data1[0]; for(int i=0,*pt=data1[0];i<sizeof(data1)/sizeof(int);i++) {  cin>>*(pt++); }  int *p2=data1[0];//先用一指针得到数组首地址 Rect re1(p2);//此时调用指针引用 p2=data2[0]; Rect re2(p2); Rect re3;  re3=re2+re1; cout<<re3<<endl;} 输入:1 2 3 4 5 6 结果:1 2 3 4 5 6      2 3 4      6 7 8 Press any key to continue说明:二维数组:a[2][3];  a=a[0];但是a+1 != a[0]+1;因a+1=a[1]=&a[1][0],而a[0]+1=&a[0][1]   另外这是个人所得,不知是否孤陋寡闻,因不才看的c++书中没有介绍这种方法,如果有人看到相关的书,告知小弟一声!还有如果有误请指出,谢谢!

阅读全文(1300) | 回复(0) | 编辑 | 精华


发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

 

 

 


站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.031 second(s), page refreshed 144754624 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号