经验技巧7-2 数组名作为函数形参

合集下载

数组作为函数参数使用方法总结

数组作为函数参数使用方法总结

数组作为函数参数使用方法总结数组是一种常见的数据结构,在编程中经常使用。

在函数中,我们可以传递数组作为参数,以便函数可以对数组进行操作或者获取数组的信息。

在本文中,我将总结数组作为函数参数的使用方法。

一、传递数组的方式1.传递数组的引用:当我们将数组作为函数的参数传递时,函数可以直接对该数组进行操作。

因为函数中使用的是数组的引用,所以对数组的修改会直接反映到原数组上。

2.传递数组的指针:除了传递数组的引用外,我们还可以传递数组的指针。

通过传递指针,我们可以在函数中访问数组的元素,然后对其进行操作或返回一些元素的值。

由于传递的是指针,函数中对数组的修改也会反映到原数组上。

3.传递数组的副本:有时候我们不希望函数修改原数组,而是希望对原数组的副本进行操作。

这时可以将数组的副本作为参数传递给函数。

函数中对副本的修改不会影响原数组。

二、传递多维数组除了一维数组,我们还可以传递多维数组作为函数参数。

多维数组可以是二维、三维等。

传递多维数组的方式和传递一维数组类似,可以传递引用、指针或副本。

1.传递多维数组的引用:在函数参数中声明多维数组时,可以指定其第二维的大小,或者以逗号分隔指定各个维度的大小。

函数中可以通过索引来访问多维数组的元素,对其进行操作。

2.传递多维数组的指针:传递多维数组的指针和传递一维数组的指针类似。

在函数中可以通过指针操作符和索引来访问数组的元素。

3.传递多维数组的副本:传递多维数组的副本和传递一维数组的副本类似。

在函数中对副本的修改不会影响原数组。

三、使用动态内存分配的数组除了使用静态数组,我们还可以使用动态内存分配的数组。

当我们使用动态内存分配创建数组时,数组的大小可以在运行时确定。

1.传递动态内存分配的数组的引用:当我们使用动态内存分配创建的数组时,可以将数组的引用作为函数参数传递。

函数中可以直接对该数组进行操作。

2.传递动态内存分配的数组的指针:如果我们希望在函数中访问动态内存分配的数组,可以将数组的指针作为参数传递给函数。

C语言数组作为函数参数

C语言数组作为函数参数

C语言数组作为函数参数在C语言中,数组可以作为函数参数传递给其他函数。

这种方式可以方便地将数组的值传递给函数进行处理,从而在不改变原始数组的情况下修改数组的值。

数组作为函数参数的特点如下:1. 数组名作为参数:数组名可以直接作为函数参数,函数内部可以通过数组名访问数组元素。

例如,`void func(int arr[])`这样的函数原型,其中`arr`是一个数组名。

2. 数组作为指针传递:在函数中,数组名被视为指向数组首元素的指针。

因此,我们可以使用指针操作来访问和修改数组的元素。

例如,`void func(int *arr)`这样的函数原型,其中`arr`是指向`int`类型的指针。

3. 数组长度作为参数:为了在函数内获取数组的长度,通常会将数组长度(或元素个数)作为参数传递给函数。

这样,在函数内部可以使用这个长度值来循环遍历数组。

例如,`void func(int arr[], int length)`这样的函数原型,其中`length`是数组的长度。

使用数组作为函数参数的好处包括:1.函数可以直接操作原始数组,而不需要创建额外的副本。

这样可以节省内存空间,并提高程序的效率。

2.函数可以返回修改后的数组,使得代码更清晰易读。

这样可以避免通过函数返回值和全局变量传递数组的方式。

3.可以在不同的函数之间共享数组的数据,从而实现数据的共享和交互。

为了更好地理解数组作为函数参数的概念,我们可以通过一个示例来说明。

假设我们有一个函数`void doubleArray(int arr[], int length)`,这个函数的功能是将数组中的每个元素都乘以2、我们可以按照以下步骤实现这个函数:1.在函数中使用循环遍历数组,从数组的第一个元素开始,到最后一个元素结束。

2.对于每个元素,将其乘以2,并将结果存储回数组。

下面是一个完整的示例代码:```c#include <stdio.h>void doubleArray(int arr[], int length)for (int i = 0; i < length; i++)arr[i] = arr[i] * 2;}int maiint arr[] = {1, 2, 3, 4, 5};int length = sizeof(arr) / sizeof(int);printf("Before doubling: ");for (int i = 0; i < length; i++)printf("%d ", arr[i]);}printf("\n");doubleArray(arr, length);printf("After doubling: ");for (int i = 0; i < length; i++)printf("%d ", arr[i]);}printf("\n");return 0;```这个示例中,我们首先在`main(`函数中定义了一个整型数组`arr`和一个变量`length`来表示数组的长度。

C程序设计初步——数组做函数参数

C程序设计初步——数组做函数参数

数组做函数参数数组做函数参数数组元素做函数参数 (单项值传递)(与变量做实参无区别)数组名做函数参数 (单项地址传递)(改变地址对应的变量的值,能够真实改变实参的值)一维数组做函数参数•当使用数组名做函数参数时,编译器会将该数组的首地址单向传递给形参,此时形参类型也应该是数组类型,但形参数组的长度可以省略。

由于形式数组和实际数组共用一段地址列表,如果在函数中对形式数组进行操作,将会改变实际数组的值。

一维数组做函数参数•【基本格式】•函数定义:函数类型 函数名(数组形参,[形参类型说明表]) •{•函数体; •}•函数调用:函数名(数组名,实参表); •例如:•void bsort(int b[]);“用冒泡排序法”对一维数组a 中的6个整数进行排序(由小到大)。

a[6]={9,8,5,7,3,1}算法分析:冒泡排序法是一种简单的排序方法,将待排序的数组元素看作是竖着排列的“气泡”,较小的元素看成轻“气泡”。

9 8 5 73 1第1趟:对n 个数,从上往下,比较相邻的两个数,小者调上,大者调下。

反复执行n-1次,最大者沉到底,存放至a[n-1]中。

冒泡排序法9 8 5 7 3 1 9 8 5 9 7 9 3 9 1 9 第一趟8 5 7 3 1 9 5 8 7 8 3 8 8 1 第二趟9 7 3 8 1 5 第三趟9 8 7 5 1 3 7 7 1 3 5 3 51 9 8 7 3 5 1 3 1 第四趟第五趟第2趟:对除最大数外的n-1个数,从上往下,比较相邻的两个数,小者调上,大者调下。

反复执行n-2次,第二大者存放至a[n-2]中。

第j 趟:对除排好的数外的n-(j-1)个数,从上往下,比较相邻的两个数,小者调上,大者调下。

反复执行n-j 次,第j 大者存放至a[n-j]中。

第n-1趟:对最后剩余的2个数进行比较,小者调上,大者调下。

执行1次,排序结束。

冒泡排序的N-S 流程图输入n 个数给a[1]到a[n] for j=1 to n-1 for i=1 to n-ja[i]>a[i+1]真假a[i] a[i+1]输出a[1]到a[n]第j (1~n-1)趟排序比较相邻的两个数,若前者大,则交换两两相比,需比较n-j 次#include <stdio.h> main() {int a[6],i,j,t;printf("\n input 6 numbers:\n"); for(i=0;i<6;i++)scanf("%d",&a[i]); printf("\n"); for(j=1;j<=5;j++) for(i=0;i<=5-j; i++) if(a[i]>a[i+1]){t=a[i]; a[i]=a[i+1]; a[i+1]=t;} for(i=0;i<6;i++)printf("%4d",a[i]); }冒泡排序的编程实现冒泡排序函数•用“冒泡法”对10个整形数据进行排序,按从小到大的顺序输出。

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

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

C语言中数组作为函数的参数以及返回值的使用简单入门在C语言中,数组作为函数的参数和返回值都是非常常见的用法。

本文将介绍如何在C语言中使用数组作为函数的参数和返回值,以及相应的注意事项。

一、数组作为函数参数:在C语言中,数组作为函数的参数时,实际上传递的是数组的首地址。

因此,可以通过传递数组的首地址来在函数内部对数组进行操作。

1.将数组作为参数传递给函数:要将数组作为参数传递给函数,可以将数组的名称作为参数,或者使用指针作为参数。

以下是两种常用的方式。

方式一:将数组的名称作为参数传递```cvoid printArray(int arr[], int size)for (int i = 0; i < size; i++)printf("%d ", arr[i]);}int maiint arr[] = {1, 2, 3, 4, 5};int size = sizeof(arr) / sizeof(arr[0]);printArray(arr, size);return 0;```方式二:使用指针作为参数传递```cvoid printArray(int* arr, int size)for (int i = 0; i < size; i++)printf("%d ", arr[i]);}int maiint arr[] = {1, 2, 3, 4, 5};int size = sizeof(arr) / sizeof(arr[0]);printArray(arr, size);return 0;```二、数组作为函数返回值:在C语言中,数组作为函数的返回值时,可以使用两种方式:指针和结构体。

以下是两种常用的方式。

方式一:使用指针作为返回值```cint* createArray(int size)int* arr = (int*)malloc(size * sizeof(int)); for (int i = 0; i < size; i++)arr[i] = i + 1;}return arr;int maiint size = 5;int* arr = createArray(size);for (int i = 0; i < size; i++)printf("%d ", arr[i]);}free(arr);return 0;```方式二:使用结构体作为返回值```cstruct Arrayint* data;int size;};struct Array createArray(int size)struct Array arr;arr.data = (int*)malloc(size * sizeof(int)); arr.size = size;for (int i = 0; i < size; i++)arr.data[i] = i + 1;}return arr;int maiint size = 5;struct Array arr = createArray(size);for (int i = 0; i < arr.size; i++)printf("%d ", arr.data[i]);}free(arr.data);return 0;```以上是使用数组作为函数参数和返回值时的一些基本用法。

数组名作为函数参数

数组名作为函数参数

杨振平●数组元素作实参,对应的形参为变量,一次传递一个元素,采用值传递。

●数组名作实参,对应的形参为一个数组,一次传递整个数组。

●数组作参数,其参数传递可理解为形参数组与实参数组共用同一数组空间(即共用实参数组空间)。

因此,在函数中,使用形参数组就是在使用实参数组,改变形参数组元素的值就是在改变实参数组元素的值,这一点与引用传递非常相似。

1.一维数组的传递❝一维数组作形参的声明格式:<类型> <数组名>[]其中,[]中可以省略数组的长度值。

(可认为形参数组与实参数组长度相同)❝对应的实参应为同类型的一维数组名。

(仅用数组名)说明:为了使函数知道需要处理的数组元素的个数,通常给函数再传递一个表示元素个数的整型数。

数组名作为函数参数(续)例如:一维数组名作为函数的参数。

编写函数,计算一个整型数组中从第m个元素(m从0开始)开始的n个元素之和。

函数设计:函数原型:int fun(int b[],int m,int n);功能:计算数组b中从第m个元素开始的n个元素之和。

主函数设计:定义并初始化一个整型数组a。

测试1:fun(a,0,10);//求从第0个元素开始的10个元素之和测试2:fun(a,3,5); //求从第3个元素开始的5个元素之和int fun(int b[],int m,int n) {int i,s=0;for(i=m;i<m+n;i++) s=s+b[i];return s;}int main(){int x,a[]={0,1,2,3,4,5,6,7,8,9};x=fun(a,0,10);cout<<x<<endl;x=fun(a,3,5);cout<<x<<endl;return 0;}函数代码:主函数代码:●函数定义如下:void sort(int b[],int n) ;//b为一维数组,n为元素的个数{//选用一种排序方法对n个元素的b数组排序(代码略)//对b数组排序,实际就是对实参数组排序}●主函数中的函数调用语句:sort(a,10);//调用sort函数,对10个元素的整型数组a进行排序//函数调用后,并输出排序结果,即输出a数组中各个元素值。

《C语言程序设计》数组名作为函数的参数

《C语言程序设计》数组名作为函数的参数

《C语言程序设计》实验报告实验名称:数组名作为函数的参数系别: 计算机系专业:计算机科学与技术班级:五班姓名: 学号:实验日期:教师审批签字:实验8 数组名作为函数的参数⒈实验目的⑴掌握数组名作为函数参数的基本使用方式。

⑵掌握与数组有关的算法(特别是排序算法)。

⒉实验内容或实验题目编程题目:(题目⑴、题目⑵为一组,题目⑶为一组。

每个同学每组都必须完成1题)要求:每道题目分别书写程序,试运行(如何输入,结果如何)。

题目⑴:编写函数实现将数组元素按从小到大的顺序排序,主函数从键盘输入10个整数存入数组,调用函数后输出数组的元素。

题目⑵:用数组名作为函数参数,编写一个比较两个字符串s和t大小的函数strcomp(s,t),要求s小于t时返回-1,s等于t•时返回0,s大于t时返回1。

在主函数中任意输入4个字符串,利用该函数求最小字符串。

题目⑶:输入6×6的数组,下面的各要求通过编写函数实现,要求用数组名作为函数参数:①求出对角线上各元素的和;②求出对角线上行、列下标均为偶数的各元素的积;③找出对角线上其值最大的元素和它在数组中的位置。

⒊算法说明(用文字或流程图说明。

)题目1:⒋程序清单题目⑴:#include <stdio.h>main(){int i,j,t,n=10,a[10];printf("Please enter ten numbers:\n"); for(i=0;i<n;i++){scanf("%d",&a[i]);}for(i=0;i<n-1;i++){for(j=i+1;j<n;j++)if(a[i] > a[j]){t = a[j];a[j] = a[i];a[i] = t;}}for(i=0;i<n;i++)printf("%d\n",a[i]);}题目⑶:#include <stdio.h>main(){int c,b,i,j,n=6,d=1,max,sum=0,a[6][6];for(i=0;i<n;i++){for(j=0;j<n;j++){scanf("%d",&a[i][j]);}}max=a[0][0];for(i=0;i<n;i++){for(j=0;j<n;j++){if(i==j||i+j==5)sum+=a[i][j];if((i==j||i+j==5) && i%2==0 && j%2==0)d*=a[i][j];if((i==j||i+j==5) && a[i][j]>max){max=a[i][j];b=i;c=j;}}}printf("和为%d\n积为%d\n",sum,d);printf("对角线上最大的元素为%d\n它在数组中的位置为a[%d][%d]\n",max,b,c);}⒌运行结果(包括原始数据、相应的运行结果和必要的说明。

数组名作为函数参数以及sizeof用法

数组名作为函数参数以及sizeof用法

数组名作为函数参数以及sizeof⽤法来源:https:///jay_zhouxl/article/details/51745518int f(int *p,char *a){printf("p[2]=%d,*(p+2)=%d\n",p[2],*(p+2));printf("a[2]=%c,*(a+2)=%c\n",a[2],*(a+2));printf("sizeof(p)=%d\n",sizeof(p));printf("sizeof(a)=%d\n",sizeof(a));return 0;}int main(){int p[5]={0,1,2,3,4};char a[9]={'0','1','2','3','4','1','2','3','4'};printf("sizeof(p)=%d\n",sizeof(p));printf("sizeof(a)=%d\n",sizeof(a));f(p,a);return 0;}输出结果为:sizeof(p)=20 //5*4 int占四个字节sizeof(a)=9 //char占1个字节p[2]=2,*(p+2)=2a[2]=2,*(a+2)=2sizeof(p)=4 //指针占4个字节sizeof(a)=4 //指针占4个字节在《C陷阱和缺陷》中有两句话:1.如果我们使⽤数组名作为函数参数,那么数组名会⽴刻转换为指向该数组第⼀个元素的指针。

C语⾔会⾃动的降作为参数的数组声明转换为相应的指针声明。

2.除了a被⽤作运算符sizeof的参数这⼀情形,在其他所有的情形中数组名a都代表指向数组a中下标为0的元素的指针。

用数组名做函数参数

用数组名做函数参数

用数组名做函数参数用数组名做函数参数可以用数组名作函数参数,此时实参与形参都应用数组名(或指针变量)。

例2:有一个一维数组score,内放10个学生成绩,求平均成绩。

float average(float array[10]){int i;float aver,sum=array[0];for(i=1;i 10;i++)sum=sum+array[i];aver=sum/10;return aver;}main(){float score[10],aver;int i;printf("input 10 scores:\n");for(i=0;i 10;i++)scanf("%f",&score[i]);printf("\n");aver=average(score);//数组名作为函数参数printf("average score is%5.2f",aver);}说明:l用数组名称作函数参数,应该在主调函数和被调函数分别定义数组,本例中array是形参数组名,score是实参数组名,分别在其所在的函数中定义,不能只在一方定义。

l实参数组与形参数组类型应该保持一致(这里都为float型),如不一致,结果将出错。

l在被调用函数中声明了形参数组的大小为10,但在实际上,指定其大小是不起任何作用的,因为C编译器对形参数组大小不做检查,只是检查实参数组的首地址传给形参数组。

因此,score[n]和array[n]指的是同一单元。

l形参数组也可以不指定大小,在定义数组时在数组名后面跟一个空的方括号,有时为了在被调用函数中处理数组元素的需要,可以另设一个参数,传递需要处理的数组元素的个数,上例可以改写为下面的形式:float average(float array,int n){int i;float aver,sum=array[0];for(i=1;i n;i++)sum=sum+array[i];aver=sum/n;return aver;}main(){float score_1[5]={98.5,97,91.5,60,55};float score_2[10]={67.5,89.5,99,69.5,77,89.5,76.5,54,60,99,5};printf("the average of class Ais%6.2f\n",average(score_1,5));printf("the average of class Bis%6.2f\n",average(score_2,10));}可以看出,两次调用average函数时,需要处理的数组元素是不同的,在第一次调用时用一个实参5传递给形参n,表示求前面5个学生的平均分数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

经验技巧7-2 数组名作为函数形参
数组名代表数组的起始地址,是一个指针常量。

因此,数组名不能作自增自减的运算,也不能在赋值语句中作左值。

【示例1】
#define N 8
int main()
{
int i, a[N];
for( i= 0; i<N; i++)
scanf("%d",a++);
return 0;
}
【示例1】中,企图通过对a的改变使指针下移,指向欲输入数据的数组元素。

它的错误在于不了解数组名代表的是数组首地址,是一个地址常量,而地址常量的值是不能改变的。

但如果数组名作为函数的形参,则它退化为一个指针变量。

此时,数组名可以进行自增自减的运算,也可以在赋值语句中作左值。

【示例2】
#define N 8
void Input(int b[])
{
int i;
for( i= 0; i<N; i++)
scanf("%d",b++);
}
int main()
{
int a[N];
Input(a);
return 0;
}
Input函数的形参数组b实际是一个指向实参数组a的指针变量,通过函数调用Input(a)的参数传递,使b指向数组元素a[0],通过b++的操作使指针b下移,依次指向数组元素a[1],a[2],...,a[N-1],从而达到给实参数组a的各元素
输入数据的目的。

Input函数也可改写成:void Input(int *b)
{
int i;
for( i= 0; i<N; i++)
scanf("%d",b++);
}
与原Input函数的效果完全相同。

相关文档
最新文档