可能很多初学者对C语言中(C++类似),数组作为参数传递,和一个函数如何返回一个数组这类问题很迷惑,因为这里面涉及到指针问题,而初学者对指针了解甚少,更别说使用了。我也是刚刚需要实现一个简单算法才用到这部分的知识,所以在这里加以整理,别无所求,仅以自勉。
分一下三部分叙述:
- 数组如何作为参数进行传递?
- 函数怎样才能返回数组?
- 返回数组的函数如何进行调用?
数组如何作为参数进行传递?
我们知道数组的两个特性,即不许拷贝(即无法用数组给数组赋值),数组的使用一般会转换为指针,进行运算。
数组作为参数传递的三种形式:
void fun(int *arry_name);
void fun(int []);
void fun(int [3]);//三者等价
比如:int arry1[2]={0,1};
fun(arry1);
Note:数组作为参数传递时,一般传递数组名和数组长度,也就是采用第一种方式
1. 函数怎样才能返回数组?
由于数字不能被拷贝,即函数无法返回数组。此时,一般让函数返回数组的指针或引用实现,有两种实现方式:
- 采用typedef 类型别名的方式
typedef int arry[10];//arry是一个类型别名,它表示的类型 是含有10个整数的数组
arry * fun(int i);//fun返回一个指向含有10个整数的数组的指针
//这类似于自己定义了一个数组类型的数据类型,返回的就是这个数据类型的指针
- 声明一个返回指针的函数(常用)
/********************************************************************
函数名:线型相关算法
功能;将两组信号做卷积,实现线型相关,得到相关后信号,
用于判断两组信号在某一区间上是否相似
入口参数:* refer_arry:参考信号的指针(参考信号数组名)
* signal_arry: 被测信号指针
L:参考信号数组长度
M:被测信号数组长度(M=2L+m-1,m是被测信号的有效部分长度)
出口参数:result:相关后的信号指针(数组名)
************************************************************************/
int *relation(int* refer_arry,int* signal_arry,int L,int M)
{
int i;//refer_arry->i
//int j=0;//signal-arry->j
int k;//result->k
int result[10]={0};
for(k=0;k<L;k++)
{
for(i=0;i<L;i++)
{
result[k]=result[k]+refer_arry[i]*signal_arry[i-k+L-1];
}
}
return result;
}
3. 返回数组的函数如何进行调用?
调用带有返回值的函数(void类型的函数,也返回值,只不过该值为空),可以将函数看做是一个“数”,我们可以像操作普通数一样操作。但是,如果函数返回的是一个数组的指针,该怎么调用呢?
比如上面的例程,我在调用的时候直接这样将数组打印出来
for(int i=0;i<L;i++)
{
printf("%d\n",relation(y,xx,L,M)[i]); //直接用地址访问到对于地址存储的值
}
看到了吧,是不是想起了些什么。是的,数组名很特殊,它本身就是指向该数组首地址的指针,也就是该数组的首地址(指针)。所以这里我可以直接调用函数,只需在其末尾加上”[i]”即可循环遍历数组,然后输出。(相当于函数名就是返回数组的指针,也就是要返回数组的数组名,所以就可以用函数名间接访问数组中的具体数据了。)
Note:数组不能被拷贝,即不能用数组给数组直接赋值,需要循环遍历赋值
最后在给出一个完整的示例
#include <stdio.h>
//#include <stdlib.h>
//typedef int aaa[10];
int* fun(int* a,int n);
void main()
{
int n=10;
int aa[10];
int *p=fun(aa,n);
for(int i=0;i<n;i++)
{printf("%d\n",p[i]);}
getchar();
}
int* fun(int* a,int n)
{
int i=0;
for(i=0;i<n;i++)
{
a[i]=+i;
}
return a;
}
这样基本上把数组参数,返回数组的函数,以及调用都有了一个了解。希望看到朋友对你有所帮助,欢迎转载。2016/05/13