子函式返回陣列(指標和結構體)
阿新 • • 發佈:2019-02-07
一般用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 returntmp; 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)。