思考如何去學習一章新的知識呢?????
- 這章主要講的是什么呢?
1.數(shù)據(jù)如何傳給函數(shù)
2.函數(shù)如何返回結果
3.如何定義自己的函數(shù)
4.函數(shù)原型的概念和使用場合
5.函數(shù)使用指針參數(shù)的優(yōu)勢
將程序分成適度的自包含單元是開發(fā)任一程序的基本方式
8.1 程序的結構
8.1.1 變量的作用域和生存期
- 變量在一個塊內聲明時創(chuàng)建,在這個塊結束時銷毀,這種變量稱為自動變量
- 給定變量可以在某個程序代碼塊中訪問和引用,這個程序代碼塊稱為變量的作用域
- 變量存在的時間稱為變量的生存期
8.1.2 變量的作用域和函數(shù)
8.2 函數(shù)
8.2.1 定義函數(shù)
函數(shù)頭定義了函數(shù)的名稱、函數(shù)的參數(shù)、函數(shù)返回值的類型
函數(shù)的一般形式如下所示:
Return_type Function_name(Parameters-separated by commas ) 參數(shù)用逗號分開
{
//statements.....
}
術語“變元”表示調用函數(shù)時提供的對應于參數(shù)的值
調用函數(shù)的一般形式:
Function_name(List of Arguments - separated by commas) 以逗號分隔的參數(shù)列表
1函數(shù)的命名
- 在函數(shù)名稱中用下劃線字符分開每個單詞
- 將每個單詞的第一個字母大寫
- 將除第一個單詞之外的每個單詞的第一個字母大寫
2 函數(shù)的參數(shù)
出現(xiàn)問題的時候怎么解決問題
| 函數(shù)頭 | 說明 |
|---|---|
| bool SendMessage(char*text) | 該函數(shù)有一個參數(shù)text,其類型是char指針類型,該函數(shù)返回一個bool類型的值。 |
| void PrintData(int count, double *data) | 該函數(shù)有兩個參數(shù),一個是int類型的,另一個是double指針類型,該函數(shù)沒有返回值 |
| int SumIt(int x[], size_t n) | 該函數(shù)的第一個參數(shù)是一個int []類型的數(shù)組,第二個參數(shù)把數(shù)組的元素指定為一個size_t類型的值。該函數(shù)返回一個int 類型的值。 |
| char message GetMessage(void) | 這個函數(shù)沒有參數(shù),返回一個char*類型的指針 |
- 函數(shù)的參數(shù)是一列變量名稱和它們的類型,參數(shù)之間以逗號分隔。
參數(shù)提供了調用函數(shù)給被調用函數(shù)傳遞信息的方法。
調用函數(shù)是給它們指定的值稱為“變元”
3 指定返回值的類型
- 常見函數(shù)的形式如下:
Return_type Function_name(List of Paramters - separated by commas)
{
//statements.....
}
返回值可以指定為c語言中任意合法的類型: 枚舉類型和指針。
希望能返回一個能靈活返回指向各種類型的地址時,可以使用void*的返回類型:即指向void的指針,返回值是一個地址值,但沒有指定返回類型。
8.2.2 Return 語句
- return 語句最簡潔的形式是:返回類型聲明為void的函數(shù),它不返回任何值。
return ;
2.較常見的return 語句形式是:返回類型沒有聲明為void的函數(shù),返回給調用程序的值是計算expression的結果。
return expression
8.3 按值傳遞機制
給函數(shù)傳送變元時,變元值不會直接傳遞給函數(shù),而是先制作變元值得副本,存儲在棧上,再使這個副本可用于函數(shù),而不是使用初始值
這個機制是C語句中的所有的變元值傳遞給函數(shù)的方式,稱為按值傳遞機制
pass - by -value mechanism
8.4 函數(shù)原型
函數(shù)原型是一個定義函數(shù)基本特性的語句,它定義了函數(shù)的名稱、返回值的類型和每個參數(shù)的類型,與函數(shù)頭相比,要在函數(shù)原型的后面加上分號。
函數(shù)聲明也叫函數(shù)原型,因為函數(shù)原型提供了函數(shù)的所有的外部規(guī)范。
在程序中包含頭文件時,這個頭文件會在程序中為庫函數(shù)添加函數(shù)原型。參數(shù)類型double*等價于函數(shù)定義中參數(shù)類型double[]。
函數(shù)是如何定義的呢???
- 最好總是把函數(shù)的聲明放在程序的源文件中。
main()函數(shù)不需要定義函數(shù)原型。
代碼一:
// #include & #define directives ....
int main()
{
//code in main() ...
{
double Average(double x[ ], size_t n)
{
// return sum(x,n)/n;
}
double sum(double x[], size_t n)
{
// statements
}
size_t GetData(double *data, size_t max_count)
{
//statements
}
源文件:
函數(shù)原型:
- 函數(shù)原型放在源文件的開頭處,而且在所有函數(shù)的定義和頭文件之前
在源文件中,函數(shù)原型在所有函數(shù)的外部,函數(shù)的作用是從其聲明處開始一直到源文件的結尾。
代碼二:
//#include &#define directives ....
//funcation prototypes
double Average(double data_values[], size_t count);
double Sum(double *x , size_t n);
size_t GetData(double*, size_t);
int main(void)
{
// Code in main() ...
}
//Definitions for Average( ), sum( ) and GetData( ) ....
8.5 指針用作參數(shù)和返回值
8.5.1 常量參數(shù)
- 將const關鍵字應用于指針參數(shù),指定函數(shù)不修改該變元指向的值
bool SendMessage(const char* pmessage)
{
//code to send the message
return true;
}
參數(shù)pmessage的類型是指向const char 的指針
把const 關鍵字放在開頭,指定被指向數(shù)據(jù)是常量。
指針的指針參數(shù)(參數(shù)是指向指針的指針時),const的一種用途
不能把指針指向const,但可以把(指針指向的指針)指定為const,防止修改指針指向的內容
void sort(const char** str, size_t n)
參數(shù)const char** str是指向const char 的指針的指針類型
第二種const的可能用途是
void replace(char *const * str, size_t n);
參數(shù) char *const * str 是指向char的常量指針的指針
第三種const可能的用途
size_t max_length(const char* const* str , size_t n)
第一個參數(shù)const char* const* str是指向const char的常量指針的指針類型。