作者:杨溪 

链接:https://www.cnblogs.com/yangxi/archive/2011/09/18/2180759.html

这个问题属于非常初级的问题,但是对于初学不知道的人可能会比较头疼。C++中函数是不能直接返回一个数组的,但是数组其实就是指针,所以可以让函数返回指针来实现。比如一个矩阵相乘的函数,很容易地我们就写成:

 1 #include  2  3 using namespace std; 4  5 float* MultMatrix(float A[4], float B[4]) 6 { 7     float M[4]; 8     M[0] = A[0]*B[0] + A[1]*B[2]; 9     M[1] = A[0]*B[1] + A[1]*B[3];10     M[2] = A[2]*B[0] + A[3]*B[2];11     M[3] = A[2]*B[1] + A[3]*B[3];12 13     return M;14 }15 16 int main()17 {18     float A[4] = { 1.75, 0.66, 0, 1.75 };19     float B[4] = {1, 1, 0, 0};20     float *M = MultMatrix(A, B);21     cout <0] <" " <1] <endl;22     cout <2] <" " <3] <endl;23 24     return 0;25 }

但是运行后发现结果是:1.75 1.75

 6.51468e-039 3.76489e-039

根本不是想要的结果。于是我们在函数中也加上显示代码,看看是不是计算的问题,得到结果:

1.75 1.750 01.75 1.751.96875 1.75

发现计算的结果是正确的,但返回后就变了,而且跟上次的结果不一样。这是为什么呢?

因为在函数中定义的数组M在函数执行完后已经被系统释放掉了,所以在调用函数中得到的结果当然不是计算后的结果。有一个解决办法就是动态分配内存,在函数中new一个数组,这样就不会被释放掉了。

于是就应该将

7    float M[4];

改为:

7  float *M = new float[4];

修改运行后得到结果:

1.75 1.750 01.75 1.750 0

正确。但是我们这样并没有将自己申请的空间释放掉,如果我们在函数内释放的话结果就会跟开始时的一样了。

看看我们的调用代码:

20    float *M = MultMatrix(A, B);

这样其实是将M指针指向了函数中M数组的首地址,我们可以将M指针释放,效果和释放申请的M数组是一样的,因为它们指向的是同一片内存空间。于是代码就修改为:

 1 #include  2  3 using namespace std; 4  5 float* MultMatrix(float A[4], float B[4]) 6 { 7     float *M = new float[4]; 8     M[0] = A[0]*B[0] + A[1]*B[2]; 9     M[1] = A[0]*B[1] + A[1]*B[3];10     M[2] = A[2]*B[0] + A[3]*B[2];11     M[3] = A[2]*B[1] + A[3]*B[3];12     cout <0] <" " <1] <endl;13     cout <2] <" " <3] <endl;14 15     return M;16 }17 18 int main()19 {20     float A[4] = { 1.75, 0.66, 0, 1.75 };21     float B[4] = {1, 1, 0, 0};22     float *M = MultMatrix(A, B);23     cout <0] <" " <1] <endl;24     cout <2] <" " <3] <endl;25     delete[] M;26 27     return 0;28 }

运行结果:

1.75 1.750 01.75 1.750 0

没有问题,new的空间也delete掉了。

鉴于下面大牛们的建议,我将程序修改如下,大家看可否:

 1 #include  2  3 using namespace std; 4  5 void MultMatrix(float M[4], float A[4], float B[4]) 6 { 7     M[0] = A[0]*B[0] + A[1]*B[2]; 8     M[1] = A[0]*B[1] + A[1]*B[3]; 9     M[2] = A[2]*B[0] + A[3]*B[2];10     M[3] = A[2]*B[1] + A[3]*B[3];11 12     cout <0] <" " <1] <endl;13     cout <2] <" " <3] <endl;14 }15 16 int main()17 {18     float A[4] = { 1.75, 0.66, 0, 1.75 };19     float B[4] = {1, 1, 0, 0};20 21     float *M = new float[4];22     MultMatrix(M, A, B);23 24     cout <0] <" " <1] <endl;25     cout <2] <" " <3] <endl;26     delete[] M;27 28     return 0;29 }

至于数组类和智能智能我还需要继续学习,多谢大家关注!


●编号757,输入编号直达本文

●输入m获取文章目录

C语言与C++编程

分享C/C++技术文章

c++函数返回二维数组_C++ 怎样让函数返回数组相关推荐

  1. C语言 函数返回二维数组

    #include <stdio.h> #include <stdlib.h> #include <string.h>#define N 5double** Link ...

  2. 【C 语言】二级指针案例 ( 字符串切割 | 返回 二维数组 作为结果 )

    文章目录 一.二级指针案例 ( 返回二维数组 ) 二.完整代码示例 一.二级指针案例 ( 返回二维数组 ) 将 "12,ab,345," 字符串 以 逗号 "," ...

  3. matlab 二维数组声明,Matlab字符串函数及二维数组

    Matlab字符串函数及二维数组 发布时间:2017年07月28日 评论数:抢沙发 阅读数:833 strcmp(Str1,Str2),finder(S,s),strcat(S1,S2),disp(s ...

  4. 黑马程序员——c语言学习心得——函数传递二维数组

    黑马程序员--c语言学习心得--函数传递二维数组 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.定义指针的时候一定要初始化.    变量 ...

  5. boost::python模块包装几个 C++ 函数 将二维数组操作为采用 NumPy 数组的 Python 函数作为参数

    boost::python模块包装几个 C++ 函数 将二维数组操作为采用 NumPy 数组的 Python 函数作为参数 实现功能 C++实现代码 实现功能 boost::python模块包装几个 ...

  6. Java黑皮书课后题第8章:*8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置。返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标

    *8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置.返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标 题目 题目描述与运行示例 破题 代码 题目 ...

  7. c语言malloc用法 数组,详解C语言用malloc函数申请二维动态数组的实例

    详解C语言用malloc函数申请二维动态数组的实例 C语言在程序运行中动态的申请及释放内存十分方便,一维数组的申请及释放比较简单. Sample one #include int main() { c ...

  8. C/C++函数传递二维数组

    目录 函数参数传递二维数组的问题 解决方案 1.传递第二维和更高维的大小 2.根据数组的存储原理把二位数组当作一维数组来操作(降维处理) 函数参数传递二维数组的问题 将二维数组当作参数的时候,必须指明 ...

  9. c++ sort()函数对二维数组vector排序

    c++ sort()函数对二维数组vector排序 sort (first, last) 对容器或普通数组中 [first, last) 范围内的元素进行排序,默认进行升序排序. 对于一个一维的数组, ...

  10. c语言字符二维数组传参,C语言函数传递二维数组

    C语言如果给函数传递二维数组作为参数 问题的产生 先看一个传递二维数组的例子: #include void foo(int a[][], int m, int n) { int i = 1; int ...

最新文章

  1. 使用js实现时钟效果
  2. 更改tomcat的request编码方式
  3. 电视机当计算机屏幕,电视机可以当电脑显示器吗
  4. 【Elasticsearch】Elasticsearch CPU高排查思路
  5. r语言 新增一列数字类型_R语言实战之R语言基础语法精讲(一)
  6. [JZOJ100026]图--倍增
  7. java 输入语句_java怎样输入语句
  8. 修改Android手机的分辨率和屏幕密度
  9. 【电路】电容(三)——耦合、退耦电容
  10. VirtualBoX下linux中安装增强功能
  11. 使用plf更新Mandriva系统
  12. grpc 源码阅读之 balancer
  13. 为什么世界上没有安全的工作?
  14. Js中${}字符串拼接
  15. libVLC 事件机制
  16. WINCC软件与西门子PLC以太网通讯
  17. 读彬彬有礼压缩感知相关论文笔记3——沙威程序解读
  18. 矩阵分解 SVD分解
  19. 海信智慧黑板Android版本,海信推出智慧黑板来打造沉浸式智慧课堂,保护视力让学生爱上上课...
  20. 胆囊有排毒鸿蒙那,胆生病,别怕!身上有反射区,专“治”胆病,结石、炎症绕道走...

热门文章

  1. srsLTE源码学习:安全证书polarssl
  2. Hadoop基础知识
  3. php-ews发送邮件,使用php-ews在特定日期之后收到电子邮件(Exchange Web服务)
  4. Unity的Animator中Transition有延迟的问题
  5. OpenShift 4 - 多云管理(2) - 部署应用
  6. OpenShift 4 - 用容器提升MySQL的可用性
  7. PostgreSQL查询计划剖析
  8. 使用ML.Net和C#进行机器学习
  9. python全栈生鲜电商_Vue+Django REST framework 打造生鲜电商项目(学习笔记一)
  10. python3怎么使用mnist_loader_Python读取mnist