关于在C/C++语言中,函数如何返回数组,数组如何作为参数传递以及返回数组的函数该如何调用问题的总结

可能很多初学者对C语言中(C++类似),数组作为参数传递,和一个函数如何返回一个数组这类问题很迷惑,因为这里面涉及到指针问题,而初学者对指针了解甚少,更别说使用了。我也是刚刚需要实现一个简单算法才用到这部分的知识,所以在这里加以整理,别无所求,仅以自勉。
分一下三部分叙述:

  1. 数组如何作为参数进行传递?
  2. 函数怎样才能返回数组?
  3. 返回数组的函数如何进行调用?

数组如何作为参数进行传递?

我们知道数组的两个特性,即不许拷贝(即无法用数组给数组赋值),数组的使用一般会转换为指针,进行运算。
数组作为参数传递的三种形式:

void fun(int *arry_name);
void fun(int []);
void fun(int [3]);//三者等价
比如:int arry1[2]={0,1};
fun(arry1);

Note:数组作为参数传递时,一般传递数组名和数组长度,也就是采用第一种方式

1. 函数怎样才能返回数组?

由于数字不能被拷贝,即函数无法返回数组。此时,一般让函数返回数组的指针或引用实现,有两种实现方式:

  1. 采用typedef 类型别名的方式

typedef int arry[10];//arry是一个类型别名,它表示的类型 是含有10个整数的数组
arry * fun(int i);//fun返回一个指向含有10个整数的数组的指针
//这类似于自己定义了一个数组类型的数据类型,返回的就是这个数据类型的指针

  1. 声明一个返回指针的函数(常用)
 /********************************************************************
函数名:线型相关算法
功能;将两组信号做卷积,实现线型相关,得到相关后信号,
     用于判断两组信号在某一区间上是否相似
入口参数:* 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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值