新聞中心
C語言哪些數據類型可以作為函數參數
我是計算機專業(yè)的,當初學c語言的時候也是好為難,也有一些心得體會
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:國際域名空間、網站空間、營銷軟件、網站建設、懷安網站維護、網站推廣。
語言這種東西會隨著接觸的多就自然全都通了,需要時間,慢慢來,看到你問的這些問題跟我當初好像,感覺你學的支離破散,我建議你要系統(tǒng)的學c語言,
我有一個c語言的教程,txt的,我可以發(fā)給你,看看很有幫助,你問這些問題,即使通了也是不透徹
函數中包含了程序的可執(zhí)行代碼。每個C程序的入口和出口都位于函數main()之中。main()函數可以調用其他函數,這些函數執(zhí)行完畢后程序的控制又返回到main()函數中,main()函數不能被別的函數所調用。通常我們把這些被調用的函數稱為下層(lower-level)函數。函數調用發(fā)生時,立即執(zhí)行被調用的函數,而調用者則進入等待狀態(tài),直到被調用函數執(zhí)行完畢。函數可以有參數和返回值。
程序員一般把函數當作“黑箱”處理,并不關心它內部的實現細節(jié)。當然程序員也可以自己開發(fā)函數庫。
說明一點,函數這一節(jié)很重要,可以說一個程序的優(yōu)劣集中體現在函數上。如果函數使用的恰當,可以讓程序看起來有條理,容易看懂。如果函數使用的亂七八糟,或者是沒有使用函數,程序就會顯得很亂,不僅讓別人無法查看,就連自己也容易暈頭轉向??梢赃@樣說,如果超過100行的程序中沒有使用函數,那么這個程序一定很羅嗦(有些絕對,但也是事實)。
一、函數的定義
一個函數包括函數頭和語句體兩部分。
函數頭由下列三不分組成:
函數返回值類型
函數名
參數表
一個完整的函數應該是這樣的:
函數返回值類型 函數名(參數表)
{
語句體;
}
函數返回值類型可以是前面說到的某個數據類型、或者是某個數據類型的指針、指向結構的指針、指向數組的指針。指針概念到以后再介紹。
函數名在程序中必須是唯一的,它也遵循標識符命名規(guī)則。
參數表可以沒有也可以有多個,在函數調用的時候,實際參數將被拷貝到這些變量中。語句體包括局部變量的聲明和可執(zhí)行代碼。
我們在前面其實已經接觸過函數了,如abs(),sqrt(),我們并不知道它的內部是什么,我們只要會使用它即可。
這一節(jié)主要講解無參數無返回值的函數調用。
C語言復雜函數
看到這樣的表達式估計讓不少人都“不寒而栗”了吧,其實雖然看起來復雜,但是構造這類表達式其實只有一條簡單的規(guī)則:按照使用的方式來聲明。
右左法則: 首先從圓括號起,然后向右看,然后向左看, 每當遇到圓括號時,就調轉閱讀方向,當括號內的內容解析完畢,就跳出這個括號 ,重復這個過程直到表達式解析完畢。
其實我們發(fā)現,所謂復雜指針離不開指針函數,函數指針,指針數組,函數指針這四個概念并且括號,*比較多,其實只要我們仔細分析這些看起來復雜的表達式,其實他的邏輯也是很清晰的。
使用右左法則解析復雜的表達式:
首先要找到未定義的標識符pfun,當往右看的時候遇到括號,于是調轉方向,再朝相反的方向看,
1 pfun遇到了 * ,說明pfun是一個指針
2 遇到的是另外一個括號,因此說明指針所指向的是一個函數
3 然后又向相反的方向看,又遇到了 一個 說明該函數的 返回值又是一個指針*
4 說明指針所指向的函數的返回值類型的指針指向的是數組
但是右左法則確實有點麻煩,我們這樣看上面這個表達式:首先 fpun是一個指向函數的函數指針 ,該函數有一個整型指針類型的參數并且 返回值也是一個指針 ,所返回的類型指向的是一個數組,并且這個 數組有10個元素 ,每個 元素是整型指針類型 。
首先找到那個未定義的標識符,就是 func
它的外面有一對圓括號,而且左邊是一個 號,這說明 func是一個指針 * int (int *pInt);
然后跳出這個圓括號,先看右邊,也是一個圓括號,這說明(*func)指針指向的是一個函數
這類函數具有 int 類型的形參 ,返回 值類型是 int *。
func1被一對括號包含,且左邊有一個 號,說明 func是一個指針 * int (int *p, int (*f)(int *))
跳出括號,右邊也有個括號,那么func是一個 指向函數的指針
這個函數具有int* 和int ( )(int*)這樣的形參,返回值為int類型。
再來看一看func的形參 int (*f)(int *) ,類似前面的解釋,f也是一個 函數指針 ,
指向的函數具有int*類型的形參,返回值為int
func2右邊是一個 []運算符 ,說明func是一個具有 5個元素的數組 ,
func的左邊有一個*,說明 func的元素是指針 ,要注意這里的*不是修飾 func的
( func2[5])指針指向 int (int *pInt) 看右邊,也是一對圓括號,數組的 元素是函數類型的指針 *
func3被一個圓括號包含,左邊又有一個 , 那么func3是一個指針 *
忘右看 右邊是一個 []運算符號 說明 func3是一個指向數組的指針
int (* )(int *pInt) 現在往左看,左邊有一個 號 ,說明這個 數組的元素是指針 *
func4指針,只向的類型是 (* (int *pInt)) 函數
函數的形參為 int * 返回值為指針
指針 result 指向的 int (*result)[5] 為數組,數組的類型為int
c語言如何編寫自己的函數
前面弄的那個格式錯亂了!所以重新弄了一遍,這次應該沒問題了!
(1)無參函數的定義一般形式:
類型說明符 函數名()
{
類型說明符
語句
}
例如: void Hello()
{
printf("Hello,world");
}
(2)有參函數的定義一般形式:
類型說明符 函數名(形式參數表)
{
類型說明符
語句
}
例如: int max(int a,int b)
{
if(ab)
return a;
else
return b;
}
其中類型說明符指明了本函數的類型,函數的類型實際上是函數返回值的類型,它們通常是C語言的
基本數據類型.
C語言(復雜類型的指針),解釋下面的聲明語句
1 pf是個函數,它的返回值是個int*,它的參數是一個函數指針,函數指針指向的函數返回值為float型,參數為int型;
2 pf是個函數,它的參數是char*,它的返回值是個數組指針,數組指針指向一個長度為5的整型數組;
3 p是個數組,數組中每個元素都是一個函數指針,函數指針指向的函數返回值為char*,參數為char*,char*;
4 pf是個函數指針,函數指針指向的函數參數是char*,它的返回值是個數組指針,數組指針指向一個長度為3的整型數組;
先來4個~~
~~~~~~繼續(xù)~~~~~
char *(*a[2])(char(*)(int*),char *);
a是一個數組,數組由兩個元素構成,每個元素都是一個函數指針,函數指針指向的函數返回值為char*,指向的函數的參數有兩個,第一個是個函數指針,函數指針指向的函數返回值為char,參數為int*,第二個參數是char*;
int(*(*pf[3])(char*))(char *);
pf是個數組,數組由三個元素構成,每個元素是一個函數指針,函數指針的參數是char*,返回值是一個函數指針,函數指針的參數是char*,返回值是int;
char *(*(*(*(f[2])(char *))[2])(char *,char *);
這個~~括號都不匹配 是不打錯了- _ -!
--------------------------------------------------------------------------------------------------------------
以上為小子一些不成熟的分析,歡迎各位大神拍磚指點^_^.....
-----------------------------覺得我頭像可愛的點贊 ?。?!
C語言復雜指針類型
1. int *p[10]; ?//p是一個數組,他有10個元素,每個元素是指向整型變量的指針
2. int (*p)[10]; //p是一個指針,它指向10個整形元素的數組
3.int * *p; //這是一個指針,它指向另外一個指針,該指針指向整型;
int (* func(void))[10]{ ?//func(void)的返回值類型是int(*)[]
? ? return NULL;
}
int main(void){
? ? int (*p)[10] = func();
? ? return 0;
}
4. int *p(int) 這是一個函數,他的參數是一個整形,返回值是一個指向整型的指針(指針函數)
5.int (*p)(int) 這是一個指針,他指向一個函數,這個函數的返回值是int,參數也是int(函數指針)
int add(int a,intb){
? ? return a+b;
}
int main(void){
? ? int (*p)(int a, int b) = add;
? ? p(2,c);
}
c語言基礎-復雜的函數指針
分析方法:右左法,遇到括號返方向
int (* func)(int * p);
分析: func - 右) - 左 * - func是一個指針,更新當前類型為指針 - 左( - 跳出括號 - 右( - 查表得指針指向函數,func是一個函數指針,()里的為函數參數,更新當前類型為函數 - 左int - 查表得函數返回值類型為int
結論: func是一個函數指針,指向的函數有一個類型為int * 的參數且返回值類型為int.
int (* func)(int * p, int (* f)(int* ));
分析: func - 右) - 左 * - func是指針,更新當前類型為指針 - 左( - 跳出括號 - 右( - func是函數指針,更新當前類型為函數 - 左int - 指向的函數的返回值類型為int
結論: func是一個函數指針,指向的函數返回值類型為int,有2個參數,一個類型為int * ,另一個類型為函數指針,指向的函數返回值類型為int且有一個int * 類型的參數.
int (* func[5])(int * p);
分析: func - 右[ - func為數組,有5個元素,更新當前類型為數組 - 右) - 左* - 數組元素為指針,更新當前類型為指針 - 左( - 跳出括號 - 右( - 數組元素為函數指針,更新當前類型為函數 - 左int - 指向的函數返回值類型為int
結論略~
下面的例子省略方向提示,更新當前類型提示,遇括號轉向,跳出括號以及結論(手懶,剁
int (* (* func)[5])(int * p);
分析: func - * - func是指針 - [ - 指向有5個元素的數組 - * - 數組元素是指針 - ( - 數組元素是函數指針 - int - 指向的函數返回值類型為int
int (* (* func)(int * p))[5];
分析: func - * - func是指針 - ( - func是函數指針 - * - 指向的函數返回值類型為指針 - [ - 返回的指針指向有5個元素的數組 - int - 數組元素類型為int
int func(void) [5];
分析: func - ( - func是函數 - int - 返回值類型為int - [ - 返回值類型為有5個int元素的數組
int func 5 ;
分析: func - [ - func是數組 - ( - 數組元素是函數 - int - 函數返回值類型為int
int (* (* func)[5][6])[7][8];
分析: func - * - func是指針 - [ - func指向有5個元素的數組 - [ - 5元素數組里的每個元素是有6個元素的數組 - * - 6元素數組的每個元素為指針 - [ - 指針指向7元素數組 - [ - 7元素數組的每個元素為8元素數組 - int - 8元素數組元素為int
int (* (* (* func)(int * ))[5])(int * );
分析: func - * - func是指針 - ( - func是函數指針 - * - 函數返回值為指針 - [ - 返回值指向5元素數組 - * - 5元素數組元素為指針 - ( - 指針為函數指針 - int - 函數返回值為int
int (* (* func[7][8][9])(int* ))[5];
分析: func - [ - func是7元素數組 - [ - 7元素數組元素為8元素數組 - [ - 8元素數組元素為9元素數組 - * - 9元素數組元素為指針 - ( - 為函數指針 - * - 函數返回值為指針 - [ - 指針指向5元素數組 - int - 數組元素為int
int (* (* func)(int * p))[5];
分析: func - * - func是指針 - ( - 是函數指針 - * - 函數返回值為指針 - [ - 指針指向5元素數組 - int - 數組元素為int
文章名稱:c語言復雜類型作函數 c語言復雜運算
文章路徑:http://www.dlmjj.cn/article/hppced.html