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

在c語言中函數頭部的形參格式

發布時間: 2023-05-16 19:54:40

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();
}

② C語言函數定義和說明的格式

你要的是何時說明吧
printf 格式說明符;

%c --字元
%d --十進制整數
%i --同%d
%e --以科學計數法表示浮點數(指數部分以e表示)
%E --以科學計數法表示浮點數(指數部分以E表示)
%f --浮點數
%g --在%e和%f表示中選取擇短的一種
%G --在%E和%f表示中選取擇短的一種
%o --無符號八進制整數
%s --字元串
%u --無符號整數
%x --無符號十六進制(小寫x)整數
%X --無符號十六進制(大寫X)整數
%p --輸出指針內容
%n --顯示至此printf已輸入的字元數
%% --顯示百分號

scanf 格式說明符;

%c --讀字元
%d --讀整數
%i --同%d
%e --讀浮點數
%f --讀浮點數
%g --讀浮點數
%o --讀八進制數
%s --讀字元串
%x --讀十六進制整數
%p --讀指針
%n --至此已讀入的字元數
%u --讀無符號整數
%[] --搜索字元集合

③ c語言的函數頭

在一個函數定義中,函數體之前的所有部分稱為函數頭,它給出了該函數的返回類型、每個參數的次序和類型等函數原型信息,所以當沒有專門給出函數原型說明語句時,系統就從函數頭中獲取函數原型信息。

一個函數的原型語句就是其函數頭的一個拷貝,當然要在最後加上語句接上結束符分號。函數原型語句與函數頭也有細微的差別,在函數原型語句中,其參數表中的每個參數允許只保留參數類型,而省略參數名,並且若使用參數名也允許與函數頭中對應的參數名不同。

全文如下:
一)、定義格式
<類型名> <函數名> ([<參數表>]) <函數體>

<類型名>為系統或用戶已定義的一種數據類型,它是函數執行過程中通過return語句要求返回的值的類型,又稱為該函數的類型。當一個函數不需要通過return語句返回一個值時,稱為無返回值函數或無類型函數,此時需要使用保留字void作為類型名。當類型名為int時,可以省略不寫,但為了清楚起見,還是寫明為好。

<函數名>是用戶為函數所起的名字,它是一個標識符,應符合C++標識符的一般命名規則,用戶通過使用這個函數名和實參表可以調用該函數。

<參數表>又稱形式參數表,它包含有任意多個(含0個,即沒有)參數說明項,當多於一個時其前後兩個參數說明項之間必須用逗號分開。每個參數說明項由一種已定義的數據類型和一個變數標識符組成,該變數標識符成為該函數的形式參數,簡稱形參,形參前面給出的數據類型稱為該形參的類型。一個函數定義中的<參數表>可以被省略,表明該函數為無參函數,若<參數表>用void取代,則也表明是無參函數,若<參數表>不為空,同時又不是保留字void,則稱為帶參函數。

<函數體>是一條復合語句,它以左花括弧開始,到右花括弧結束,中間為一條或若干條C++語句。

在一個函數的參數表中,每個參數可以為任一種數據類型,包括普通類型、指針類型、數組類型、引用類型等,一個函數的返回值可以是除數組類型之外的任何類型,包括普通類型、指針類型和引用類型等。另外,當不需要返回值時,應把函數定義為void類型。
二)、定義格式舉例
(1) void f1() {...}

(2) void f2(int x) {...}

(3) int f3(int x,int* p) {...}

(4) char* f4(char a[]){...}

(5) int f5(int& x,double d) {...}

(6) int& f6(int b[10], int n) {...}

(7) void f7(float c[][N], int m, float& max) {...}

(8) bool f8(ElemType*& bt, ElemType& item) {...}

在第一條函數定義中,函數名為f1,函數類型為void,參數表為空,此函數是一個無參無類型函數。若在f1後面的圓括弧內寫入保留字void,也表示為無參函數。

在第二條函數定義中,僅帶有一個類型為int的形參變數x,該函數沒有返回值。

在第三條函數定義中,函數名為f3,函數類型為int,函數參數為x和p,其中x為int型普通參數,p為int*型指針參數。

在第四條函數定義中,函數名為f4,函數類型為char*,即字元指針類型,參數表中包含一個一維字元數組參數。注意:在定義任何類型的一維數組參數時,不需要給出維的尺寸,當然給出也是允許的,但沒有任何意義。

在第五條函數定義中,函數名為f5,返回類型為int,該函數帶有兩個形參,一個為 整型引用變數x,另一個為雙精度變數d。

在第六條函數定義中,函數名為f6,函數類型為int&,即整型引用,該函數帶有兩個形參,一個是整型數組b,另一個是整型變數n。在這里定義形參數組b所給出的維的尺寸10可以被省略。

在第七條函數定義中,函數名為f7,無函數類型,參數表中包含三個參數,一個為二維單精度型數組c,第二個為整型變數m,第三個為單精度引用變數max。注意:當定義一個二維數組參數時,第二維的尺寸必須給出,並且必須是一個常量表達式,第一維尺寸可給出也可不給出,其作用相同。

在第八條函數定義中,函數名為f8,返回類型為bool,即邏輯類型,該函數帶有兩個參數,一個為形參bt,它為ElemType的指針引用類型,另一個為形參item,它是ElemType的引用類型,其中ElemType為一種用戶定義的類型或是通過typedef語句定義的一個類型的別名。
三)、有關函數定義的幾點說明
1. 函數原型語句

在一個函數定義中,函數體之前的所有部分稱為函數頭,它給出了該函數的返回類型、每個參數的次序和類型等函數原型信息,所以當沒有專門給出函數原型說明語句時,系統就從函數頭中獲取函數原型信息。

一個函數必須先定義或聲明而後才能被調用,否則編譯程序無法判斷該調用的正確性。一個函數的聲明是通過使用一條函數原型語句實現的,當然使用多條相同的原型語句聲明同一個函數雖然多餘但也是允許的,編譯時不會出現錯誤。

在一個完整的程序中,函數的定義和函數的調用可以在同一個程序文件中,也可以處在不同的程序文件中,但必須確保函數原型語句與函數調用表達式出現在同一個文件中,並且函數原型語句出現在前,函數的調用出現在後。

通常把一個程序中用戶定義的所有函數的原型語句組織在一起,構成一個頭文件,讓該程序中所含的每個程序文件的開始(即所有函數定義之前)包含這個頭文件(通過#include命令實現),這樣不管每個函數的定義在哪裡出現,都能夠確保函數先聲明後使用(即調用)這一原則的實現。

一個函數的原型語句就是其函數頭的一個拷貝,當然要在最後加上語句接上結束符分號。函數原型語句與函數頭也有細微的差別,在函數原型語句中,其參數表中的每個參數允許只保留參數類型,而省略參數名,並且若使用參數名也允許與函數頭中對應的參數名不同。

2. 常量形參

在定義一個函數時,若只允許函數體訪問一個形參的值,不允許修改它的值,則應把該形參說明為常量,這只要在形參說明的前面加上const保留字進行修飾即可。如:

void f9(const int& x, const char& y);

void f10(const char* p, char key);

在函數f9的函數體中只允許使用x和y的值,不允許修改它們的值。在函數f10的函數體中只允許使用p所指向的字元對象或字元數組對象的值,不允許修改它們的值,但在函數體中既允許使用也允許修改形參key的值。

3. 預設參數

在一個函數定義中,可根據需要對參數表末尾的一個或連續若干個參數給出預設值,當調用這個函數時,若實參表中沒有給出對應的實參,則形參將採用這個預設值。如:

void f11(int x, int y=0) {...}

int f12(int a[], char op='+', int k=10) {...}

函數f11的定義帶有兩個參數,分別為整型變數x和y,並且y帶有預設值0,若調用該函數的表達式為f11(a,b),將把a的值賦給x,把b的值賦給y,接著執行函數體;若調用該函數的表達式為f11(a+b),則也是正確的調用格式,它將把a+b的值賦給x,因y沒有對應的實參,將採用預設值0,參數傳送後接著執行函數體。

函數f12的定義帶有三個參數,其中後兩個帶有預設值,所以調用它的函數格式有三種,一種只帶一個實參,用於向形參a傳送數據,後兩個形參採用預設值,第二種帶有兩個實參,用於分別向形參a和op傳送數據,第三個形參採用預設值,第三種帶有三個實參,分別用於傳送給三個形參。

若一個函數帶有專門的函數原型語句,則形參的預設值只能在該函數原型語句中給出,不允許在函數頭中給出。如對於上述的f11和f12函數,其對應的函數原型語句分別為:

void f11(int x, int y=0);

int f12(int a[], char op='+', int k=10);

函數定義應分別改寫為:

void f11(int x, int y) {...}

int f12(int a[], char op, int k) {...}

4. 數組參數

在函數定義中的每個數組參數實際上是指向元素類型的指針參數。對於一維數組參數說明:

<數據類型> <數組名>[]

它與下面的指針參數說明完全等價:

<數據類型> *<指針變數名>

其中<指針變數名>就是數組參數說明中的<數組名>。如對於f12函數定義中的數組參數說明int a[],等價於指針參數說明int* a。也就是說,數組參數說明中的數組名a是一個類型為int*的形參。注意:在變數定義語句中定義的數組,其數組名代表的是一個數組,它的值是指向第一個元素的指針常量,這與數組形參的含義有區別。

對於二維數組參數說明:

<數據類型> <參數名>[][<第二維尺寸>]

它與下面的指針參數說明完全等價:

<數據類型> (*<參數名>)[<第二維尺寸>]

如對於f7函數定義中的二維數組參數說明float c[][N],等價於指針參數說明float(*c)[N]。

5. 函數類型

當調用一個函數時就執行一遍循環體,對於類型為非void的函數,函數體中至少必須帶有一條return語句,並且每條return語句必須帶有一個表達式,當執行到任一條return語句時,將計算出它的表達式的值,結束整個函數的調用過程,把這個值作為所求的函數值帶回到調用位置,參與相應的運算;對於類型為void的函數,它不需要返回任何函數值,所以在函數體中既可以使用return語句,也可以不使用,對於使用的每條return語句不允許也不需要帶有表達式,當執行到任一條return語句時,或執行到函數體最後結束位置時,將結束函數的調用過程,返回到調用位置向下繼續執行。

6. 內聯函數

當在一個函數的定義或聲明前加上關鍵字inline則就把該函數聲明為內聯函數。計算機在執行一般函數的調用時,無論該函數多麼簡單或復雜,都要經過參數傳遞、執行函數體和返回等操作。若把一個函數聲明為內聯函數後,在程序編譯階段系統就有可能把所有調用該函數的地方都直接替換為該函數的執行代碼,由此省去函數調用時的參數傳遞和返回操作,從而加快整個程序的執行速度。通常可把一些相對簡單的函數聲明為內聯函數,對於較復雜的函數則不應聲明為內聯函數。從用戶的角度看,調用內聯函數和一般函數沒有任何區別。下面就是一個內聯函數定義的例子,它返回形參值的立方。

inline int cube(int n)

{

return n*n*n;

}

④ 在c語言中形參與實參是如何定義的

在C語言中,形參即為形式參數。它在整個函數編譯的時候,沒有實際的數據賦於它,僅僅作於定義某個函數或者函數名。
而實參既為實際參數。顧名思義,在函數中,有一個特定的數據賦值給它,可以作於在函數中進行運算。
比如:
void main()
{
int a=1,b;
b=function(a); //a作於在函數中進行運算,是實參
}
int function(int c) //c作於定義function函數,是形參
{}

⑤ 函數首部的返回值類型,函數名,形參類型,形參名都是具體指什麼

依次回答你得問題,返回值類型:也就是函數名前面的這個int類型,函數名也就是這個add,形參類型也就是括弧裡面的a、b之前的int類型,形參名也就是a和b
總之函數是這樣定義的:
[作用范圍](public、private等) [返回值類型](基本數據類型,int、char等) [函數名](【參數類型】 【參數名】,......){
[函數體]

return [返回值]

}
還是不懂的話我就用你這個函數來說明嫌檔:
現在你這個add函數已經定義好了,我在某一個地方調用它
printf("%d",add(1,2));
列印結果轎昌是芹帆亂3;所以你不必要糾結這個概念上的東西,只要你能用出來就行了

⑥ C語言中什麼是形參,什麼是實參

形參:全稱為「形式參數」是在定義函數名和函數體的時候使用的參數,目的是用來接收調用該函數時傳遞的參數。

形參的作用是實現主調函數與被調函數之間的聯系,通常將函數所處理的數據,影響函數功能的因素或者函數處理的結果作為形參。

實參:全稱為"實際參數"是在調用時傳遞給函數的參數,即傳遞給被調用函數的值。

實參可以是常量、變數、表達式、函數等, 無論實參是何種類型的量,在進行函數調用時,它們都必須具有確定的值, 以便把這些值傳送給形參。 因此應預先用賦值,輸入等辦法使實參獲得確定值。

(6)在c語言中函數頭部的形參格式擴展閱讀:

形參和實參的特點:

1、形參變數只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參只在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參變數。

2、實參可以是常量、變數、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定值。

3、實參和形參在數量上,類型上、順序上應嚴格一致,否則就會發生類型不匹配的錯誤。

4、在一般傳值調用的機制中只能把實參傳送給形參,而不能把形參的值反向地傳送給實參。因此在函數調用過程中,形參值發生改變,而實參中的值不會變化。而在引用調用的機制當中是將實參引用的地址傳遞給了形參,所以任何發生在形參上的改變實際上也發生在實參變數上。

參考資料來源:網路-形參

參考資料來源:網路-實參