详解C++编程中用数组名作函数参数的方法

 更新时间:2020年4月25日 17:37  点击:1820

C++数组的概念
概括地说:数组是有序数据的集合。要寻找一个数组中的某一个元素必须给出两个要素,即数组名和下标。数组名和下标惟一地标识一个数组中的一个元素。

数组是有类型属性的。同一数组中的每一个元素都必须属于同一数据类型。一个数组在内存中占一片连续的存储单元。如果有一个整型数组a,假设数组的起始地址为2000,则该数组在内存中的存储情况如图所示。


引入数组就不需要在程序中定义大量的变量,大大减少程序中变量的数量,使程序精炼,而且数组含义清楚,使用方便,明确地反映了数据间的联系。许多好的算法都与数组有关。熟练地利用数组,可以大大地提高编程和解题的效率,加强了程序的可读性。

C++用方括号来表示下标,如用s[1],s[2],s[3] 分别代表s1,s2,s3。

C++用数组名作函数参数
常量和变量可以用作函数实参,同样数组元素也可以作函数实参,其用法与变量相同。数组名也可以作实参和形参,传递的是数组的起始地址。
用数组元素作函数实参

由于实参可以是表达式,而数组元素可以是表达式的组成部分,因此数组元素当然可以作为函数的实参,与用变量作实参一样,将数组元素的值传送给形参变量。

【例】用函数处理。

今设一函数max_value,用来进行比较并返回结果。可编写程序如下:

#include <iostream>
using namespace std;
int main( )
{
  int max_value(int x,int max); //函数声明
  int i,j,row=0,colum=0,max
  int a[3][4]={{5,12,23,56},{19,28,37,46},{-12,-34,6,8}}; //数组初始化
  max=a[0][0];
  for (i=0;i<=2;i++)
   for (j=0;j<=3;j++)
   {
     max=max_value(a[i][j],max); //调用max_value函数
     if(max==a[i][j])//如果函数返回的是a[i][j]的值
     {
      row=i; //记下该元素行号i
      colum=j; //记下该元素列号j
     }
   }
  cout<<"max="<<max<<",row="<<row<<",colum="<<colum<<endl;
}
int max_value(int x,int max)//定义max_value函数
{
  if(x>max) return x;//如果x>max,函数返回值为x
  else return max;//如果x≤max,函数返回值为max
}

用数组名作函数参数

可以用数组名作函数参数,此时实参与形参都用数组名(也可以用指针变量,见第6章)。

【例】用选择法对数组中10个整数按由小到大排序。

所谓选择法就是先将10个数中最小的数与a[0]对换,再将a[1]到a[9]中最小的数与a[1]对换……每比较一轮,找出一个未经排序的数中最小的一个。共比较9轮。根据此思路编写程序如下:

#include <iostream>
using namespace std;
int main( )
{
  void select_sort(int array[],int n); //函数声明
  int a[10],i;
  cout<<"enter the originl array:"<<endl;
  for(i=0;i<10;i++) //输入10个数
   cin>>a[i];
  cout<<endl;
  select_sort(a,10);//函数调用,数组名作实参
  cout<<"the sorted array:"<<endl;
  for(i=0;i<10;i++) //输出10个已排好序的数
   cout<<a[i]<<" ";
  cout<<endl;
  return 0;
}
void select_sort(int array[],int n) //形参array是数组名
{
  int i,j,k,t;
  for(i=0;i<n-1;i++)
  {
   k=i;
   for(j=i+1;j<n;j++)
     if(array[j]<array[k]) k=j;
   t=array[k];array[k]=array[i];array[i]=t;
  }
}

运行情况如下:

enter the originl array:
6 9 -2 56 87 11 -54 3 0 77↙ //输入10个数
the sorted array:
-54 -2 0 3 6 9 11 56 77 87

关于用数组名作函数参数有两点要说明:
1) 如果函数实参是数组名,形参也应为数组名(或指针变量),形参不能声明为普通变量(如int array;)。实参数组与形参数组类型应一致(现都为int型),如不一致,结果将出错。

2) 需要特别说明的是: 数组名代表数组首元素的地址,并不代表数组中的全部元素。因此用数组名作函数实参时,不是把实参数组的值传递给形参,而只是将实参数组首元素的地址传递给形参。

形参可以是数组名,也可以是指针变量,它们用来接收实参传来的地址。如果形参是数组名,它代表的是形参数组首元素的地址。在调用函数时,将实参数组首元素的地址传递给形参数组名。这样,实参数组和形参数组就共占同一段内存单元。见图。


在用变量作函数参数时,只能将实参变量的值传给形参变量,在调用函数过程中如果改变了形参的值,对实参没有影响,即实参的值不因形参的值改变而改变。而用数组名作函数实参时,改变形参数组元素的值将同时改变实参数组元素的值。在程序设计中往往有意识地利用这一特点改变实参数组元素的值。

实际上,声明形参数组并不意味着真正建立一个包含若干元素的数组,在调用函数时也不对它分配存储单元,只是用array[]这样的形式表示array是一维数组名,以接收实参传来的地址。因此array[]中方括号内的数值并无实际作用,编译系统对一维数组方括号内的内容不予处理。形参一维数组的声明中可以写元素个数,也可以不写。

函数首部的下面几种写法都合法,作用相同:

  void select_sort(int array[10],int n) //指定元素个数与实参数组相同
  void select_sort(int array[],int n) //不指定元素个数
  void select_sort(int array[5],int n) //指定元素个数与实参数组不同

C++实际上只把形参数组名作为一个指针变量来处理,用来接收从实参传过来的地址。前面提到的一些现象都是由此而产生的。
用多维数组名作函数参数

如果用二维数组名作为实参和形参,在对形参数组声明时,必须指定第二维(即列)的大小,且应与实参的第二维的大小相同。第一维的大小可以指定,也可以不指定。如:

  int array[3][10]; //形参数组的两个维都指定


或 

  int array[][10]; //第一维大小省略


二者都合法而且等价。但是不能把第二维的大小省略。下面的形参数组写法不合法:

  int array[][]; //不能确定数组的每一行有多少列元素
  int array[3][]; //不指定列数就无法确定数组的结构


在第二维大小相同的前提下,形参数组的第一维可以与实参数组不同。例如,实参数组定义为:
    int score[5][10];
而形参数组可以声明为:

  int array[3][10]; //列数与实参数组相同,行数不同
  int array[8][10];


这时形参二维数组与实参二维数组都是由相同类型和大小的一维数组组成的,实参数组名score代表其首元素(即第一行)的起始地址,系统不检查第一维的大小。

如果是三维或更多维的数组,处理方法是类似的。

【例】有一个3×4的矩阵,求矩阵中所有元素中的最大值。要求用函数处理。

解此题的程序如下:

#include <iostream>
using namespace std;
int main( )
{
  int max_value(int array[][4]);
  int a[3][4]={{11,32,45,67},{22,44,66,88},{15,72,43,37}};
  cout<<"max value is "<<max_value(a)<<endl;
  return 0;
}
int max_value(int array[][4])
{
  int i,j,max;
  max=array[0][0];
  for( i=0;i<3;i++)
   for(j=0;j<4;j++)
     if(array[i][j]>max) max=array[i][j];
  return max;
}

运行结果如下:

max value is 88

读者可以将max_value函数的首部改为以下几种情况,观察编译情况:

int max_value(int array[][])
int max_value(int array[3][])
int max_value(int array[3][4])
int max_value(int array[10][10])
int max_value(int array[12])

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • C++ STL标准库std::vector的使用详解

    vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • C++中取余运算的实现

    这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C++中四种加密算法之AES源代码

    本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
  • php数组操作 键名比较 差集 交集赋值

    本文章提供在量的数据中级操作实例有如对键名比较计算数组的差集 计算差集 给指定数组中插入一个元素 反转数组 交集赋值新的数组实例。 //定义回调函数 funct...2016-11-25
  • C#二维数组基本用法实例

    这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C#数组的常用操作方法小结

    Array数组在C#中同样是最基本的数据结构,下面为大家C#数组的常用操作方法小结,皆为细小的代码段,欢迎收看收藏...2020-06-25
  • php curl模拟post请求和提交多维数组的示例代码

    下面一段代码给大家介绍php curl模拟post请求的示例代码,具体代码如下: <&#63;php$uri = "http://www.cnblogs.com/test.php";//这里换成自己的服务器的地址// 参数数组$data = array ( 'name' => 'tanteng'// 'passwor...2015-11-24
  • C++ 整数拆分方法详解

    整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18