①為什么需要return?
在普寧等地區,都構建了全面的區域性戰略布局,加強發展的系統性、市場前瞻性、產品創新能力,以專注、極致的服務理念,為客戶提供成都網站建設、成都網站制作 網站設計制作按需開發,公司網站建設,企業網站建設,成都品牌網站建設,營銷型網站建設,成都外貿網站建設,普寧網站建設費用合理。
為了回答這個問題,
我打算用 模塊思維 來解釋。
②定義模塊(形參模塊)
定義函數:f(s)(a,b)
滿足公式:s=a+b
函數名:f(s)
形參: a,b(公式中的 變量 )
函數返回值:return s
③調用模塊(實參模塊)
主函數:main()表示用戶自己編寫的部分
調用函數:f(s)(1,2)
滿足公式:x=f(s)(1,2)
函數名:f(s)和定義函數一致,產生調用
實參 :1,2( 賦值 給公式的值)
求值:printf("%d\n",x),求x的值?
④值的傳遞過程
調用模塊 中調用函數x=f(s)(1,2)
將實參1和2的值賦值給
定義模塊 中的形參a和b
(實參到形參是單向傳遞,不可逆)
定義模塊計算出s=a+b=1+2=3
定義模塊 中的return s
將s的值賦值給
調用模塊 中的函數f(s)(1,2)
即x=f(s)(1,2)=s=3
~
return s的作用
就是將定義模塊中的s
賦值 給調用模塊中的調用函數
如果沒有return s
調用模塊中的調用函數將永遠沒有定值
即所求x 無定值
這一點和數學不一樣,
數學中
同一函數名的值是 通用 的,
C語言中
定義函數和調用函數的值是 隔離 的,
盡管函數名一樣
如果不賦值,調用函數永遠無定值。
函數參數和
返回值
三種傳遞方式:值傳遞、指針傳遞和引用傳遞
引用與指針的比較
引用是
C++中的概念,初學者容易把引用和指針混淆一起。一下程序中,n
是m
的一個引用(
reference
),m
是被引用物(referent)。
int
m;
int
n
=
m;
n
相當于m
的別名(綽號),對n
的任何操作就是對m
的操作。所以n
既不是m
的拷貝,也不是指向m
的指針,其實n
就是m
它自己。
C++語言
中,函數的參數和返回值的傳遞方式有三種:值傳遞、指針傳遞和引用傳遞。
以下是“值傳遞”的示例程序。由于Func1
函數體內的x
是
外部變量
n
的一份拷貝,改變x
的值不會影響n,
所以n
的值仍然是0。
void
Func1(int
x)
{
x
=
x
+
10;
}
int
n
=
0;
Func1(n);
cout
“n
=
”
n
endl;
//
n
=
以下是“指針傳遞”的示例程序。由于Func2
函數體內的x
是指向外部變量n
的指針,改變該指針的內容將導致n的值改變,所以n
的值成為10。
void
Func2(int
*x)
{
(*
x)
=
(*
x)
+
10;
}
int
n
=
0;
Func2(n);
cout
“n
=
”
n
endl;
//
n
=
10
以下是“引用傳遞”的示例程序。由于Func3
函數體內的x
是外部變量n
的引用,x
和n
是同一個東西,改變x
等于改變n,所以n
的值成為10。
void
Func3(int
x)
{
x
=
x
+
10;
}
int
n
=
0;
Func3(n);
cout
“n
=
”
n
endl;
//
n
=
10
對比上述三個示例程序,會發現“引用傳遞”的性質象“指針傳遞”,而書寫方式象“值傳遞”。實際上“引用”可以做的任何事情“指針”也都能夠做,為什么還要“引用”這東西?
答案是“用適當的工具做恰如其分的工作”。
在C語言中,一般情況下函數的返回值是通過函數中的return語句來實現的,每調用一次return語句只能從函數中返回一個值。但在實際很多應用中,我們需要從函數中返回多個值,那我們可以用什么方法實現呢?此時我們可以用三種方法來實現。
方法一:設置全局變量
全局變量是在函數外部定義的全局變量,它不屬于任何一個函數,其作用域是從變量的定義處開始,到本程序文件的結尾。在此作用域內,全局變量可為各個函數所引用。當我們需要函數返回多個值時,除了函數體中的return語句返回其中一個之外,其它的返回值我們可以通過定義全局變量來處理。因為根據全局變量的特點,在被調用函數中改變了多個全局變量和值,相當于其主調函數全局變量的值也發生了變化,也就相當于返回了多個值。
例如:利用一個函數求出正方形的周長和面積。
#include
double l=0;//定義全局變量l為正方形周長
void f(double a)//定義求面積和周長的函數
{ double s; s=a*a;//求面積
l=6*a;//求周長,并賦給全局變量l
return s;//僅返回面積的值
}
void main()
{ double a,area;
printf(“請輸入邊長:");
scanf("%f",a);
area=f(a);//面積的值通過調用f函數返回值
printf(“面積為:%5.2lf\n”,area);
printf(“周長為:%5.2lf\n”,l);//周長即為全局變量l在f函數中改變后的值
}
上面的例子即用全局變量實現了函數中返回多值的情況,這種方式易懂。但是全局變量用多了會破壞代碼的安全性,結構性,這主要是全局變量在所有函數中都可以使用,從而其值的變化不確定,所以我們要慎用。
方法二:使用數組名或指針作為函數的形參
數組名或者指針實際為地址,而數組一般都包括多個元素,指針也可以指向一組數據的著地址,把數組名或者指針作為函數形參,實際上相當于主調函數的實參與形參共用地址,所以在函數中的數組元素發生改變即是實參也隨之改變。也相當于在調用函數時多個值返回給主調函數。
實例2:編寫函數求一維整形數組的最大值與最小值,并把最大值與最小值返回給主調函數。
方法:以指針方式傳遞該一維數組的地址,然后把數組的最大值與數組的第一個元素交換,把數組的最小值與最后一個元素交換。函數被調用完畢后,實參數組中的第一元素為數組的最大值,實參數組中最后一個元素為數組的最小值,從而實現返回數組的最大值與最小值的功能。程序參考代碼如下:
#include?"stdio.h"
#include?"conio.h"
void?max_min(int?*ptr,int?n)?/*定義求數組最大值最小值的函數,傳遞數組指針*/
{int?i,j,k;/*j保存最大值所在位置,k保存最小值所在位置*/
int?*temp;/*用于交換位置*/
*temp=*ptr;
for(i=0;i{
if(*ptr*(ptr+i))/*最大值與第一個元素進行交換*/
{
k=i;
*temp=*ptr;
*ptr=*(ptr+k);
*(ptr+k)=*temp?;
}
if(*(ptr+n-1)*(ptr+i))/*最小值與最后一個元素進行交換*/
{
j=i;
*temp?=*(ptr+n-1);
*(ptr+n-1)=*(ptr+j);
*(ptr+j)=?*temp?;}
}
}
/*調用最大最小值函數*/
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();
}
調試結果如下:
請輸入6個整形數,以空格隔開:
5 8 9 32 -6 4
max=32,min=-6
注意:該方法適用于多個返回值的數據類型一致的情況。當返回值數據類型不一致時,不適用該方法。
方法三:使用結構體指針作為函數的形參
編寫返回多個值的C語言函數,可以考慮采用結構體的方式去實現。如果返回的數個數值的數據類型不一致,可以通過定義全局變量實現有多個返回值的C語言函數,也可以考慮把要求返回的數個值定義成一個結構體,然后同樣以傳遞結構體指針方式把結構體的指針傳遞給形參結構體指針,那么函數中對形參結構體的修改即是對實參結構體的修改,函數被調用后獲取的實參結構體成員即為函數的多個返回值,下面以實例演示該方法的應用。
實例3:編寫一個用戶自定義函數,允許用戶錄入學生的基本信息(包括學號、姓名、所屬班級、總評成績),并返回這些基本信息給主調函數。
方法:把學生基本信息定義成一個結構體,在用戶自定義函數中傳遞該結構體的指針,則自定義函數中對結構體成員的錄入操作即是對實參結構體成員的錄入操作,從而實現多個返回值。參考代碼如下:
#include?"stdio.h"
#include?"conio.h"
struct?inf{/*定義學生結構體,分別包含成員學號、姓名、班別、總評成績*/
char?xh[12];
char?name[20];
char?class[15];
int?chj;
};
main(void)
{
struct?inf?a1;?/*定義學生結構體類型變量*/
void?xxxx(struct?inf?*ptr);
printf("請輸入學號,姓名,班別,總評成績,以空格隔開:\n")?;
xxxx(a1);/*調用函數,以學生結構體類型變量地址作為實參*/
printf("學號:%s,姓名:?%s,班別:%s,總評成績:%d",a1.xh,?a1.name,a1.class,a1.chj);
getch();
}
void?xxxx(struct?inf?*ptr)/*該函數實現對結構體成員數據的錄入操作*/
{
char?xh1[12],name1[20],class1[15];
int?chj1;
scanf("%s%s%s%d",xh1,name1,class1,chj1);
strcpy(ptr-xh,xh1);
strcpy(ptr-name,name1);
strcpy(ptr-class,class1);
ptr-chj=chj1;
}
c語言函數只能最多有一個返回值。我們以一個數據運算函數作為實例講解:
使用指針返回額外數據:定義指針參數,將結果通過指針返回。
如果有很多類型相同的數據,如何返回數組呢?c語言也只能借助指針返回數組。
使用結構體返回:如果返回多個數據,并且各個數據類型都不相同。那么只能通過結構體返回。
使用結構體指針返回:直接返回結構體,程序執行效率會受到影響。因為需要復制結構體數據,如果結構體數據比較大,復制操作會損耗程序性能。
通過使用結構體指針,我們也可以返回多個數據結果。
在c++中,除了使用指針,通常使用引用返回多個數據。與指針相比,使用引用時不用擔心函數調用者傳入不符合預期的指針。
標題名稱:c語言如何返還函數參數,c語言函數的參數和返回值
轉載注明:http://vcdvsql.cn/article10/heoddo.html
成都網站建設公司_創新互聯,為您提供全網營銷推廣、關鍵詞優化、網站制作、網站維護、搜索引擎優化、品牌網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯