**引言:**
對于任何程序來講,函數的地位是不言而喻的。下面先給出函數的定義,然后根據定義分析C語言中的函數。
**函數定義:**
**類型**
函數名(形式參數)
**代碼塊**
**函數分析:**
由定義可以看出函數主要包括四部分:函數類型、函數名、函數形參、函數代碼塊。
函數類型:指明了函數返回值的類型,是整數、浮點數、指針甚至是結構體等等。需要注意的兩點:1、如果類型是void,則沒有返回值。如果是void *型的返回值,那可以返回任意類型的指針,這是ANSI C標準定義的,void *可以是任意類型的指針。2、返回值的類型應該與函數定義的類型相同,否則編譯器會對它進行強制類型轉換。
函數名:就是指函數的名稱,注意一點就是函數名可以作為函數的參數進行傳遞,此時函數名是函數的起始地址。這一點在[回調函數](http://blog.csdn.net/to_be_it_1/article/details/25127691)用有應用。
**test.c示例源碼:**
~~~
#include <stdio.h>
void
fun(void)
{}
void main(void)
{
printf("fun addr = %p\n", fun);
return;
}
~~~
**編譯:gcc test.c**
**執行:./a.out**
**結果:fun addr = 0x80483e4**
代碼塊:包含了局部變量的聲明和函數調用時需要執行的語句。
函數形參:C語言中函數的所有參數均以“傳值調用”方式進行傳遞,這就是說函數將獲得參數值的一份拷貝。傳遞數組時其實是傳遞的數組的地址值,類似的有指針、函數名等。對于形參,記住兩個規則:
**1、傳遞給函數的標準參數是傳值調用的。**
**2、傳遞給函數的數組參數在行為上就像它們時通過傳址調用的那樣。**
**函數使用:**
函數定義完成后要想使用,一般會進行函數聲明。函數聲明就是告訴編譯器函數的特定信息(類型、參數等)。有兩種方式告訴編譯器函數的信息:
一 如果同一源文件的前面已經出現了該函數的定義,編譯器就會記住它的參數數量和類型,以及函數的返回值類型。
二 使用函數原型向編譯器提供函數信息。
**使用技巧:**
函數原型必須與函數定義匹配,把函數原型包含在定義函數的文件中可以使編譯器確認它們之間的匹配。
**示例解析:**
~~~
/*File name : main.c*/
#include <stdio.h>
#include "fun.h"
void
main(int argc, char **argv)
{
int a = 1, b = 2;
printf("a + b = %d\n", fun(a, b));
return;
}
~~~
~~~
/*File name : fun.h*/
extern int fun(int, int);
~~~
~~~
/*File name : fun.c*/
#include "fun.h"
int
fun(int num1, int num2)
{
return num1 + num2;
}
~~~
**編譯:gcc main.c fun.c**
**執行:./a.out**
**結果:a + b = 3**
- 前言
- (四)回調函數
- (一)while(1)死循環與for(;;)死循環的區別
- (二)static關鍵字
- (三)函數
- (四)可變參數函數
- (五)setjmp和longjmp
- (六)指針
- (七)回調函數
- (八)字符串
- (九)動態內存分配
- (十)結構體
- (十一)深入理解指針
- (十二)命令行參數
- (十三)printf、fprintf、sprintf和snprintf函數
- (十四)const關鍵字詳解
- (十五)字符串輸入函數fgets、gets和scanf
- (十六)字符串輸出函數puts、fputs和printf
- (十七)字符/字符串輸出函數fputc、fputs、putc、putchar和puts
- (十八)字符/字符串輸入函數fgetc、fgets、getc、getchar和gets
- (十九)restrict關鍵詞
- (二十)scanf函數詳解
- (二一)內聯函數
- (二二)位操作
- (二三)errno變量
- (二四)內存分配