1. 程式人生 > >子函式返回陣列(指標和結構體)

子函式返回陣列(指標和結構體)

一般用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)。