`

数组作函数的参数 和 返回值return

阅读更多
    同其它变量一样,数组也可以作函数的参数。数组元素只能作函数实参,且同其它变量的用法没有区别。

   我们已经知道,数组元素要通过数组名和相应的下标一个个地引用,而数组名可以作函数的实参和形参。当数组作为函数参数时,调用函数中的实参数组只是传送该数组在内存中的首地址,即调用函数通知被调函数在内存中的什么地方找到该数组。在前面我们已经知道了函数参数的值传递方式,调用函数向被调函数传递数据地址的方式,称之为函数参数的引用传递。

   对于函数参数的引用传递,除传送数组名外,调用函数还必须通知被调函数:数组有多少个元素。所以,有数组参数的函数原型的一般形式为:
   类型说明符 函数名(数组参数, 数组元素个数)

数组参数并不指定数组元素的个数,即[]中是空的,没有数字。例如6-21:

   我们已经知道:函数参数的引用传递不同于值传递。值传递时是把实参的值复制到形参,实参和形参占用不同的存储单元,形参值的改变不会影响到实参。而数组作为函数参数传递时,是引用传递方式,即把实参数组在内存中的首地址传给了形参,被调函数可以通过该地址,找到实参数组中的各个元素。这就意味着:在被调函数中,如果改变了形参数组某元素的值,在被调函数中,实参数组对应元素的值也会发生相应的改变。

 
例6-21 
  #include <iostream.h> 
int add(int x, int n) 
{ 
  return (x + n); 
} 
void main() 
{ 
  int a[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; 
  int i; 
  for( i = 0; i<10; i++) 
   a[i]=add(a[i], i); //数组元素作函数参数 
  for(i = 0; i<10; i++) 
   cout << a[i] << endl; 
}  



例6-22 
 double mean(double data_array[], int numelements) 
{ 
  double sum = 0.0; 
  for(int i=0; i<numelements; i++) 
   sum += data_array[i]; 
  return sum / numelements; 
} 


   下面我们看看应该怎样调用上面的mean函数:    
例6-23 
  int main() 
{ 
  double heights[100]; 
  double h; 
  int n = 0; 
  cout << "Enter heights:" << endl; 
  cin >> h; 
  while(h > 0.0) { 
   heights[n] = h; 
   n++; 
   cin >> h; 
  } 
  double m = mean(heights, n); 
  cout << "The mean is " << m << endl; 
  return 0; 
}
 

  
传值调用与传址调用的区别在于,使用传值调用时,函数接收的是函数值的一份拷贝;另一方面,使用传址调用时,函数接收的是变量的内存地址。因此,函数能改变存放于指定内存单元(也就是变量值)的值,所作的改变在函数结束后继续保留下来。

  
函数参数的引用传递是有用的。例如当数组作函数参数时,仅仅传送数组在内存中的首地址,避免了复制每一个数组元素,可以节省机器的内存和运行时间。另外, 由于函数中return语句只能带回一个返回值,如果被调函数中有多个返回值,我们常常通过数组带回。但对引用传递应该 注意: 被调函数中对形参数椐的不恰当的改变,会破坏调用函数中的实参数据。

用数组作参数,本身就可以改变数组元素的值,不需要再返回数组,况且也不能返回数组,只能是指针。如果array是return在函数中,这在函数执行完后会回收array占用的地址。如果这时return指针的话,只是一个空地址。可以使用static是array成为static local variable,或者new(c++才有new和delete,c中用malloc,释放用free),这样函数完成时不会释放它占用的内存空间。

#include <iostream>
using namespace std;
int* foo()
{
int *arr = new int[10]; //or static int arr[10];
for (int i=0; i<10; i++)
arr[i] = i;
return arr;
}

int main(){
int *arr=0;
arr = foo();
for (int i=0; i<10; i++)
cout << arr[i];
delete [] arr;
}


或者通过struct, 返回struct中的array。
struct mystruct {
    int vector[20];
}

struct mystruct foo()
{
    struct mystruct bar;

    ...do something nifty with bar...

    return bar;
}
 

P.S.
The C language does not let you return an array unless you either

(a) just return a pointer to the type of whatever the array is, and you have to allocate that array, eg you return an "int *".

(b) use a typedef to define the array, and then return that..

typedef int array_int3[4];

array_int3 func(...)
{
array_int3 ret={1,2,3,4};

     return ret;
}




数组作为函数参数举例:

1. 顺序查找
   查找是计算机中经常要遇到的一种操作,其含义是在一组数据中查找到待查数据的位置。当一组数据无序时,一般采用顺序查找。顺序查找是把给定的值与这组数据中的每个值顺序比较,如果找到,就输出这个值的位置,如果找不到则报告没有找到。下面是顺序查找的程序:


例6-24 
  #include <stdio.h> 
#define SIZE 10 
//求给定值key的位置,找到则返回其下标,找不到返回-1 
int seq_search(int v[],int n,int key) //v[]:数组参数 n:数组元素个数 key:待查的值 
{ 
  int i; 
  for(i = 0;i < n;i ++) 
   if(key == v[i]) 
    return i; 
  return -1; //没找到 
} 
void main(void) 
{ 
  int d[SIZE],KEY,i,index; 
  printf("Input %d numbers:\n",SIZE); 
  for(i = 0;i < SIZE;i ++) 
   scanf("%d",&d[i]); 
  printf("Input a key you want to search:\n"); 
  scanf("%d",&KEY); 
  index = seq_search(d,SIZE,KEY); 
  if(index >= 0) 
   printf("The index of the key is %d.\n",index); 
  else 
   printf("Not found.\n"); 
} 


运行该程序并输入:
   Input 10 numbers:
   1 2 3 4 5 6 7 8 9 0↙
   Input a key you want to search:
   6↙
输出结果为:
   The index of the key is 5
   本程序中使用了一个数组作为参数,函数seq_search中形参v没有指定数组的长度,要处理的元素的个数由其后所跟的参数n决定。


2. 把一个字符串反序后输出 
例6-25 
  #include <iostream.h> 
#include <string.h> 
#define LENGTH 80 

//反序一个字符串 
void reverse(char s[]) 
{ 
  char c; 
  int i,j; 
  j = strlen(s) - 1; 
  for(i = 0;i < j;i ++) 
  { 
   c = s[i]; 
   s[i] = s[j]; 
   s[j] = c; 
   j --; 
  } 
} 

void main(void) 
{ 
  char str[LENGTH + 1]; 
  cout<<"Input a string:"; 
  cin>>str; 
  reverse(str); 
  cout<<"The string is reversed:"<<str<<endl; 
}



运行该程序并输入:
   Input a string:abcd↙
  运行结果为:
   The string is reversed:dbca
   这个程序中,函数reverse没有指定数组元素个数的参数,这是因为字符串总是以一个'{content}'结束,通过'{content}'就可以得到字符数组中元素的个数,也就是字符串的长度,这里我们可以看到使用字符串结束标识的好处。


二维数组也可作为函数参数,第一维的大小可以省略,而第二维的大小不能省略。下面是一个二维数组作为函数参数的例子:


例6-26 
  #include <stdio.h> 
void main() 
{ 
  void add(int x[][4], int n, int num); 
  void print(int x[][4], int n); 
  int a[3][4]={{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}; 
  int number=10; 
  add(a, 3, number); 
  print(a, 3); 
} 
void add(int x[][4], int n, int num) 
{ 
  for(int i = 0; i<n; i++) 
  for(int j = 0; j<4; j++) 
  x[i][j] = x[i][j]+num; 
} 
void print(int x[][4], int n) 
{ 
  for(int i = 0; i<n; i++) 
  for(int j = 0; j<4; j++) 
  printf("%4d\n", x[i][j]); 
} 

分享到:
评论

相关推荐

    C语言中数组作为函数的参数以及返回值的使用简单入门

    在C语言中,数组是一种非常重要的数据结构,用于存储同类型的数据集合。...总结起来,C语言中数组在函数中的使用主要包括作为参数传递和通过返回指针来间接返回数组。理解这些概念对于编写高效的C语言程序至关重要。

    关于WinCC自定义返回数组函数书写规则正确写法.rar

    本教程将详细阐述如何在C++中创建一个模糊控制DLL,并在WinCC中正确调用该DLL,特别是涉及自定义返回数组函数的书写规则。 首先,我们需要了解DLL的基本概念。DLL是一种共享库,它可以包含执行代码和资源,多个程序...

    函数参数与返回值PPT课件.pptx

    保持接口清晰• 使用函数指针和高阶函数实现模块化和可扩展性• 注意函数返回值的处理,特别是在异步编程中确保正确处理返回结果第 22 页 / 共 33 页学习建议• 理解并掌握各种参数类型和传递方式的原理及区别•...

    c++return返回二维数组

    在c++中,经常调用函数,而子函数经常要返回的值是数组,无论一维数组还是二维数组都需要运用到指针的知识。一维数组不再过多叙述,给了一个实例如何返回二维数组,希望对大家有帮助(主要用到指针的知识,看不懂的...

    c++经典程序(数组与函数)

    4. **函数指针与数组**:C++允许我们使用函数指针,这样可以将函数作为参数传递,或者将数组作为函数的返回值。结合数组和函数指针,可以实现动态策略或回调机制。 5. **递归函数与数组**:在某些情况下,可以使用...

    c代码-C:数组做为形参和返回值

    然而,C语言中处理数组的方式与许多其他高级语言不同,特别是在作为函数参数和返回值时。本篇文章将深入探讨如何在C语言中使用数组作为函数参数以及返回值。 一、数组作为形参 在C语言中,当你尝试将数组作为函数...

    C语言精华(指针、数组、函数)

    pointer to function of parameter is void and return value is int (指向一个函数的指针,这个函数参数为空,返回值为整数) 2. 指针所指物的类型是什么? 很简单,指针本身的类型去掉 “*” 号就可以了,分别...

    C语言题库-函数.pdf

    9. 函数返回值:函数可以返回一个值,也可以什么值也不返回。如果函数中没有return语句,将返回一个不确定的值。 10. 静态变量的初值:静态变量的初值可以是随机值,也可以是零。静态变量的初值在程序的生命周期内...

    在C中如何使函数返回数组

    第二种方法是使用结构体来包装数组,然后将整个结构体作为函数的返回值。这种方法相比于直接返回数组指针更为安全,因为结构体可以包含更多的数据成员,且不需要担心内存释放的问题。 下面是具体示例: ```c #...

    Swift视频教程:函数篇 形式参数与返回值③多返回值

    1. 函数定义:Swift中的函数定义使用`func`关键字,后面跟着函数名、参数列表(如果有)和返回类型(如果函数有返回值)。例如,一个简单的函数定义可能如下所示: ```swift func addNumbers(number1: Int, number...

    函数、内存、一维数组、二维数组

    •修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,...) { 执行语句; return 返回值; } 返回值类型:函数运行后的结果的数据类型。 参数类型:是形式参数的数据类型。 形式参数...

    第7章-函数 -31

    `return_type` 是函数返回值的类型,`function_name` 是函数的名字,`parameters` 是传递给函数的变量列表。 **7.3 调用函数** 调用函数是在代码中使用函数的地方,通过函数名和括号内的参数列表来完成。例如: ```...

    C语言中函数参数传递方式与返回值的探讨.pdf

    总结起来,在C语言中,参数传递方式和函数返回值是紧密相关的。参数值传递方式简单、安全,适用于不需要修改实参值的场景,但无法实现函数内部对实参的修改;而参数地址传递方式则可以实现实参值的修改,使得函数...

    11.4 函数、数组和指针.7z

    指针还可以用于函数返回值,返回多个值或者复杂数据结构。 在压缩包内的源码文件(114.1.c、114.2.c、114.3.c)中,我们可以预期看到这些概念的实际应用。例如,114.1.c可能是关于函数的示例,114.2.c可能涉及数组...

    易语言源码向DLL传递数组参数的实现方法.rar

    通常,DLL函数接收`LPVOID`类型的参数,然后根据数组长度和类型进行解包处理。 通过以上步骤,你可以在易语言源码中成功向DLL传递数组参数。实践中可能遇到更多细节问题,如数据类型转换、DLL加载路径等问题,都...

    函数参数的传递和值返回

    - 此例中,`a`函数接受一个整型参数和一个浮点型参数。 - 实际参数`num1`和`num2`分别对应形式参数`num1_back`和`num2_back`。 **标识符的作用域** - 在不同函数中使用相同名称的变量不会导致冲突,因为它们的...

    C语言是通过函数来实现模块化程序设计的所以较大的C语PPT.ppt

    数组作为函数参数需要注意数组的维度和元素类型。 内部函数与外部函数 内部函数是指在函数内部定义的函数。外部函数是指在函数外部定义的函数。内部函数和外部函数可以同时存在,但它们的作用域不同。 变量的动态...

Global site tag (gtag.js) - Google Analytics