有些時候需要子函數(shù)將一個數(shù)組返回出來,通常是兩種方法,一種是靠指針,另一種是結(jié)構(gòu)體。
返回非數(shù)組可以這樣使用:
比如,輸入a,返回b和c:
void fun(int a, int *pb, int *pc)
{
*pb = a - 1;
*pc = a + 1;
}
int main()
{
int a = 1;
int b, c;
fun(a, &b, &c);//輸入a返回b=a-1,c=a+1兩個結(jié)果
printf("a=%d,b=%d,c=%d",a,b,c);//輸出結(jié)果是“a=1,b=0,c=2”
return 0;
}
一、先來看依靠指針怎么做
例程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函數(shù)如果寫成下面的形式,就無法順利編譯。
例程2:
1 #include "stdio.h" 2 3 char *test() 4 { 5 //char tmp[30]="第一個測試例子\n";//寫成這樣編譯時彈出警告,最后的結(jié)果也是亂碼 6 char *tmp="第一個測試例子";//寫成這樣可以用指針返回數(shù)組首地址 7 return tmp; 8 } 9 10 void main(void)11 {12 printf("%s",test());13 }
之所以*tmp可以而tmp[30]不可以,是因為tmp[30]是個局部變量,子函數(shù)結(jié)束時該數(shù)組地址雖然沒變,但是里面的值已經(jīng)無意義了,而*tmp是定義了一個全局變量。
但是有些時候我們必須用到類似tmp[30]而不是*tmp,這時就要用到static這個關(guān)鍵字:
例程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 }
在數(shù)組tmp[30]前面加入了static關(guān)鍵字,它就使得tmp[30]存放在內(nèi)存中的靜態(tài)存儲區(qū)中,所占用的存儲單元一直不釋放直到整個程序運行結(jié)束.所以當主函數(shù)調(diào)用完print()函數(shù)后,該空間依然存在.所以main()函數(shù)中接到首地值后可以訪問數(shù)組中的元素.
二、使用結(jié)構(gòu)體作為返回值來傳遞數(shù)組:
1 #include "stdio.h" 2 #include "string.h" 3 4 struct ret 5 { 6 char buf[30]; 7 };//定義結(jié)構(gòu)體時不要忘了分號 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("用結(jié)構(gòu)體作為返回值傳遞數(shù)組");21 printf("%s",b.buf);22 }
兩點注意:
1、數(shù)組之間的賦值不要直接,即不要直接將數(shù)組A賦給數(shù)組B,而是要用strcpy(字符型數(shù)組)或者memcpy(非字符型數(shù)組)。
2、用結(jié)構(gòu)體定義變量和函數(shù)時不要忘了結(jié)構(gòu)體名(上面程序的ret)。
聯(lián)系客服