在C語言中,無法直接返回一個數(shù)組,但是可以通過返回對應(yīng)類型指針的方式,返回數(shù)組。
專注于為中小企業(yè)提供網(wǎng)站設(shè)計、網(wǎng)站建設(shè)服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)洛龍免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了1000多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
在大多數(shù)情況下,一維數(shù)組和一維指針是可以通用的。
比如,定義一個函數(shù),申請一定長度的整型動態(tài)數(shù)組,其長度用參數(shù)傳入,并將結(jié)果返回。如出錯,返回空指針NULL。 代碼可以寫成如下形式:
int?*int_array_create(int?n)//參數(shù)n為數(shù)組元素個數(shù)
{
int?*r;?
if(n=0)?return?NULL;//參數(shù)錯誤
r?=?(int?*)malloc(sizeof(int)*n);//申請內(nèi)存空間,大小為n個int長度。
return?r;//返回得到的整型數(shù)組的指針。?
}
C/C++不能直接返回一個數(shù)組。這是由于在C/C++中,數(shù)組不是一種類型,因此不能被直接返回。 在C/C++中,一般有兩種方法來返回一個數(shù)組。 第一種方法: 返回一個指向數(shù)組的指針,例如char (*retArray)[10]聲明了一個函數(shù)retArray,該函數(shù)可以返回指向具有10個char元素的數(shù)組例子如下:#include#includeint (*retArray())[10]{int (*a)[10];int i=0;/*動態(tài)開辟空間*/ a=calloc(10,sizeof(int));/*賦值*/for(i=0;i10;i++){(*a)[i]=i;}return a;}int main(){int (*b)[10]; /*函數(shù)返回指向數(shù)組的指針*/ b=retArray(); /*打印第一個元素*/ printf("%d/n",(*b)[0]); /*釋放空間*/free(b);return 0;}第二種方法: 如果你不喜歡用指針的形式返回數(shù)組,那么可以采用返回一個結(jié)構(gòu)的形式。這種形式相對較安全,可以避免忘記釋放指針而造成內(nèi)存泄露,也可以避免訪問懸掛指針造成的錯誤。但缺點是由于結(jié)構(gòu)是先拷貝再返回,因此如果結(jié)構(gòu)較大時,會影響效率和占用較大內(nèi)存。 例子如下:#includestruct tag{int a[10];}x,y;struct tag retArray(){int i=0;for(i=0;i10;i++) x.a[i]=i;return x;}int main(){struct tag y=retArray(); printf("%d/n",y.a[3]);return 0;}注意:(1)在返回指針時要切記要避免內(nèi)存泄露和訪問懸掛指針。 (2)很多人認(rèn)為指針和數(shù)組等價的,這是錯誤的。int (*a)[10]和int b[10]兩者是不能直接用a=b來賦值的。在數(shù)組和指針作為函數(shù)參數(shù)傳遞時,二者可以認(rèn)為等價,這是因為數(shù)組會被轉(zhuǎn)化為指針來傳遞。 (3)返回多維數(shù)組方法類似。
你好!
將函數(shù)采用指針的形式返回平均值
注意看后面的注釋
#includestdio.h
int?main()
{
float?*student_aver(float?array[3][3]);???//?改成指針的形式輸出?
float?score[3][3];
float?*a;
int?i,j;
printf("請輸入學(xué)生各科的成績:");
for(i=0;i3;i++)
for(j=0;j3;j++)
scanf("%f",score[i][j]);
printf("每個學(xué)生的平均成績分別為:");
a=student_aver(score);????????????????//?指針?a?接收函數(shù)的返回值?
for(i=0;i3;i++)??????????????????????//?打印出平均值?
printf("%.2f?",a[i]);
return?0;
}
float?*student_aver(float?array[3][3])????//?改成指針的形式輸出
{
int?i,j;
float?sum,a[3];
for(i=0;i3;i++)
{
sum=0;
for(j=0;j3;j++)
sum=sum+array[i][j];
a[i]=sum/3;
???}
return?a;?????????????????????????????//?輸出數(shù)組?a?
}
不能直接返回一個數(shù)組,但是可以用其他方式實現(xiàn)類似功能。
方法1:利用全局變量
分析:全局變量作為C語言的一個知識點,雖然我們都了解它的特點,但在實際教學(xué)過程中應(yīng)用得并不是很多。由于全局變量的作用域是從定義變量開始直到程序結(jié)束,而對于編寫有多個返回值的C語言函數(shù),我們可以考慮把要返回的多個值定義成全局變量。當(dāng)函數(shù)被調(diào)用時,全局變量被更改,我們再把更改后的全局變量值應(yīng)用于主調(diào)函數(shù)中。函數(shù)被調(diào)用后被更改后的全局變量值即為函數(shù)的數(shù)個返回值。下面以一個實例演示該方法的應(yīng)用。
實例1:編寫函數(shù)求3個數(shù)中的最大值與最小值。
方法:把最大值、最小值分別定義成2個全局變量max、min,在用戶自定義函數(shù)中把求出來的最大值與最小值分別賦給全局變量max、min。函數(shù)調(diào)用完畢后全局變量的max、min值即保存了函數(shù)要求返回的值。程序參考代碼如下:
#include "stdio.h"
#include "conio.h"
int max,min;/*定義兩個全局變量用于保存函數(shù)返回值*/
void max_min(int a,int b,int c) /*定義求最大最小值的函數(shù)*/
{max=min=a; /*初始化最大最小值*/
if(max if(max if(minb)min=b;
if(minc)min=c;
}
main()
{int x,y,z;
printf(" 請輸入3個整數(shù):\n");
scanf("%d,%d,%d",x,y,z);
max_min(x,y,z) ;/*調(diào)用求最大值與最小值的函數(shù)*/
printf("三個數(shù)中的最大值為:%d;最小值為:%d",max,min);/*輸出最大值與最小值*/
getch();
}
調(diào)試結(jié)果如下:
請輸入3個整數(shù):
5,-6,2
三個數(shù)中的最大值為:5;最小值為:-6
注意:該方法雖然可以實現(xiàn)有多個返回值的函數(shù),但由于全局變量不能保證值的正確性(因為其作用域是全局,所以程序范圍內(nèi)都可以修改它的值,如果出現(xiàn)錯誤將非常難以發(fā)現(xiàn)),并且全局變量增加了程序間模塊的耦合,所以該方法要慎用。
方法2:傳遞數(shù)組指針
分析:在教學(xué)過程中,我們知道C語言函數(shù)參數(shù)的傳遞方式有值傳遞與地址傳遞。當(dāng)進(jìn)行值傳遞時,主調(diào)函數(shù)把實參的值復(fù)制給形參,形參獲得從主調(diào)函數(shù)傳遞過來的值運行函數(shù)。在值傳遞過程中被調(diào)函數(shù)參數(shù)值的更改不能導(dǎo)致實參值的更改。而如果是地址傳遞,由于傳遞過程中從實參傳遞過來的是地址,所以被調(diào)函數(shù)中形參值的更改會直接導(dǎo)致實參值的更改。因此,我們可以考慮把多個返回值作為數(shù)組元素定義成一個數(shù)組的形式,并使該數(shù)組的地址作為函數(shù)的形式參數(shù),以傳址方式傳遞數(shù)組參數(shù)。函數(shù)被調(diào)用后,形參數(shù)組元素改變導(dǎo)致實參改變,我們再從改變后的實參數(shù)組元素中獲得函數(shù)的多個返回值。以下實例演示該方法的應(yīng)用。
實例2:編寫函數(shù)求一維整形數(shù)組的最大值與最小值,并把最大值與最小值返回給主調(diào)函數(shù)。
方法:以指針方式傳遞該一維數(shù)組的地址,然后把數(shù)組的最大值與數(shù)組的第一個元素交換,把數(shù)組的最小值與最后一個元素交換。函數(shù)被調(diào)用完畢后,實參數(shù)組中的第一元素為數(shù)組的最大值,實參數(shù)組中最后一個元素為數(shù)組的最小值,從而實現(xiàn)返回數(shù)組的最大值與最小值的功能。程序參考代碼如下:
#include "stdio.h"
#include "conio.h"
void max_min(int *ptr,int n) /*定義求數(shù)組最大值最小值的函數(shù),傳遞數(shù)組指針*/
{int i,j,k;/*j保存最大值所在位置,k保存最小值所在位置*/
int *temp;/*用于交換位置*/
*temp=*ptr;
for(i=0;i{
if(*ptr*(ptr+i))/*最大值與第一個元素進(jìn)行交換*/
{
k=i;
*temp=*ptr;
*ptr=*(ptr+k);
*(ptr+k)=*temp ;
}
if(*(ptr+n-1)*(ptr+i))/*最小值與最后一個元素進(jìn)行交換*/
{
j=i;
*temp =*(ptr+n-1);
*(ptr+n-1)=*(ptr+j);
*(ptr+j)= *temp ;}
}
}
/*調(diào)用最大最小值函數(shù)*/
main()
{
int A[6],i;
for(i=0;i6;i++)
scanf("%d",A[i]);
max_min(A,6);
printf("max=%d, min=%d\n \n",A[0],A[5]);
getch();
}
調(diào)試結(jié)果如下:
請輸入6個整形數(shù),以空格隔開:
5 8 9 32 -6 4
max=32,min=-6
注意:該方法適用于多個返回值的數(shù)據(jù)類型一致的情況。當(dāng)返回值數(shù)據(jù)類型不一致時,不適用該方法
網(wǎng)頁名稱:c語言數(shù)組函數(shù)返回數(shù)組 c語言函數(shù)返回值數(shù)組
URL鏈接:http://www.rwnh.cn/article0/doshoio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、動態(tài)網(wǎng)站、網(wǎng)站設(shè)計公司、全網(wǎng)營銷推廣、、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)