子函数返回数组(指针和结构体)

一般用void的话就是没有返回值和不需要返回值的了,如调用一个输出函数,这个函数就没必要返回了,事实上这个函数只管输出就好了,也没有什么值要返回的,另一种是用指针传址的时候,因为你传的是地址,函数根据你的地址直接对数据进行操作了,这是就不需要返回值了。
因为对数据的操作在函数里已经进行了(返回值的作用一般是赋值或者作为参数赋值。用指针操作,也可以把返回值赋值给变量)


有些时候需要子函数将一个数组返回出来,通常是两种方法,一种是靠指针,另一种是结构体。

一、先来看依靠指针怎么做

例程1:

复制代码
 1 #include "stdio.h"
 2 
 3 char *test(char *tmp)
 4 {
 5     return tmp;
 6 }
 7 
 8 void main(void)
 9 {
10     printf("%s",test("第一个测试例子\n"));
11 }
复制代码

 

例程1中的test函数如果写成下面的形式,就无法顺利编译。

例程2:

复制代码
 1 #include "stdio.h"
 2 
 3 char *test()
 4 {
 5     //char tmp[30]="第一个测试例子\n";//写成这样编译时弹出警告,最后的结果也是乱码
 6     char *tmp="第一个测试例子";//写成这样可以用指针返回数组首地址
 7     return tmp;
 8 }
 9 
10 void main(void)
11 {
12     printf("%s",test());
13 }
复制代码

之所以*tmp可以而tmp[30]不可以,是因为tmp[30]是个局部变量,子函数结束时该数组地址虽然没变,但是里面的值已经无意义了,而*tmp是定义了一个全局变量。

但是有些时候我们必须用到类似tmp[30]而不是*tmp,这时就要用到static这个关键字:

例程3:

复制代码
 1 #include "stdio.h"
 2 
 3 char *test()
 4 {
 5     static char tmp[30]="第三个测试例子";
 6     return tmp;
 7 }
 8 
 9 void main(void)
10 {
11     printf("%s",test());
12 }
复制代码

 在数组tmp[30]前面加入了static关键字,它就使得tmp[30]存放在内存中的静态存储区中,所占用的存储单元一直不释放直到整个程序运行结束.所以当主函数调用完print()函数后,该空间依然存在.所以main()函数中接到首地值后可以访问数组中的元素.

二、使用结构体作为返回值来传递数组:

复制代码
 1 #include "stdio.h"
 2 #include "string.h"
 3 
 4 struct ret
 5 {
 6     char buf[30];
 7 };//定义结构体时不要忘了分号
 8 
 9 struct ret test(char *tmp)
10 {
11     struct ret a;
12     strcpy(a.buf,tmp);
13     return a;
14 }
15 
16 
17 void main(void)
18 {
19     struct ret b;
20     b=test("用结构体作为返回值传递数组");
21     printf("%s",b.buf);
22 }
复制代码

两点注意:

1、数组之间的赋值不要直接,即不要直接将数组A赋给数组B,而是要用strcpy(字符型数组)或者memcpy(非字符型数组)。

2、用结构体定义变量和函数时不要忘了结构体名(上面程序的ret)。



  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值