C语言,函数返回数组

C语言,函数能否输入或返回一个数组?

可以的,但大多数方式都是说将数组的首地址作参数输入,或是指针函数返回一个数组的首地址。而这种方式并非真正意义上的“输入”或“输出”。

参数是一个新的量被附了参考量的值,无论函数内部如何改变这个参数,都不会对原参考量造成影响。返回值亦是如此。因为如果用传入指针的方式,显然函数内部改动数组任意一个元素都会直接改写原数组。故不能说这种方式是数组输入。

函数可以具有参数和返回值,而参数和返回值本质上只是“一串具有特定储存位置和长度的数据”而已。

是的,仅仅具有“储存位置”和“长度”就足够了,跟它的数据类型没有任何关系。
我们在写代码时会十分注意数据类型,而在编译后机器运行时,一切数据都是一串bin在内存特定区域的特定排列。
例如:“char fun1()”“short fun2()”“long fun3()”这几个函数有什么区别呢?
也许看上去我们会直观的说:fun1返回值为char型,fun2返回值为short型,fun3()返回值为long型……
这没错,但这是编译以前的说法。
在机器看来,它们的区别是:fun1返回1Byte,fun2返回返回2Byte,fun3()返回返回4Byte。
那么“signed …”和“unsigned …”(大小相同)岂不是等效了吗?
有区别,那是因为编译的时候编译器会对这些情况进行自动处理,毕竟编译器对数据类型还是比较敏感的,而运行时,它们的确是等效的(1Byte)。
简单来说,“数据类型=数据长度+处理方式”,编译器关心的是处理方式,而机器运行仅仅关心数据长度。

言归正传,怎么让一个函数返回一个“完整的数组”呢?(并不是返回首地址)

“数据类型=数据长度+处理方式”。

参数、返回值,仅仅有地址和数据长度就足够了,我们并不关心它的处理方式,因为返回值传递过程不需要进行数据处理。

但怎么去描述一个数据(返回值)的长度呢?数据类型并不重要,可它却是描述数据长度的唯一方式。我们要确定一个长度,就要用一个类型来描述它……把整个数组当返回值,必然面临的问题是:返回值的长度与数组相同,数组可以很长,而可供我们选择、用来描述长度的数据类型(char,short,long,long long…)又很有限……很无解不是吗?

别忘了还有“构造类型”。结构体这东西一般用的不多,但关键时刻它的用法花样不少。下面附一串代码:

 

#include<stdio.h>

 

typedef

struct

{

char x[16];

}

newtype;

 

newtype fun(void)

{

char str[16]="Hello world!\n";

return *(newtype*)str;

}

 

void main(void)

{

char buf[16];

*(newtype*)buf=fun();

printf("输出结果:%s",buf);

}

 

可以试验一下,程序输出了Hello world!”。

数组原本是空的,后来却能输出Hello world!”,我们知道buf[16]是一个静态数组,它的首地址buf是一个地址常量不能改变,那么唯一的解释就是buf[16]得到了fun函数内部完整的数组返回值,而不是得到首地址。

原理如下:我们构造了一个参考类型newtype,这个类型的长度是自定的16再用这个类型来定义fun函数,那么函数的返回值长度自然就是16Byte,也就是数组长度了接下来把要返回的数组首地址强制转换成newtype指针(地址)型,再取这个指针的目标值作返回值,自然也就带回了数组中的所有(16个)元素同理,数组buf[16]接收这个返回值时也要进行同样的转换;完成。

newtype这个构造类型我们从始至终也没有拿它定义任何变量,仅仅是给后续的数据传递提供了一个长度参考,故称作“参考类型”,它和那几个转换看似麻烦,其实就是欺骗一下编译器而已,这样操作的运行效率实际上是最高的。

  • 10
    点赞
  • 0
    评论
  • 9
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值