C++ 让函数返回数组的方法
这个问题属于非常初级的问题,但是对于初学不知道的人可能会比较头疼。C++中函数是不能直接返回一个数组的,但是数组其实就是指针,所以可以让函数返回指针来实现。比如一个矩阵相乘的函数,很容易地我们就写成:
#includeusingnamespacestd; float*MultMatrix(floatA[4],floatB[4]) { floatM[4]; M[0]=A[0]*B[0]+A[1]*B[2]; M[1]=A[0]*B[1]+A[1]*B[3]; M[2]=A[2]*B[0]+A[3]*B[2]; M[3]=A[2]*B[1]+A[3]*B[3]; returnM; } intmain() { floatA[4]={1.75,0.66,0,1.75}; floatB[4]={1,1,0,0}; float*M=MultMatrix(A,B); cout< 但是运行后发现结果是:
1.751.75
6.51468e-0393.76489e-039本不是想要的结果。于是我们在函数中也加上显示代码,看看是不是计算的问题,得到结果:
1.751.75
00
1.751.75
1.968751.75发现计算的结果是正确的,但返回后就变了,而且跟上次的结果不一样。这是为什么呢?
因为在函数中定义的数组M在函数执行完后已经被系统释放掉了,所以在调用函数中得到的结果当然不是计算后的结果。有一个解决办法就是动态分配内存,在函数中new一个数组,这样就不会被释放掉了。
于是就应该将:
floatM[4];改为:
float*M=newfloat[4];修改运行后得到结果:
1.751.75
00
1.751.75
00正确。但是我们这样并没有将自己申请的空间释放掉,如果我们在函数内释放的话结果就会跟开始时的一样了。
看看我们的调用代码:
float*M=MultMatrix(A,B);这样其实是将M指针指向了函数中M数组的首地址,我们可以将M指针释放,效果和释放申请的M数组是一样的,因为它们指向的是同一片内存空间。于是代码就修改为:
#includeusingnamespacestd; float*MultMatrix(floatA[4],floatB[4]) { float*M=newfloat[4]; M[0]=A[0]*B[0]+A[1]*B[2]; M[1]=A[0]*B[1]+A[1]*B[3]; M[2]=A[2]*B[0]+A[3]*B[2]; M[3]=A[2]*B[1]+A[3]*B[3]; cout< 运行结果:
1.751.75
00
1.751.75
00没有问题,new的空间也delete掉了。
鉴于下面大牛们的建议,我将程序修改如下,大家看可否:
#includeusingnamespacestd; voidMultMatrix(floatM[4],floatA[4],floatB[4]) { M[0]=A[0]*B[0]+A[1]*B[2]; M[1]=A[0]*B[1]+A[1]*B[3]; M[2]=A[2]*B[0]+A[3]*B[2]; M[3]=A[2]*B[1]+A[3]*B[3]; cout< 点评内容:
首先,数组的delete是delete[]。
其次,C++里面手动内存分配的一个重要原则是谁分配谁释放。
所以,不应该在MultMatrix里new数组,而应该在外面new好了之后传进去修改。
要想返回一个数组,使用智能指针之类的东西才是正途。
以上就是C++让函数返回数组的方法的详细内容,更多关于C++让函数返回数组的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。