c/c++ 一维数组、二维数组作为函数参数、返回值

一、一维数组作为参数

传入数组 int []

为了规范,常常需要将数组的size一同传入,这是因为C++/C遇到参数为数组时,不会去一个个拷贝数组内的元素(太过于耗时),此时数组在函数内退化为数组首地址。 使用sizeof(array)/sizeof(array[0])得到1,可以验证我们前面的说法。
一般情况下,函数内经常需要使用数组的size,此时就需要我们将size传入函数。

int sum(int array[], int size)

#include <stdio.h>
int sum(int array[],int size)
{int summ=0,i;for(i=0;i<size;i++){summ+=array[i];}return summ;
}
int main()
{int arr[3]={1,2,3};int ArrSum;ArrSum=sum(arr,3);//注意这边传入参数是还是写arr,而不能写arr[]或arr[3]printf("%d",ArrSum);return 0;
}
传入数组首地址 int *

int sum(int * array, int size)
与上面一种其实本质上并没什么不同。
不管哪一种,只要函数内部对传入的数组进行了修改,该数组本身的值也会改变,因为传入的都是地址,可以直接对地址上存储的元素进行修改。

#include <stdio.h>
int sum(int *array,int size)
{int summ=0,i;for(i=0;i<size;i++){summ+=*(array+i);}return summ;
}
int main()
{int arr[3]={1,2,3};int ArrSum;ArrSum=sum(arr,3);//这边传递的参数还是arr,和函数参数是数组一样printf("%d",ArrSum);//但是这里的arr表示的是指针return 0;
}
还有一种不推荐使用的传参方法

int sum(int array[20])
or
const int size = 20;
int sum(int array[size])
从效果来讲,与前面两种并无本质区别,但是容易出错,(const),而且函数内也get不到size

一维数组作为参数总结

三个等价的一维数组传参方式

int sum(int *)
int sum(int [])
int sum(int [10])
为了避免数组越界,传入size的方法:

  1. 将size作为参数传入
  2. 使用数组的引用避免数组降价
    当参数是一个数组类型的引用时,数组长度成为参数与实参类型一部分,编译器会检查实参数组长度与形参是否匹配

int sum(int (& array )[10])

二、二维数组作为参数

与一维数组一样,比较常用有两种传入方式,但是区别在于必须写出列数。因为数组在调用时同样有数组降价的问题,实际函数得到的是一个指针,指向行向量构成的一维数组,这样每个一维数组的size必须提前定义好,便于分配栈空间。

  1. int sum(int array[][4], int size)
  2. int sum(int (*array)[4], int size)

这两种方法中size表示的都是行数,然后还有几种比较不常用的方法

#include <stdio.h>
int sum(int array[][3],int size)
{int summ=0,i,j;for(i=0;i<2;i++){for(j=0;j<3;j++){summ+=array[i][j];}}return summ;
}
int main()
{int arr[2][3]={1,2,3,4,5,6};int ArrSum;ArrSum=sum(arr,6);//注意只要参数是数组的,调用的时候就写数组名就可以了,不管是一维数组还是二维数组printf("%d",ArrSum);printf("\n%d",arr);printf("\n%d",arr[0]);return 0;
}
#include <stdio.h>
int sum(int *array,int size)//这边的参数是一个指向整型的指针
{int summ=0,i;for(i=0;i<size;i++){summ+=*(array+i);//因此这边只需要一次间接寻址即可}return summ;
}
int main()
{int arr[2][3]={1,2,3,4,5,6};int ArrSum;ArrSum=sum(arr[0],6);//注意这里传入的参数是arr[0]而不是arr,arr表示的是数组第一行(即arr[0])的地址,而arr[0]表示的是arr[0]]0]的地址,但是有一个奇怪的地方是arr和arr[0]的地址是一样的。printf("%d",ArrSum);printf("\n%d",arr);printf("\n%d",arr[0]);return 0;
}
#include <stdio.h>
int sum(int (*array)[3],int size)//这边的参数是一个数组指针,该指针指向的是一个数组(包含了三个int型的数组)
{int summ=0,i,j;for(i=0;i<2;i++){for(j=0;j<3;j++){summ+=*(*(array+i)+j);//深刻理解这个表达式的含义。}}return summ;
}
int main()
{int arr[2][3]={1,2,3,4,5,6};int ArrSum;ArrSum=sum(arr,6);//printf("%d",ArrSum);return 0;
}

三、函数返回数组

返回输入数组的指针
这里有个容易造成错误的点,函数返回的是数组指针(指向数组的指针),但是如果返回之后指针指向的数组被销毁了呢?
提到这里,再复习一下内存空间的四个区域,栈空间、堆区间、数据区(静态区)、代码区。静态变量、全局变量是放在数据区的,作用范围是全局的,而局部变量通常位于栈空间,随着被调用函数的退出自动释放空间被销毁。

一维数组,返回数组指针
 #include <iostream>#include <cstdlib>#include <ctime>using namespace std;// 要生成和返回随机数的函数int * getRandom( ){static int  r[10];// 设置种子srand( (unsigned)time( NULL ) );for (int i = 0; i < 10; ++i){r[i] = rand();cout << r[i] << endl;}return r;}// 要调用上面定义函数的主函数int main (){// 一个指向整数的指针,不是指向数组的指针,只是指向数组第一个元素对的指针。int *p;p = getRandom();for ( int i = 0; i < 10; i++ ){cout << "*(p + " << i << ") : ";cout << *(p + i) << endl;}return 0;}
 #include "stdio.h"#include "stdlib.h"int * Max(int *arr,int n){int *a=(int *)malloc(2*sizeof(int));int maxNum=0,maxIndex,i;for (i=0;i<n;i++)if (arr[i]>maxNum){maxNum=arr[i];maxIndex=i+1;}a[0]=maxNum;a[1]=maxIndex;return a;}void main(){int a[2]={5,2};//a[0]=5,a[1]=2; int *b=Max(a,2);int i;for(i=0;i<2;i++)printf("b[%d]=%d\n",i,b[i]);free(b);}
二维数组指针
#include "stdio.h"
#include "stdlib.h"
int  **Max(int **arr,int n,int m)
{int **data,i,j;data=(int **)malloc(n*sizeof(int *));//强制类型转换,将其转成二维指针。for ( i=0;i<n;i++)data[i]=(int *)malloc(2*sizeof(int));for ( i=0;i<n;++i){int maxNum=0;for (j=0;j<m;++j){//printf("arr[%d][%d]=%d ",i,j,*((int *)arr+m*i+j));if (*((int *)arr+m*i+j)>maxNum){maxNum=*((int *)arr+m*i+j);data[i][0]=maxNum;data[i][1]=j;}}//printf("\n");}return data;
}void main()
{int a[2][3]={5,2,4,6,3,9};int **b=Max((int **)a,2,3);//同上,强制类型转换,这里为什么要进行类型转换呢,二维数组名是二维指针吗?看起来是,那编译不通过说明二维数组名不是二维指针。int i;for (i=0;i<2;i++){printf("the maximum num for row %d is %d\n",i+1,b[i][0]);printf("the maximum num for row %d is in %d",i+1,b[i][1]+1);printf("\n");}for(i=0;i<2;i++)free(b[i]);free(b);
}

c/c++ 一维数组、二维数组作为函数参数、返回值相关推荐

  1. C# 指定格式的字符串截成一维数组(二维数组)的操作类

    指定格式的字符串截成一维数组(二维数组)的操作类 做项目时经常会遇到将"1,3,a,b,d"截成一维数组或将"1,a;2,b;3,c;4,d"截成二维数组.虽然 ...

  2. c 语言 二维数组地址,C/C++ 关于一维或二维数组首地址表示含义

    C/C++ 关于一维或二维数组首地址表示含义 发布时间:2020-06-26 10:35:21 来源:51CTO 阅读:210 作者:sonissa 这是一个经常会忘却的知识点,最近也一直在吃这方面的 ...

  3. c/c++教程 - 1.7 数组 一维数组 二维数组

    九.数组 数组:一个里面存放了相同类型数据元素的集合. 特点:每个数组中的元素都是相同的数据类型:数组是由连续的内存位置组成的. 注意:数组的下标是从0开始索引. 参考视频:https://www.b ...

  4. day06数组-一维数组二维数组

    数组:          数组到底是什么呢?有什么特点呢?通过上面的分析:我们可以得到如下两句话:                 1.数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. ...

  5. 数组(一维数组、多维数组/二维数组)和简单排序算法

    提示:数组是线性数据结构中最为基础,最为典型的一种顺序型结构. 它用一组连续的内存空间 ,来存储一组具有相同类型的数据. 与变量相比,变量是一种单一的数据存储方式,而数组是用于存储一连串的一组数据. ...

  6. 【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )

    文章目录 一.指针数组 和 二维数组 数据 拷贝到 自定义二级指针 中 1.函数形参 设计规则 2.三种内存模型 对应 函数形参 指针退化规则 二.完整代码示例 一.指针数组 和 二维数组 数据 拷贝 ...

  7. php 二位数组随机,PHP多维数组 php打乱数组二维数组多维数组的简单实例

    php中的shuffle函数只能打乱一维数组,有什么办法快速便捷的打乱多维数组?手册上提供了 上面这个是针对二维数组的! 下面针对多维数组的乱序方法?尽可能的方便快速: 以下函数也是出自php手册,可 ...

  8. php 数组重新打乱_php打乱数组二维数组多维数组的简单实例

    php中的shuffle函数只能打乱一维数组,有什么办法快速便捷的打乱多维数组?手册上提供了 function shuffle_assoc($list) { if (!is_array($list)) ...

  9. C语言数组——二维数组

    C语言目录 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C语言基础-第一个C程序 C语言基础-简单程序分析 VS ...

  10. Numpy 一维、二维数组、size/dtype/shape属性、数组函数arange/linspace/logspace /diag/zeros/ones/random 、多维数组索引和筛选)

    参考: https://gitbook.cn/gitchat/column/undefined/topic/5e3bceadec8d9033cf924665 打开 IPython ,创建 Python ...

最新文章

  1. 搭建hadoop2.6.0 HA及YARN HA
  2. Remove Trovi Search from Apple Mac OS X
  3. 使用tomcat自带的连接池,报错
  4. Keras之Mask R-CNN:《极限挑战》第四季第2期助力高考—使用Mask R-CNN代替Photoshop抠图、颜色填充框出目标检测/图像分割/语义分割
  5. 我的世界无人维护的服务器,我的世界:如何进入9年无人管理的2B2T?全球最大战争服务器!...
  6. linux怎么检测文件完整性,Linux如何基于AIDE检测文件系统完整性
  7. 4月数据库流行度排行:深陷裁员风波的Oracle持续增长股价获新高
  8. 精心挑选的15款优秀 jQuery 文本特效插件和教程
  9. SLAM_ORB-SLAM3回环检测是怎么做的?
  10. 如何更方便地将谷歌翻译导入到Goldendict
  11. 暴风转码转超清文件_暴风影音16破解版下载-暴风影音16多开精简版(附怎么用) v9.4.1029.1111...
  12. Oracle 存储过程简单实例
  13. 【企业信息化】信息化与企业信息化管理的相关概念及关系
  14. 新计算机安装系统后鼠标键盘都无反应处理
  15. DOS命令和linux
  16. Android5.1打开Emmagee显示错误
  17. 华为FusionCompute之计算虚拟化
  18. php redis incr过期时间,Redis 利用 incr 和 expire 来限流, 并发导致过期时间失效问题...
  19. Cadence Orcad Capture新建原理图Symbol及新建和添加元件库到工程的方法图文教程及视频演示
  20. 怎么样可以申请免费的云主机?

热门文章

  1. Python MySQL 回滚 操作
  2. html5开发全景直播,H5 直播的疯狂点赞动画是如何实现的?
  3. php测试exec_检查PHP的exec函数是否执行成功
  4. python获取状态码_Python 如何获取接口返回的http状态码
  5. SPS PPS SEI
  6. phpmailer 私密抄送_phpmailer发送邮件(附件)
  7. php 继承类构造函数,PHP类构造函数继承性问题
  8. RocketMQ为什么要保证订阅关系的一致性?
  9. 全国“211工程”高校名单
  10. PHP入门-变量声明与使用