有些時候需要子函數將一個數組返回出來,通常是兩種方法,一種是靠指針,另一種是結構體。
一、先來看依靠指針怎么做
例程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)。