在Qt编程中,会经常使用指针、引用对变量进行传递与运算,总结一下。
指针是与数据相对应的,比起将整个数据进行传递而言,指针明显是更轻更快的;
例如对于二维数据的有关计算,个人习惯于用连续的一维数组进行表示:
int main(){
void func(float *p,int m,int n);
int m=100,n=50;
float *p=(float *)malloc(siezof(float)*m*n);
memset(p,0,sizeof(float)*m*n);
func(p,m,n);
return 0;
}
void func(float *p,int m,int n){
for(int i=0;i<m;i++){
for(int=0;j<n;j++){
*(p+i+j)=i+j;
}
}
}
引用是对变量的别名,是和取址符不同的;
引用是和类型相关的,取址是和变量相关的,例如:
int a=10;
int &ra=a;
int *p=&a;
一些应用:
void MainWindow::importData(const QString &filePath)
{
//第一种写法 :常规
QFile infile(filePath);
if( !infile.open(QIODevice::ReadOnly) ) {
qDebug() <<__func__ <<infile.errorString();
return;
}
QDataStream instream(&infile);
//第二种写法:指针
QFile *infile=new QFile(filePath);
if( !infile->open(QIODevice::ReadOnly) ) {
qDebug() <<__func__ <<infile->errorString();
return;
}
QDataStream instream(infile);
//第三种写法:引用
QFile *infile=new QFile(filePath);
if( !infile->open(QIODevice::ReadOnly) ) {
qDebug() <<__func__ <<infile->errorString();
return;
}
QDataStream *instream0=new QDataStream(infile);
//QFile 继承于 QIOdevice;
QDataStream &instream=*instream0;
//此处本来打算使用拷贝构造函数将QDataStream *转为QDataStream,
//QDataStream instream=*instream0;(不支持拷贝)
//但QDataStream没有拷贝构造函数、操作符=,因此使用引用,不改变后续的代码;
//qt ,default doubleprecision ,bigendian
instream.setFloatingPointPrecision(QDataStream::SinglePrecision);
instream.setByteOrder( QDataStream::LittleEndian );
}
指针类型转换是改变指针对数据的获取方式,例如对于函数
int QDataStream::readRawData(char *s, int len)
来说,是将流中的数据按单个字节读入直到len个字节长度,那怎么将读入的数据组合为4字节的float类型的变量呢?答案是改变指针类型,将数据按单个字节读入,然后按浮点数据解释(即类型转换)。
QDataStream out(&filePath);//filePath为const QString类型
float vf=0.0f;
out.readRawData((char*)&vf,sizeof(float));//按单字节读入
p->m_wellDepth=vf;//p为一结构体,m_wellDepth为p的浮点类型成员变量;
类型转换并不改变数据的存储形式,而是改变解释形式。