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

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])
(0)

相关推荐

  • c++将引用或者是指针作为函数参数实现实参的运算

    C++增加引用类型, 主要是把它作为函数参数,以扩充函数传递数据的功能,较指针参数来得更加安全直观.将引用作为参数传递的时候,实参初始化形参的时候不分配内存空间,也不调用拷贝构造函数,因此更加能够提高运算的性能.所以我们应该尽可能地使用引用,而非指针,但是应该要注意,因为局部变量具有自己短暂的生命周期,因此不能够返回对一个局部变量的引用. 引用通常是在被定义的时候被初始化,但是当它作为参数的时候,则是在被调用的时候被初始化.这时候对引用所做的改变就是对被引用的变量所做的改变. 引用对变量的访问是

  • C++中用指向数组的指针作函数参数

    1.一维数组名作为函数参数传递一位数组名,就相当于该数组的首个元素的地址: 复制代码 代码如下: int a[10];int *p;p=a;//p=a与p=&a[0]是等价的 实例代码: 复制代码 代码如下: #include<iostream>using namespace std;int main(){ int a[10]={1,2,3,4,5,6,7,8,9,10}; void Print(int *p ,int n); Print(a,10); cout<<endl

  • 举例剖析C++中引用的本质及引用作函数参数的使用

    引用的意义与本质 1)引用作为其它变量的别名而存在,因此在一些场合可以代替指针 2)引用相对于指针来说具有更好的可读性和实用性 引用本质思考: 思考.C++编译器背后做了什么工作? #include <iostream> using namespace std; int main() { int a = 10; // 单独定义的引用时,必须初始化:说明很像一个常量 int &b = a; // b是a的别名 b = 11; cout << "b--->&qu

  • C++编程中将引用类型作为函数参数的方法指南

    有了变量名,为什么还需要一个别名呢?C++之所以增加引用类型, 主要是把它作为函数参数,以扩充函数传递数据的功能. 到目前为止我们介绍过函数参数传递的两种情况. 1) 将变量名作为实参和形参 这时传给形参的是变量的值,传递是单向的.如果在执行函数期间形参的值发生变化,并不传回给实参.因为在调用函数时,形参和实参不是同一个存储单元. [例]要求将变量i和j的值互换.下面的程序无法实现此要求. #include <iostream> using namespace std; int main( )

  • C++函数参数取默认值的深入详解

    一般情况下,在函数调用时形参从实参那里取得值,因此实参的个数应与形参相同.有时多次调用同一函数时用同样的实参,C++提供简单的处理办法,给形参一个默认值,这样形参就不必一定要从实参取值了.如有一函数声明float area(float r=6.5);指定r的默认值为6.5,如果在调用此函数时,确认r的值为6.5,则可以不必给出实参的值,如area( );  //相当于area(6.5);如果不想使形参取此默认值,则通过实参另行给出.如area(7.5); //形参得到的值为7.5,而不是6.5这

  • C++动态分配和撤销内存以及结构体类型作为函数参数

    C++动态分配内存(new)和撤销内存(delete) 在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除.在C语言中是利用库函数malloc和free来分配和撤销内存空间的.C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数. 注意: new和delete是运算符,不是函数,因此执行效率高. 虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算

  • 剖析C++编程当中指针作为函数参数的用法

    在C语言中,函数指针变量常见的用途之一是作为函数的参数,将函数名传给其他函数的形参.这样就可以在调用一个函数的过程中根据给定的不同实参调用不同的函数. 例如,利用这种方法可以编写一个求定积分的通用函数,用它分别求5个函数的定积分: 可以看出,每次需要求定积分的函数是不一样的.可以编写一个求定积分的通用函数integral,它有3个形参: 下限a.上限b,以及指向函数的指针变量fun.函数原型可写为: double integral (double a, double b, double (*fu

  • c++将数组名作为函数参数对数组元素进行相应的运算

    用数组名做函数参数与用数组元素作实参有几点不同: (1)用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的.因此,并不要求函数的形参也是下标变量.换句话说,对数组元素的处理是按普通变量对待的.用数组名作函数参数时,则要求形参和相应的实参都必须是类型相同的数组,都必须有明确的数组说明.当形参和实参两者类型不一致时,将会发生错误. (2)用普通变量或下标变量作函数参数时,形参变量和实参变量都是由编译系统分配的两个不同的内存单元.

  • C/C++函数参数传递机制详解及实例

    C/C++函数参数传递机制详解及实例 概要: C/C++的基本参数传递机制有两种:值传递和引用传递,我们分别来看一下这两种的区别. (1)值传递过程中,需在堆栈中开辟内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形参的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值. (2)引用传递过程中,被调函数的形参虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址.被调函数对形参的任何操作都被处理成间接寻址,

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

    C++数组的概念 概括地说:数组是有序数据的集合.要寻找一个数组中的某一个元素必须给出两个要素,即数组名和下标.数组名和下标惟一地标识一个数组中的一个元素. 数组是有类型属性的.同一数组中的每一个元素都必须属于同一数据类型.一个数组在内存中占一片连续的存储单元.如果有一个整型数组a,假设数组的起始地址为2000,则该数组在内存中的存储情况如图所示. 引入数组就不需要在程序中定义大量的变量,大大减少程序中变量的数量,使程序精炼,而且数组含义清楚,使用方便,明确地反映了数据间的联系.许多好的算法都与

  • shell 使用数组作为函数参数的方法(详解)

    因工作需要,需要使用shell开发一些小工具,当使用数组作为函数参数时,发现只能传递数组的第一个元素,数组后面的元素不能传递到函数内. #!/bin/bash function showArr(){ arr=$1 for i in ${arr[*]}; do echo $i done } regions=("GZ" "SH" "BJ") showArr $regions exit 0 把代码保存为test.sh后执行,只输出了第一个元素. ./t

  • 详解C#编程获取资源文件中图片的方法

    详解C#编程获取资源文件中图片的方法 本文主要介绍C#编程获取资源文件中图片的方法,涉及C#针对项目中资源文件操作的相关技巧,以供借鉴参考.具体内容如下: 例子: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; using System.Drawing; namespace CL { public class RES { /

  • C语言之把数组名作函数参数的四种情况说明

    目录 把数组名作函数参数的四种情况 思路 实参与形参的对应关系有以下四种情况 我们来看代码 一般函数作参数和数组名作参数区别 一般函数作参数 数组名作函数参数 把数组名作函数参数的四种情况 如果想要通过函数调用得到n个要改变的值 思路 ①在主函数中设n个变量,用n个指针变量指向它们 ②设计一个函数,有n个指针形参,在这个函数中改变这n个形参所指向的值 ③在主函数中调用这个函数,在调用时将n个指针变量做为实参,将它们的地址传给该函数的形参 ④在执行该函数的过程中,通过形参指针变量,改变它们所指向的

  • 详解python编程slice与indices函数用法示例

    一般来说,内置的slice()函数会创建一个切片对象,可以用在任何允许进行切片操作的地方. 下面是slice的简介: # slice 两种用法 class slice(stop) class slice(start, stop[, step]) 返回一个表示由 range(start, stop, step) 所指定索引集的 slice对象. 其中 start 和 step 参数默认为 None. 切片对象具有仅会返回对应参数值(或其默认值)的只读数据属性 start, stop 和 step.

  • 详解C++编程中的虚函数

    我们知道,在同一类中是不能定义两个名字相同.参数个数和类型都相同的函数的,否则就是"重复定义".但是在类的继承层次结构中,在不同的层次中可以出现名字相同.参数个数和类型都相同而功能不同的函数. 人们提出这样的设想,能否用同一个调用形式,既能调用派生类又能调用基类的同名函数.在程序中不是通过不同的对象名去调用不同派生层次中的同名函数,而是通过指针调用它们.例如,用同一个语句"pt->display( );"可以调用不同派生层次中的display函数,只需在调用前

  • 详解C++编程中数组的基本用法

    可以使用数组下标操作符 ([ ]) 访问数组的各个元素. 如果在无下标表达式中使用一维数组,组名计算为指向该数组中的第一个元素的指针. // using_arrays.cpp int main() { char chArray[10]; char *pch = chArray; // Evaluates to a pointer to the first element. char ch = chArray[0]; // Evaluates to the value of the first e

  • 详解Django框架中用context来解析模板的方法

    你需要一段context来解析模板. 一般情况下,这是一个 django.template.Context 的实例,不过在Django中还可以用一个特殊的子类, django.template.RequestContext ,这个用起来稍微有些不同. RequestContext 默认地在模板context中加入了一些变量,如 HttpRequest 对象或当前登录用户的相关信息. 当你不想在一系例模板中都明确指定一些相同的变量时,你应该使用 RequestContext . 例如,考虑这两个视

  • 详解Swift编程中的for循环的编写方法

    for 循环是一个循环控制结构,可以有效地编写来执行的特定次数的循环. 语法 for 循环在 Swift 编程语言的语法是: 复制代码 代码如下: for init; condition; increment{    statement(s) } 下面是在一个循环的流程控制: 初始化 init 步骤首先被执行,并且仅一次.在这一步,可以声明和初始化任何循环控制变量. 只要一个分号出现,不需要一定把一个语句放在这里. 接下来,计算条件.如果为真,则执行循环体.如果是假,循环体不执行,只是在 for

随机推荐