Chinaunix首页 | 论坛 | 博客
  • 博客访问: 505392
  • 博文数量: 77
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 689
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-12 08:40
文章分类

全部博文(77)

文章存档

2018年(1)

2016年(3)

2015年(24)

2014年(49)

我的朋友

分类: 嵌入式

2014-08-26 14:12:40

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

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

例程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)。

阅读(2032) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~