當前位置:首頁 » 編程語言 » c語言函數應用參數
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言函數應用參數

發布時間: 2022-05-05 08:00:04

1. c語言中用函數做函數的形式參數的問題

給你舉個例子吧,這樣就容易理解得多。
例子:設計一個函數func();在調用它時每次實現不同的函數功能,輸入兩個參數a和b,第一次調用func()時找出a和b中的較大者,第二次調用找出較小者,第三次調用求a和b之和。
說明:格式
(*p)()
表示定義一個指向函數的指針變數p,在c語言中這個格式是固定的,前面的()表示p先和*結合,是指針變數,後面的()表示p指向一個函數。前面的()不能省略,如果寫成
*p(),由於()優先順序比*高,那就表示p()函數返回的是一個指針,p本身就是函數不是指針了,意思完全變了。
任何一個函數,函數名就是該函數的入口地址(起始地址),也就是說函數名就是個地址,從這個地址開始,函數佔用一段內存單元。因此可以用一個指針變數來指向這個這個函數名,這樣就相當於指向這個函數了。所以下面的max,min,add函數都是一個地址,分別調用時就是賦值p=max,p=min,p=add,也就是(*p)(x,y)分別就等於max(x,y),min(x,y),add(x,y).
程序在win-tc和Dev-c++下調試通過。
#include
<stdio.h>
#include
<conio.h>
int
max(int
x,int
y)
{
return(x>y?x:y);
}
int
min(int
x,int
y)
{
return(x<y?x:y);
}
int
add(int
x,int
y)
{
return(x+y);
}
int
func(int
x,int
y,int
(*p)())
/*定義指向函數的指針變數p,關鍵1*/
{int
result;
result=(*p)(x,y);
/*調用相應函數,函數名即地址給p,這樣p指向該函數,關鍵2*/
printf("%d\n",result);
}
main()
{
int
a,b;
printf("Please
input
two
integers
a
and
b:\n");
scanf("%d%d",&a,&b);
printf("max=");
func(a,b,max);/*相當於賦值p=max*/
printf("min=");
func(a,b,min);/*相當於賦值p=min*/
printf("add=");
func(a,b,add);/*相當於賦值p=add*/
getch();
}

2. C語言函數參數

1.x=2,y=3
2.x,y仍然是2和3
3.x、y是形參,它的值來自對應的實參a、b,因此a、b的值是多少,x、y的值就是多少。
4.C的值實際上是a、b中的較大值。

3. c語言函數調用時,參數是如何傳遞的

建立中間變數(形參),把實參值賦值給中間變數,當被調函數返回值時,系統釋放掉中間變數。

在程序中通過對函數的調用來執行函數體,其過程與其它語言的子程序調用相似。對無參函數調用時則無實際參數表。實際參數表中的參數可以是常數、變數或其它構造類型數據及表達式。各實參之間用逗號分隔。

函數作為表達式中的一項出現在表達式中,以函數返回值參與表達式的運算。這種方式要求函數是有返回值的。例如:z=max(x,y)是一個賦值表達式,把max的返回值賦予變數z。



(3)c語言函數應用參數擴展閱讀:

C語言中又規定在以下幾種情況時可以省去主調函數中對被調函數的函數說明。

1、如果被調函數的返回值是整型或字元型時,可以不對被調函數作說明,而直接調用。這時系統將自動對被調函數返回值按整型處理。例8.2的主函數中未對函數s作說明而直接調用即屬此種情形。

2、當被調函數的函數定義出現在主調函數之前時,在主調函數中也可以不對被調函數再作說明而直接調用。例如例8.1中,函數max的定義放在main 函數之前,因此可在main函數中省去對max函數的函數說明int max(int a,int b)。

3、如在所有函數定義之前,在函數外預先說明了各個函數的類型,則在以後的各主調函數中,可不再對被調函數作說明。

4. c語言,函數中定義的參數叫什麼,調用的參數呢

函數中定義的參數叫formal
parameter(
形式參數
),
調用的參數叫actual
parameter(
實際參數
).
有的書是另一種講法:
函數中定義的參數叫argument,調用的參數叫
parameter.

5. C語言函數的參數的問題

主函數也就是main函數 一般是沒有參數的。函數可以分為兩類,帶參數和不帶參數的,參數的作用就是值傳遞。一般都是在主函數中調用子函數,由實參傳遞給形參,形參:全稱為「形式參數」是在定義函數名和函數體的時候使用的參數,目的是用來接收調用該函數時傳遞的參數。 形參的作用是實現主調函數與被調函數之間的聯系,通常將函數所處理的數據,影響函數功能的因素或者函數處理的結果作為形參。沒有形參的函數在形參表的位置應該寫void.main 函數也可以有形參和返回值,其形參也稱為命令行參數,由操作系統在啟動程序時初始化,其返回值傳遞給操作系統。

形參和實參的特點
1、形參變數只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參有在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參變數。 2、實參可以是常量、變數、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定值。 3、實參和形參在數量上,類型上、順序上應嚴格一致,否則就會發生類型不匹配的錯誤。 4、函數調用中發生的數據傳送是單向的,即只能把實參傳送給形參,而不能把形參的值反向地傳送給實參。因此在函數調用過程中,形參值發生改變,而實參中的值不會變化。

6. c語言中用函數做參數怎麼用

數組元素就是下標變數,它與普通變數並無區別。 因此它作為函數實參使用與普通變數是完全相同的,在發生函數調用時,把作為實參的數組元素的值傳送給形參,實現單向的值傳送。【例5-4】說明了這種情況。

【例8-7】判別一個整數數組中各元素的值,若大於0 則輸出該值,若小於等於0則輸出0值。編程如下:#include <stdio.h>void nzp(int v){ if(v>0) printf("%d ",v); else printf("%d ",0);}int main(void){ int a[5],i; printf("input 5 numbers\n"); for(i=0;i<5;i++){ scanf("%d",&a[i]); nzp(a[i]); } return 0;}
本程序中首先定義一個無返回值函數nzp,並說明其形參v為整型變數。在函數體中根據v值輸出相應的結果。在main函數中用一個for語句輸入數組各元素,每輸入一個就以該元素作實參調用一次nzp函數,即把a[i]的值傳送給形參v,供nzp函數使用。

數組名作為函數參數
用數組名作函數參數與用數組元素作實參有幾點不同。

1) 用數組元素作實參時,只要數組類型和函數的形參變數的類型一致,那麼作為下標變數的數組元素的類型也和函數形參變數的類型是一致的。因此,並不要求函數的形參也是下標變數。換句話說,對數組元素的處理是按普通變數對待的。用數組名作函數參數時,則要求形參和相對應的實參都必須是類型相同的數組,都必須有明確的數組說明。當形參和實參二者不一致時,即會發生錯誤。

2) 在普通變數或下標變數作函數參數時,形參變數和實參變數是由編譯系統分配的兩個不同的內存單元。在函數調用時發生的值傳送是把實參變數的值賦予形參變數。在用數組名作函數參數時,不是進行值的傳送,即不是把實參數組的每一個元素的值都賦予形參數組的各個元素。因為實際上形參數組並不存在,編譯系統不為形參數組分配內存。那麼,數據的傳送是如何實現的呢?在我們曾介紹過,數組名就是數組的首地址。因此在數組名作函數參數時所進行的傳送只是地址的傳送,也就是說把實參數組的首地址賦予形參數組名。形參數組名取得該首地址之後,也就等於有了實在的數組。實際上是形參數組和實參數組為同一數組,共同擁有一段內存空間。

上圖說明了這種情形。圖中設a為實參數組,類型為整型。a佔有以2000為首地址的一塊內存區。b為形參數組名。當發生函數調用時,進行地址傳送,把實參數組a的首地址傳送給形參數組名b,於是b也取得該地址2000。於是a,b兩數組共同佔有以2000為首地址的一段連續內存單元。從圖中還可以看出a和b下標相同的元素實際上也占相同的兩個內存單元(整型數組每個元素佔二位元組)。例如a[0]和b[0]都佔用2000和2001單元,當然a[0]等於b[0]。類推則有a[i]等於b[i]。

【例8-8】數組a中存放了一個學生5門課程的成績,求平均成績。#include <stdio.h>float aver(float a[5]){ int i; float av,s=a[0]; for(i=1;i<5;i++) s=s+a[i]; av=s/5; return av;}int main(void){ float sco[5],av; int i; printf("\ninput 5 scores:\n"); for(i=0;i<5;i++) scanf("%f",&sco[i]); av=aver(sco); printf("average score is %5.2f",av); return 0;}
本程序首先定義了一個實型函數aver,有一個形參為實型數組a,長度為5。在函數aver中,把各元素值相加求出平均值,返回給主函數。主函數main 中首先完成數組sco的輸入,然後以sco作為實參調用aver函數,函數返回值送av,最後輸出av值。 從運行情況可以看出,程序實現了所要求的功能。

3) 前面已經討論過,在變數作函數參數時,所進行的值傳送是單向的。即只能從實參傳向形參,不能從形參傳回實參。形參的初值和實參相同,而形參的值發生改變後,實參並不變化,兩者的終值是不同的。而當用數組名作函數參數時,情況則不同。由於實際上形參和實參為同一數組,因此當形參數組發生變化時,實參數組也隨之變化。當然這種情況不能理解為發生了「雙向」的值傳遞。但從實際情況來看,調用函數之後實參數組的值將由於形參數組值的變化而變化。為了說明這種情況,把【例5.4】改為【例5.6】的形式。

【例8-9】題目同【例8.7】。改用數組名作函數參數。#include <stdio.h>void nzp(int a[5]){ int i; printf("\nvalues of array a are:\n"); for(i=0;i<5;i++){ if(a[i]<0) a[i]=0; printf("%d ",a[i]); }}int main(void){ int b[5],i; printf("\ninput 5 numbers:\n"); for(i=0;i<5;i++) scanf("%d",&b[i]); printf("initial values of array b are:\n"); for(i=0;i<5;i++) printf("%d ",b[i]); nzp(b); printf("\nlast values of array b are:\n"); for(i=0;i<5;i++) printf("%d ",b[i]); return 0;}
本程序中函數nzp的形參為整數組a,長度為5。主函數中實參數組b也為整型,長度也為5。在主函數中首先輸入數組b的值,然後輸出數組b的初始值。然後以數組名b為實參調用nzp函數。在nzp中,按要求把負值單元清0,並輸出形參數組a的值。 返回主函數之後,再次輸出數組b的值。從運行結果可以看出,數組b的初值和終值是不同的,數組b的終值和數組a是相同的。這說明實參形參為同一數組,它們的值同時得以改變。

用數組名作為函數參數時還應注意以下幾點:
①形參數組和實參數組的類型必須一致,否則將引起錯誤。

②形參數組和實參數組的長度可以不相同,因為在調用時,只傳送首地址而不檢查形參數組的長度。當形參數組的長度與實參數組不一致時,雖不至於出現語法錯誤(編譯能通過),但程序執行結果將與實際不符,這是應予以注意的。

【例8.10】如把例8.9修改如下:#include <stdio.h>void nzp(int a[8]){ int i; printf("\nvalues of array aare:\n"); for(i=0;i<8;i++){ if(a[i]<0)a[i]=0; printf("%d ",a[i]); }}int main(void){ int b[5],i; printf("\ninput 5 numbers:\n"); for(i=0;i<5;i++) scanf("%d",&b[i]); printf("initial values of array b are:\n"); for(i=0;i<5;i++) printf("%d ",b[i]); nzp(b); printf("\nlast values of array b are:\n"); for(i=0;i<5;i++) printf("%d ",b[i]); return 0;}
本程序與【例8.9】程序比,nzp函數的形參數組長度改為8,函數體中,for語句的循環條件也改為i<8。因此,形參數組a和實參數組b的長度不一致。編譯能夠通過,但從結果看,數組a的元素a[5]、a[6]、a[7]顯然是無意義的。

③在函數形參表中,允許不給出形參數組的長度,或用一個變數來表示數組元素的個數。例如,可以寫為:
void nzp(int a[])
或寫為
void nzp( int a[], int n )
其中形參數組a沒有給出長度,而由n值動態地表示數組的長度。n的值由主調函數的實參進行傳送。由此,【例8-10】又可改為【例8-11】的形式。

【例8-11】復制純文本新窗口
#include <stdio.h>void nzp(int a[],int n){ int i; printf("\nvalues of array a are:\n"); for(i=0;i<n;i++){ if(a[i]<0) a[i]=0; printf("%d ",a[i]); }}int main(void){ int b[5],i; printf("\ninput 5 numbers:\n"); for(i=0;i<5;i++) scanf("%d",&b[i]); printf("initial values of array b are:\n"); for(i=0;i<5;i++) printf("%d ",b[i]); nzp(b,5); printf("\nlast values of array b are:\n"); for(i=0;i<5;i++) printf("%d ",b[i]); return 0;}

7. c語言函數中的參數

在 C++ 里,這樣的參數,只能獲取指針作為實際參數,並且讓形式參數 引用 實際參數(被引用的通常是另一個變數)。
例如:Stack *pL = new Stack(); out(pL); // 對的
而不能獲取「地址常量」;
例如:Stack L; out(&L); // 錯的

在 C 里,沒有 「引用」 符號,象 double Out(Stack *&L), 不能通過編譯。

8. c語言 函數的參數

c沒有重載的。。你可以把不用的參數調用時置NULL,並在函數定義裡面做個判斷。。或者你在函數定義時加上默認參數值NULL,不過c好像也不能這樣用吧。。在cpp里可以

原則上同意樓上的。。

9. c語言中參數是什麼概念

函數的參數分為形參和實參兩種。

形參出現在函數定義中,在整個函數體內都可以使用,離開該函數則不能使用。實參出現在主調函數中,進入被調函數後,實參變數也不能使用。

形參和實參的功能是作數據傳送,發生函數調用時,主調函數把實參的值傳送給被調函數的形參從而實現主調函數向被調函數的數據傳送。

舉個例子:

定義一個函數s=f(a,b),功能是將a和b的差賦值給s,那麼,a和b就是這個函數的兩個參數。

(9)c語言函數應用參數擴展閱讀:

C語言的參數傳遞方式

方法有3種方式:值傳遞、地址傳遞、引用傳遞

tips:

被調用函數的形參只有函數被調用時才會臨時分配存儲單元,一旦調用結束佔用的內存便會被釋放

值傳遞和地址傳遞,傳遞的都是實參的一個拷貝

C語言中實參和形參之間的數據傳遞是單向的「值傳遞」,單向傳遞,只能由實參傳給形參,反之不行

輸出格式並沒有選擇%p而是選擇了%d,因為十進制的數看起來更直觀。

值傳遞

如果只是傳遞值的話:

#include <stdio.h>

//值傳遞傳值

void swap( int x, int y);

int main()

{

int a=2,b=3;

printf("before:實參為a,b a=%d,地址為%d b=%d,地址為%d ",a,&a,b,&b);

swap(a,b);

printf("after:實參為a,b a=%d,地址為%d b=%d,地址為%d ",a,&a,b,&b);

return 0;

}

void swap(int x,int y)

{

int tmp;

tmp=x;

x=y;

y=tmp;

printf("inside:形參為x,y x=%d,地址為%d y=%d,地址為%d ",x,&x,y,&y);

}