C語言程序設(shè)計視頻教程-徐紅波-第8章 課件.ppt
《C語言程序設(shè)計視頻教程-徐紅波-第8章 課件.ppt》由會員分享,可在線閱讀,更多相關(guān)《C語言程序設(shè)計視頻教程-徐紅波-第8章 課件.ppt(71頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、C程 序 設(shè) 計講 師 : 徐 紅 波Email: x_h_ 第 8章 函 數(shù)8.1 概 述 一 個 較 大 的 程 序 一 般 應(yīng) 分 為 若 干 個程 序 模 塊 , 每 一 個 模 塊 用 來 實 現(xiàn) 一 個 特定 的 功 能 。 所 有 的 高 級 語 句 中 都 有 子 程序 這 個 概 念 , 用 子 程 序 實 現(xiàn) 模 塊 的 功 能 。在 C語 言 中 , 子 程 序 的 作 用 是 由 函 數(shù) 來 完成 的 。 一 個 C程 序 可 由 一 個 主 函 數(shù) 和 若 干個 其 他 函 數(shù) 構(gòu) 成 。 由 主 函 數(shù) 調(diào) 用 其 他 函數(shù) , 其 他 函 數(shù) 也 可 以 相 互
2、調(diào) 用 。 同 一 個函 數(shù) 可 以 被 一 個 或 多 個 函 數(shù) 調(diào) 用 任 意 多次 。 在 程 序 設(shè) 計 中 , 常 將 一 些 常 用 的 功能 模 塊 編 寫 成 函 數(shù) , 放 在 公 共 函 數(shù) 庫 中供 大 家 選 用 。 程 序 設(shè) 計 人 員 要 善 于 利 用函 數(shù) , 以 減 少 重 復(fù) 編 寫 程 序 段 的 工 作 量 。 例 8.1函 數(shù) 調(diào) 用 的 簡 單 例 子#include void main() void printstar();void print_message();printstar();print_message();printstar();
3、 void printstar() printf(“*n”);void print_message() printf(“How do you do!n”); 說 明 :(1)一 個 C程 序 由 一 個 或 多 個 程 序 模 塊 組 成 , 每 一 個 程 序 模 塊 作為 一 個 源 程 序 文 件 。 對 較 大 的 程 序 , 一 般 不 希 望 把 所 有 內(nèi) 容 全放 在 一 個 文 件 中 , 而 是 將 它 們 放 在 若 干 個 源 文 件 中 , 再 由 若 干個 源 程 序 文 件 組 成 一 個 C程 序 。 一 個 源 程 序 文 件 可 以 為 多 個 C程序 共
4、用 。(2)一 個 源 程 序 文 件 由 一 個 或 多 個 函 數(shù) 以 及 其 他 有 關(guān) 內(nèi) 容 (如 命 令行 、 數(shù) 據(jù) 定 義 等 )組 成 。 一 個 源 程 序 是 一 個 編 譯 單 位 , 在 程 序 編譯 時 是 以 源 程 序 文 件 為 單 位 進(jìn) 行 編 譯 的 , 而 不 是 以 函 數(shù) 為 單 位進(jìn) 行 編 譯 的 。(3)C程 序 的 執(zhí) 行 是 從 main函 數(shù) 開 始 的 , 如 是 在 main函 數(shù) 中 調(diào) 用其 他 函 數(shù) , 在 調(diào) 用 后 流 程 返 回 到 main函 數(shù) , 在 main函 數(shù) 中 結(jié) 束整 個 程 序 的 運(yùn) 行 。(4)
5、所 有 函 數(shù) 都 是 平 行 的 , 即 在 定 義 函 數(shù) 時 是 分 別 進(jìn) 行 的 , 是 相互 獨 立 的 。 一 個 函 數(shù) 并 不 從 屬 于 另 一 個 函 數(shù) , 即 函 數(shù) 不 能 嵌 套定 義 。 函 數(shù) 間 可 以 相 互 調(diào) 用 , 但 不 能 調(diào) 用 main函 數(shù) 。 main函 數(shù)是 系 統(tǒng) 調(diào) 用 的 。 (5)從 用 戶 使 用 的 角 度 看 , 函 數(shù) 有 兩 種 。 標(biāo) 準(zhǔn) 函 數(shù) 。 標(biāo) 準(zhǔn) 函 數(shù) 即 庫 函 數(shù) , 它 是 由 系 統(tǒng) 提 供 的 , 用 戶 不必 自 己 定 義 而 直 接 使 用 它 們 。 用 戶 自 己 定 義 的 函 數(shù)
6、 。 它 是 用 以 解 決 用 戶 專 門 需 要 的 函 數(shù) 。(6)從 函 數(shù) 的 形 式 看 , 函 數(shù) 分 兩 類 。 無 參 函 數(shù) 。 在 調(diào) 用 無 參 函 數(shù) 時 , 主 調(diào) 函 數(shù) 不 向 被 調(diào) 用 函 數(shù) 傳遞 數(shù) 據(jù) 。 無 參 函 數(shù) 一 般 用 來 執(zhí) 行 指 定 的 一 組 操 作 。 無 參 函 數(shù)可 以 帶 回 或 不 帶 會 函 數(shù) 值 , 但 一 般 以 不 帶 回 函 數(shù) 值 的 居 多 。 有 參 函 數(shù) 。 在 調(diào) 用 函 數(shù) 時 , 主 調(diào) 函 數(shù) 在 調(diào) 用 被 調(diào) 用 函 數(shù) 時 ,通 過 參 數(shù) 向 被 調(diào) 用 函 數(shù) 傳 遞 數(shù) 據(jù) ,
7、一 般 情 況 下 , 執(zhí) 行 被 調(diào) 用函 數(shù) 時 會 得 到 一 個 函 數(shù) 值 , 供 主 調(diào) 函 數(shù) 使 用 。 8.2 函 數(shù) 定 義 的 一 般 形 式8.2.1 無 參 函 數(shù) 定 義 的 一 般 形 式定 義 無 參 函 數(shù) 的 一 般 形 式 為 :類 型 標(biāo) 識 符 函 數(shù) 名 () 聲 明 部 分語 句 部 分在 定 義 函 數(shù) 時 要 用 “ 類 型 標(biāo) 識 符 ” 指 定 函 數(shù) 值 的 類 型 , 即 函數(shù) 帶 回 來 的 值 的 類 型 。 8.2.2 有 參 函 數(shù) 定 義 的 一 般 形 式定 義 有 參 函 數(shù) 的 一 般 形 式 為 :類 型 標(biāo) 識 符
8、函 數(shù) 名 (形 式 參 數(shù) 表 列 ) 聲 明 部 分語 句 部 分 例 如 :int max(int x, int y) int z;z = xy ? x : y;return z; 8.2.3 空 函 數(shù)在 程 序 設(shè) 計 中 有 時 會 用 到 空 函 數(shù) , 它 的 形 式 為 :類 型 說 明 符 函 數(shù) 名 () 8.3 函 數(shù) 參 數(shù) 和 函 數(shù) 的 值8.3.1 形 式 參 數(shù) 和 實 際 參 數(shù)在 調(diào) 用 函 數(shù) 時 , 大 多 數(shù) 情 況 下 , 主 調(diào) 函 數(shù) 和 被 調(diào) 用函 數(shù) 之 間 有 數(shù) 據(jù) 傳 遞 關(guān) 系 。 在 定 義 函 數(shù) 時 函 數(shù) 名 后 面 括號
9、 中 的 變 量 名 稱 為 “ 形 式 參 數(shù) ” (簡 稱 “ 形 參 ” ), 在 主調(diào) 函 數(shù) 中 調(diào) 用 一 個 函 數(shù) 時 , 函 數(shù) 名 后 面 括 號 中 的 參 數(shù)(可 以 是 一 個 表 達(dá) 式 )稱 為 “ 實 際 參 數(shù) ” (簡 稱 “ 實 參 ” )。 例 8.2調(diào) 用 函 數(shù) 時 的 數(shù) 據(jù) 傳 遞#include void main() int max(int x, int y);int a, b, c;scanf(“%d,%d”, c=max(a, b);printf(“Max is %d”, c); int max(int x, int y) int z;z
10、 = x y ? x : y;return z; 關(guān) 于 形 參 與 實 參 的 說 明 :(1)在 定 義 函 數(shù) 中 指 定 的 形 參 , 在 未 出 現(xiàn) 函 數(shù) 調(diào) 用 時 , 它 們 并 不占 內(nèi) 存 中 的 存 儲 單 元 。 只 有 在 發(fā) 生 函 數(shù) 調(diào) 用 時 , 函 數(shù) max中 的形 參 才 被 分 配 內(nèi) 存 單 元 。 在 調(diào) 用 結(jié) 束 后 , 形 參 所 占 的 內(nèi) 存 單 元也 被 釋 放 。(2)實 參 可 以 是 常 量 、 變 量 或 表 達(dá) 式 。 但 要 求 它 們 有 確 定 的 值 。在 調(diào) 用 時 將 實 參 的 值 賦 給 形 參 。(3)在
11、被 定 義 的 函 數(shù) 中 , 必 須 指 定 形 參 的 類 型 。(4)實 參 與 形 參 的 類 型 應(yīng) 相 同 或 賦 值 兼 容 。(5)實 參 向 形 參 的 數(shù) 據(jù) 傳 遞 是 “ 值 傳 遞 ” , 單 向 傳 遞 , 只 由 實 參傳 給 形 參 , 而 不 能 由 形 參 傳 回 來 給 實 參 。 在 內(nèi) 存 中 , 實 參 單 元與 形 參 單 元 是 不 同 的 單 元 。 在 調(diào) 用 函 數(shù) 時 , 給 形 參 分 配 存 儲 單元 , 并 將 實 參 對 應(yīng) 的 值 傳 遞 給 形 參 , 調(diào) 用 結(jié) 束 后 , 形 參 單 元 被釋 放 , 實 參 單 元 仍
12、保 留 并 維 持 原 值 。 因 此 , 在 執(zhí) 行 一 個 被 調(diào) 用函 數(shù) 時 , 形 參 的 值 如 果 發(fā) 生 改 變 , 并 不 會 改 變 主 調(diào) 函 數(shù) 的 實 參的 值 。 8.3.2 函 數(shù) 的 返 回 值通 過 函 數(shù) 調(diào) 用 使 主 調(diào) 函 數(shù) 能 得 到 一 個 確 定 的 值 , 這 就 是 函數(shù) 的 返 回 值 。(1)函 數(shù) 的 返 回 值 是 通 過 函 數(shù) 中 的 return語 句 獲 得 的 。 return語 句將 被 調(diào) 用 函 數(shù) 中 的 一 個 確 定 值 帶 回 主 調(diào) 函 數(shù) 中 去 。(2)函 數(shù) 值 的 類 型 。 既 然 函 數(shù) 有 返
13、 回 值 , 這 個 值 當(dāng) 然 應(yīng) 屬 于 某 一個 確 定 的 類 型 , 應(yīng) 當(dāng) 在 定 義 函 數(shù) 時 指 定 函 數(shù) 值 的 類 型 。(3)在 定 義 函 數(shù) 時 指 定 的 函 數(shù) 類 型 一 般 應(yīng) 該 和 return語 句 中 的 表達(dá) 式 類 型 一 致 。 如 果 函 數(shù) 值 的 類 型 和 return語 句 中 表 達(dá) 式 的 值 不一 致 , 則 以 函 數(shù) 類 型 為 準(zhǔn) 。 對 數(shù) 值 型 數(shù) 據(jù) , 可 以 自 動 進(jìn) 行 類 型轉(zhuǎn) 換 。 即 函 數(shù) 類 型 決 定 返 回 值 的 類 型 。 例 8.3返 回 值 類 型 與 函 數(shù) 類 型 不 同#in
14、clude void main() int max(flaot x, float y);float a, b;int c;scanf(“%f,%f”, c=max(a, b);printf(“Max is %dn”, c); int max(float x, float y) float z;z = x y ? x : y;return z; (4)對 于 不 帶 回 值 的 函 數(shù) , 應(yīng) 當(dāng) 用 “ void”定 義 函 數(shù) 為“ 無 類 型 ” (或 稱 “ 空 類 型 ” )。 這 樣 , 系 統(tǒng) 就 保 證 不使 函 數(shù) 帶 回 任 何 值 , 即 禁 止 調(diào) 用 函 數(shù) 中 使 用
15、 被 調(diào) 用 函數(shù) 的 返 回 值 。 此 時 在 函 數(shù) 體 中 不 得 出 現(xiàn) return語 句 。 8.4 函 數(shù) 的 調(diào) 用8.4.1 函 數(shù) 調(diào) 用 的 一 般 形 式函 數(shù) 調(diào) 用 的 一 般 形 式 為函 數(shù) 名 (實 參 表 列 );如 果 是 調(diào) 用 無 參 函 數(shù) , 則 “ 實 參 表 列 ” 可 以 沒 有 ,但 括 號 不 能 省 略 。 如 果 實 參 表 列 包 含 多 個 實 參 , 則 各 參數(shù) 間 用 逗 號 隔 開 。 實 參 與 形 參 的 個 數(shù) 應(yīng) 相 等 , 類 型 應(yīng) 匹配 。 實 參 與 形 參 按 順 序 對 應(yīng) , 一 一 傳 遞 數(shù) 據(jù)
16、 。 但 應(yīng) 說 明 ,如 果 實 參 表 列 包 括 多 個 實 參 , 對 實 參 求 值 的 順 序 并 不 是確 定 的 , 有 的 系 統(tǒng) 按 自 左 至 右 順 序 求 實 參 的 值 , 有 的 系統(tǒng) 則 按 自 右 至 左 順 序 。 例 8.4實 參 求 值 的 順 序#include void main() int f(int a, int b);int i=2, p;p=f(i, +i);printf(“%dn”, p); int f(int a, int b) int c;if(ab) c=1;else if(a=b) c=0; else c=-1;return c;
17、8.4.2 函 數(shù) 調(diào) 用 的 方 式按 函 數(shù) 在 程 序 中 出 現(xiàn) 的 位 置 來 分 , 可 以 有 以 下 3種 函 數(shù) 調(diào) 用方 式 。1. 函 數(shù) 語 句把 函 數(shù) 調(diào) 用 作 為 一 個 語 句 。 這 時 不 要 求 函 數(shù) 帶 回 值 , 只 要求 函 數(shù) 完 成 一 定 的 操 作 。2. 函 數(shù) 表 達(dá) 式函 數(shù) 出 現(xiàn) 在 一 個 表 達(dá) 式 中 , 這 種 表 達(dá) 式 稱 為 函 數(shù) 表 達(dá) 式 。這 時 要 求 函 數(shù) 帶 回 一 個 確 定 的 值 以 參 加 表 達(dá) 式 的 運(yùn) 算 。3. 函 數(shù) 參 數(shù)函 數(shù) 調(diào) 用 作 為 一 個 函 數(shù) 的 實 參 。
18、8.4.3 對 被 調(diào) 用 函 數(shù) 的 聲 明 和 函 數(shù) 原 型在 一 個 函 數(shù) 中 調(diào) 用 另 一 個 函 數(shù) 需 要 具 備 的 條 件 如 下 。(1)首 先 被 調(diào) 用 的 函 數(shù) 必 須 是 已 經(jīng) 存 在 的 函 數(shù) (是 庫 函 數(shù) 或 用 戶 自己 定 義 的 函 數(shù) )。 但 光 有 這 一 條 件 還 不 夠 。(2)如 果 使 用 庫 函 數(shù) , 還 應(yīng) 該 在 本 文 件 開 頭 用 #include命 令 將 調(diào)用 有 關(guān) 庫 函 數(shù) 時 所 需 用 到 的 信 息 “ 包 含 ” 到 本 文 件 中 去 。(3)如 果 使 用 用 戶 自 己 定 義 的 函 數(shù)
19、 , 而 該 函 數(shù) 的 位 置 在 調(diào) 用 它 的函 數(shù) (即 主 調(diào) 函 數(shù) )的 后 面 (在 同 一 個 文 件 中 ), 應(yīng) 該 在 主 調(diào) 函 數(shù) 中對 被 調(diào) 用 的 函 數(shù) 作 聲 明 。 例 8.5對 被 調(diào) 用 的 函 數(shù) 作 聲 明#include void main() float add(float x, float y);float a, b, c;scanf(“%f,%f”, c=add(a, b);printf(“sum is %fn”, c); float add(float x, float y) float z;z=x+y;return z; 在 函 數(shù)
20、調(diào) 用 之 前 用 函 數(shù) 原 型 做 了 函 數(shù) 聲 明 。因 此 編 譯 系 統(tǒng) 記 下 了 所 需 調(diào) 用 的 函 數(shù) 的 有 關(guān) 信 息 。編 譯 系 統(tǒng) 根 據(jù) 函 數(shù) 的 原 型 對 函 數(shù) 的 調(diào) 用 的 合 法 性進(jìn) 行 全 面 的 檢 查 。 與 函 數(shù) 原 型 不 匹 配 的 函 數(shù) 調(diào) 用會 導(dǎo) 致 編 譯 出 錯 , 它 屬 于 語 法 錯 誤 。 用 戶 根 據(jù) 屏幕 顯 示 的 出 錯 信 息 很 容 易 發(fā) 現(xiàn) 和 糾 正 錯 誤 。 函 數(shù) 原 型 的 一 般 形 式 有 兩 種 , 分 別 為(1)函 數(shù) 類 型 函 數(shù) 名 (參 數(shù) 類 型 1, 參 數(shù) 類
21、 型 2, , 參 數(shù) 類 型 n);(2)函 數(shù) 類 型 函 數(shù) 名 (參 數(shù) 類 型 1 參 數(shù) 名 1, 參 數(shù) 類 型 2 參 數(shù) 名 2, , 參 數(shù) 類 型 n 參 數(shù) 名 n); 說 明 :(1)如 果 被 調(diào) 用 函 數(shù) 的 定 義 出 現(xiàn) 在 主 調(diào) 函 數(shù) 之 前 , 可 以不 必 加 以 聲 明 。(2)如 果 已 在 文 件 的 開 頭 (在 所 有 函 數(shù) 之 前 ), 已 對 本 文件 中 所 調(diào) 用 的 函 數(shù) 進(jìn) 行 了 聲 明 , 則 在 各 函 數(shù) 中 不 必 對其 所 調(diào) 用 的 函 數(shù) 再 作 聲 明 。 8.5 函 數(shù) 的 嵌 套 調(diào) 用C語 言 的
22、函 數(shù) 定 義 是 相 互 平 行 、 獨 立 的 。 在 定 義 函數(shù) 時 , 一 個 函 數(shù) 內(nèi) 不 能 包 含 另 一 個 函 數(shù) 。C語 言 不 能 嵌 套 定 義 函 數(shù) , 但 可 以 嵌 套 調(diào) 用 函 數(shù) ,在 調(diào) 用 一 個 函 數(shù) 的 過 程 中 , 又 調(diào) 用 另 一 個 函 數(shù) 。 例 8.6函 數(shù) 嵌 套 調(diào) 用 的 應(yīng) 用 8.6 函 數(shù) 的 遞 歸 調(diào) 用在 調(diào) 用 一 個 函 數(shù) 的 過 程 中 又 出 現(xiàn) 直 接 或 間 接 地 調(diào) 用該 函 數(shù) 本 身 , 稱 為 函 數(shù) 的 遞 歸 調(diào) 用 。 例 8.7有 5個 人 坐 在 一 起 , 問 第 5個 人
23、多 少 歲 ? 他 說 比 第4個 人 大 2歲 。 問 第 4個 人 歲 數(shù) , 他 說 比 第 3個 人 大 2歲 。問 第 3個 人 , 又 說 比 第 2個 人 大 2歲 。 問 第 2個 人 , 說 比 第1個 人 大 2歲 。 最 后 問 第 1個 人 , 他 說 是 10歲 。 請 問 第 5個人 多 大 12)1( 110)( nnage nnage 例 8.8用 遞 歸 方 法 求 n! 1)!1( 1,01! nnn nn 8.9Hanoi塔 問 題 。 古 代 有 一 個 梵 塔 , 塔 內(nèi) 有 3個 座 A、 B、C, 開 始 時 A座 上 有 64個 盤 子 , 盤
24、子 大 小 不 等 , 大 的 在下 , 小 的 在 上 。 有 一 個 老 和 尚 想 把 這 64個 盤 子 從 A座 移到 C座 , 但 每 次 只 允 許 移 動 一 個 盤 , 且 在 移 動 過 程 中 在 3個 座 上 都 始 終 保 持 大 盤 在 下 , 小 盤 在 上 。 在 移 動 過 程 中可 以 利 用 B座 , 要 求 編 程 序 輸 出 移 動 的 步 驟 8.7 數(shù) 組 作 為 函 數(shù) 參 數(shù)前 面 已 經(jīng) 介 紹 了 可 以 用 變 量 作 函 數(shù) 參 數(shù) , 顯 然 , 數(shù)組 元 素 也 可 以 作 函 數(shù) 參 數(shù) , 其 用 法 與 變 量 相 同 。 此
25、 外 ,數(shù) 組 名 也 可 以 作 實 參 和 形 參 , 傳 遞 的 是 數(shù) 組 首 元 素 的 地址 。 8.7.1 數(shù) 組 元 素 作 函 數(shù) 實 參由 于 實 參 可 以 是 表 達(dá) 式 , 而 數(shù) 組 元 素 可 以 是 表 達(dá) 式 的 組 成 部分 , 因 此 數(shù) 組 元 素 當(dāng) 然 可 以 作 為 函 數(shù) 的 實 參 , 與 用 變 量 作 實 參 一樣 , 是 單 向 傳 遞 , 即 “ 值 傳 送 ” 方 式 。例 8.10有 兩 個 數(shù) 組 a和 b, 各 有 10個 元 素 , 將 它 們 對 應(yīng) 地 逐 個比 較 (即 a0與 b0比 , a1與 b1比 )。 如 果
26、a數(shù) 組 中 的 元 素 大于 b數(shù) 組 中 的 相 應(yīng) 元 素 的 數(shù) 目 多 于 b數(shù) 組 中 元 素 大 于 a數(shù) 組 中 相 應(yīng)元 素 的 數(shù) 目 (例 如 , aibi6次 , biai3次 , 其 中 i每 次 為 不 同的 值 ), 則 認(rèn) 為 a數(shù) 組 大 于 b數(shù) 組 , 并 分 別 統(tǒng) 計 出 兩 個 數(shù) 組 相 應(yīng) 元素 大 于 、 等 于 、 小 于 的 次 數(shù) 。 8.7.2 數(shù) 組 名 作 函 數(shù) 參 數(shù)可 以 用 數(shù) 組 名 作 函 數(shù) 參 數(shù) , 此 時 形 參 應(yīng) 當(dāng) 用 數(shù) 組 名或 用 指 針 變 量 。例 8.11有 一 個 一 維 數(shù) 組 score,
27、 內(nèi) 放 10個 學(xué) 生 成 績 ,求 平 均 成 績 說 明 :(1)用 數(shù) 組 名 作 函 數(shù) 參 數(shù) , 應(yīng) 該 在 主 調(diào) 函 數(shù) 和 被 調(diào) 函 數(shù) 分 別 定 義 數(shù)組 。(2)實 參 數(shù) 組 與 形 參 數(shù) 組 類 型 應(yīng) 一 致 , 如 不 一 致 , 結(jié) 果 將 出 錯 。(3)在 被 調(diào) 用 函 數(shù) 中 聲 明 了 形 參 數(shù) 組 的 大 小 為 10, 但 在 實 際 上 , 指定 其 大 小 是 不 起 任 何 作 用 的 , 因 為 C語 言 編 譯 對 形 參 數(shù) 組 大 小 不做 檢 查 , 只 是 將 實 參 數(shù) 組 的 首 元 素 的 地 址 傳 給 形 參
28、數(shù) 組 。 因 此 ,形 參 數(shù) 組 名 獲 得 了 實 參 數(shù) 組 的 首 元 素 的 地 址 。(4)形 參 數(shù) 組 可 以 不 指 定 大 小 , 在 定 義 數(shù) 組 時 在 數(shù) 組 名 后 面 跟 一 個空 的 方 括 號 。 有 時 為 了 在 被 調(diào) 用 函 數(shù) 中 處 理 數(shù) 組 元 素 的 需 要 , 可以 另 設(shè) 一 個 形 參 , 傳 遞 需 要 處 理 的 數(shù) 組 元 素 的 個 數(shù) 。例 8.12形 參 數(shù) 組 不 定 義 長 度 (5)用 數(shù) 組 名 作 函 數(shù) 實 參 時 , 不 是 把 數(shù) 組 元 素 的 值 傳 遞給 形 參 , 而 是 把 實 參 數(shù) 組 的
29、首 元 素 的 地 址 傳 遞 給 形 參數(shù) 組 , 這 樣 兩 個 數(shù) 組 就 共 占 同 一 段 內(nèi) 存 單 元 。 形 參 數(shù)組 中 各 元 素 的 值 如 發(fā) 生 變 化 會 使 實 參 數(shù) 組 元 素 的 值 同時 發(fā) 生 變 化 。 例 8.13用 選 擇 法 對 數(shù) 組 中 10個 整 數(shù) 按 由 小 到 大 排 序 。 所謂 選 擇 法 就 是 先 將 10個 數(shù) 中 最 小 的 數(shù) 與 a0對 換 ; 再 將a1到 a9中 最 小 的 數(shù) 與 a1對 換 每 比 較 一 輪 , 找 出一 個 未 經(jīng) 排 序 的 數(shù) 中 最 小 的 一 個 。 共 比 較 9輪 8.7.3 多
30、 維 數(shù) 組 名 作 函 數(shù) 參 數(shù)多 維 數(shù) 組 元 素 可 以 作 函 數(shù) 參 數(shù) 。用 多 維 數(shù) 組 名 作 為 函 數(shù) 的 實 參 和 形 參 , 在 被 調(diào) 用 函數(shù) 中 對 形 參 數(shù) 組 定 義 時 可 以 指 定 每 一 維 的 大 小 , 也 可 以省 略 第 一 維 的 大 小 說 明 。 但 是 不 能 把 第 二 維 以 及 其 他 高維 的 大 小 說 明 省 略 。 例 8.14有 一 個 3 4矩 陣 , 求 所 有 元 素 最 大 值先 使 變 量 max的 初 值 為 矩 陣 中 第 一 個 元 素 的 值 , 然后 將 矩 陣 中 各 個 元 素 的 值
31、與 max相 比 , 每 次 比 較 后 都 把“ 大 者 ” 存 放 在 max中 , 全 部 元 素 比 較 完 后 , max的 值就 是 所 有 元 素 的 最 大 值 。 8.8 局 部 變 量 和 全 局 變 量8.8.1 局 部 變 量在 一 個 函 數(shù) 內(nèi) 部 定 義 的 變 量 是 內(nèi) 部 變 量 , 它 只 在 本 函 數(shù) 范 圍 內(nèi) 有 效 ,也 就 是 說 只 有 在 本 函 數(shù) 內(nèi) 才 能 使 用 它 們 , 在 此 函 數(shù) 以 外 是 不 能 使 用 這 些 變 量的 。 這 稱 為 “ 局 部 變 量 ” 。 例 如 :float f1(int a) int b,
32、 c; char f2(int x, int y) int i, j; void main() int m, n; 說 明 :(1)主 函 數(shù) 中 定 義 的 變 量 也 只 在 主 函 數(shù) 中 有 效 , 而 不 因為 在 主 函 數(shù) 中 定 義 而 在 整 個 文 件 或 程 序 中 有 效 。 主 函數(shù) 也 不 能 使 用 其 他 函 數(shù) 中 定 義 的 變 量 。(2)不 同 函 數(shù) 中 可 以 使 用 相 同 名 字 的 變 量 , 它 們 代 表 不同 的 對 象 , 互 不 干 擾 。(3)形 式 參 數(shù) 也 是 局 部 變 量 。(4)在 一 個 函 數(shù) 內(nèi) 部 , 可 以 在
33、 復(fù) 合 語 句 中 定 義 變 量 , 這些 變 量 只 在 本 復(fù) 合 語 句 中 有 效 , 這 種 復(fù) 合 語 句 也 稱 為“ 分 程 序 ” 或 “ 程 序 塊 ” 。 8.8.2 全 局 變 量程 序 的 編 譯 單 位 是 源 程 序 文 件 , 一 個 源 文 件 可 以 包含 一 個 或 若 干 個 函 數(shù) 。 在 函 數(shù) 內(nèi) 定 義 的 變 量 是 局 部 變 量 ,而 在 函 數(shù) 之 外 定 義 的 變 量 稱 為 外 部 變 量 , 外 部 變 量 是 全局 變 量 。 全 局 變 量 可 以 為 本 文 件 中 其 他 函 數(shù) 所 共 用 。 它的 有 效 范 圍
34、為 從 定 義 變 量 的 位 置 開 始 到 本 源 文 件 結(jié) 束 。 例 如 :int p=1, q=5;float f1(int a) int b, c;char c1, c2;char f2(int x, int y) int i, j;void main() int m, n; 說 明 :(1)設(shè) 置 全 局 變 量 的 作 用 是 增 加 了 函 數(shù) 間 數(shù) 據(jù) 聯(lián) 系 的 渠 道 。例 8.15有 一 個 一 維 數(shù) 組 , 內(nèi) 放 10個 學(xué) 生 成 績 , 寫 一 個 函 數(shù) , 求出 平 均 分 、 最 高 分 和 最 低 分(2)建 議 不 在 必 要 時 不 要 使
35、用 全 局 變 量 , 原 因 如 下 : 全 局 變 量 在 程 序 的 全 部 執(zhí) 行 過 程 中 都 占 用 存 儲 單 元 , 而 不 是 僅在 需 要 時 才 開 辟 單 元 。 它 使 函 數(shù) 的 通 用 性 降 低 了 , 因 為 函 數(shù) 在 執(zhí) 行 時 要 依 賴 于 其 所 在的 外 部 變 量 。 使 用 全 局 變 量 過 多 , 會 降 低 程 序 的 清 晰 性 , 難 以 清 除 地 判 斷 出每 個 瞬 時 各 個 外 部 變 量 的 值 。(3)如 果 在 同 一 個 源 文 件 中 , 外 部 變 量 與 局 部 變 量 同 名 , 則 在 局 部變 量 的
36、作 用 范 圍 內(nèi) , 外 部 變 量 被 “ 屏 蔽 ” , 即 它 不 起 作 用 。例 8.16外 部 變 量 與 局 部 變 量 同 名 8.9 變 量 的 存 儲 類 別8.9.1 動 態(tài) 存 儲 方 式 與 靜 態(tài) 存 儲 方 式從 變 量 的 作 用 域 (即 從 空 間 )角 度 來 分 , 可 以 分 為 全局 變 量 和 局 部 變 量 。從 變 量 值 存 在 的 時 間 (即 生 存 期 )角 度 來 分 , 可 以 分為 靜 態(tài) 存 儲 方 式 和 動 態(tài) 存 儲 方 式 。所 謂 靜 態(tài) 存 儲 方 式 是 指 在 程 序 運(yùn) 行 期 間 由 系 統(tǒng) 分 配固 定
37、的 存 儲 空 間 的 方 式 。 而 動 態(tài) 存 儲 方 式 則 是 在 程 序 運(yùn)行 期 間 根 據(jù) 需 要 進(jìn) 行 動 態(tài) 的 分 配 存 儲 空 間 的 方 式 。 程 序 的 存 儲 空 間 可 以 分 為 三 部 分 :程 序 區(qū)靜 態(tài) 存 儲 區(qū)動 態(tài) 存 儲 區(qū)數(shù) 據(jù) 分 別 存 放 在 靜 態(tài) 存 儲 區(qū) 和 動 態(tài) 存 儲 區(qū) 中 。全 局 變 量 全 部 存 放 在 靜 態(tài) 存 儲 區(qū) 中 , 在 程 序 開 始執(zhí) 行 時 給 全 局 變 量 分 配 存 儲 區(qū) , 程 序 執(zhí) 行 完 畢 就釋 放 。 在 程 序 執(zhí) 行 過 程 中 它 們 占 據(jù) 固 定 的 存 儲
38、單元 , 而 不 是 動 態(tài) 地 進(jìn) 行 分 配 和 釋 放 。 在 動 態(tài) 存 儲 區(qū) 中 存 放 以 下 數(shù) 據(jù) : 函 數(shù) 形 式 參 數(shù) 。 在 調(diào) 用 函 數(shù) 時 給 形 參 分 配 存 儲 空 間 。 自 動 變 量 (未 加 static聲 明 的 局 部 變 量 ) 函 數(shù) 調(diào) 用 時 的 現(xiàn) 場 保 護(hù) 和 返 回 地 址 等 。對 以 上 這 些 數(shù) 據(jù) , 在 函 數(shù) 調(diào) 用 開 始 時 分 配 動 態(tài) 存 儲 空 間 , 函數(shù) 結(jié) 束 時 釋 放 這 些 空 間 。 在 程 序 執(zhí) 行 過 程 中 , 這 種 分 配 和 釋 放 是動 態(tài) 的 , 如 果 在 一 個 程
39、 序 中 兩 次 調(diào) 用 同 一 函 數(shù) , 分 配 給 此 函 數(shù) 中局 部 變 量 的 存 儲 空 間 地 址 可 能 是 不 同 的 。 如 果 一 個 程 序 包 含 若 干個 函 數(shù) , 每 個 函 數(shù) 中 的 局 部 變 量 的 生 存 期 并 不 等 于 整 個 程 序 的 執(zhí)行 周 期 , 它 只 是 程 序 執(zhí) 行 周 期 的 一 部 分 。 根 據(jù) 函 數(shù) 調(diào) 用 的 需 要 ,動 態(tài) 地 分 配 和 釋 放 存 儲 空 間 。 在 C語 言 中 , 每 一 個 變 量 和 函 數(shù) 有 兩 個 屬 性 : 數(shù) 據(jù)類 型 和 數(shù) 據(jù) 的 存 儲 類 別 。 存 儲 類 別 指
40、 的 是 數(shù) 據(jù) 在 內(nèi) 存中 存 儲 的 方 式 。 存 儲 方 式 分 為 兩 大 類 : 靜 態(tài) 存 儲 類 和動 態(tài) 存 儲 類 。 具 體 包 含 4種 : 自 動 的 (auto)、 靜 態(tài) 的(static)、 寄 存 器 的 (register)、 外 部 的 (extern)。 根 據(jù) 變 量的 存 儲 類 別 , 可 以 知 道 變 量 的 作 用 域 和 生 存 期 。 8.9.2 auto變 量函 數(shù) 中 的 局 部 變 量 , 如 果 不 專 門 聲 明 為 static存 儲 類別 , 都 是 動 態(tài) 地 分 配 存 儲 空 間 的 , 數(shù) 據(jù) 存 儲 在 動 態(tài)
41、存儲 區(qū) 中 。 函 數(shù) 中 的 形 參 和 在 函 數(shù) 中 定 義 的 變 量 (包 括 在復(fù) 合 語 句 中 定 義 的 變 量 ), 都 屬 此 類 , 在 調(diào) 用 該 函 數(shù) 時系 統(tǒng) 會 給 它 們 分 配 存 儲 空 間 , 在 函 數(shù) 調(diào) 用 結(jié) 束 時 就 自動 釋 放 這 些 存 儲 空 間 。 因 此 這 類 局 部 變 量 稱 為 自 動 變量 。 自 動 變 量 用 關(guān) 鍵 字 auto作 存 儲 類 別 的 聲 明 。 例 如 :int f(int a) auto int b, c=3; 8.9.3 用 static聲 明 局 部 變 量有 時 希 望 函 數(shù) 中 的
42、 局 部 變 量 的 值 在 函 數(shù) 調(diào) 用 結(jié) 束 后不 消 失 而 保 留 原 值 , 即 其 占 用 的 存 儲 單 元 不 釋 放 , 在 下一 次 該 函 數(shù) 調(diào) 用 時 , 該 變 量 已 有 值 , 就 是 上 一 次 函 數(shù) 調(diào)用 結(jié) 束 時 的 值 。 這 時 就 應(yīng) 該 指 定 該 局 部 變 量 為 “ 靜 態(tài) 局部 變 量 ” , 用 關(guān) 鍵 字 static進(jìn) 行 聲 明 。 例 8.17考 察 靜 態(tài) 局 部 變 量 的 值#include void main() int f(int);int a=2, i;for(i=0; i3; i+)printf(“%d “,
43、 f(a);int f(int a) auto int b=0;static int c=3;b=b+1;c=c+1;return (a+b+c); 對 靜 態(tài) 局 部 變 量 的 說 明(1)靜 態(tài) 局 部 變 量 屬 于 靜 態(tài) 存 儲 類 別 , 在 靜 態(tài) 存 儲 區(qū) 內(nèi) 分 配 存 儲 單 元 。在 程 序 整 個 運(yùn) 行 期 間 都 不 釋 放 。 而 自 動 變 量 (即 動 態(tài) 局 部 變 量 )屬 于 動態(tài) 存 儲 類 別 , 占 動 態(tài) 存 儲 區(qū) 空 間 而 不 占 靜 態(tài) 存 儲 區(qū) 空 間 , 函 數(shù) 調(diào) 用 結(jié)束 后 即 釋 放 。(2)對 靜 態(tài) 局 部 變 量
44、是 在 編 譯 時 賦 初 值 的 , 即 只 賦 初 值 一 次 , 在 程 序運(yùn) 行 時 它 已 有 初 值 。 以 后 每 次 調(diào) 用 函 數(shù) 時 不 再 重 新 賦 初 值 而 只 是 保 留上 次 函 數(shù) 調(diào) 用 結(jié) 束 時 的 值 。 而 對 自 動 變 量 賦 初 值 , 不 是 在 編 譯 時 進(jìn) 行的 , 而 是 在 函 數(shù) 調(diào) 用 時 進(jìn) 行 , 每 調(diào) 用 一 次 函 數(shù) 重 新 給 一 次 初 值 , 相 當(dāng)于 執(zhí) 行 一 次 賦 值 語 句 。(3)如 在 定 義 局 部 變 量 時 不 賦 初 值 的 話 , 則 對 靜 態(tài) 局 部 變 量 來 說 , 編譯 時 自
45、 動 賦 初 值 0(對 數(shù) 值 型 變 量 )或 空 字 符 (對 字 符 變 量 )。 而 對 自 動 變量 而 說 , 如 果 不 賦 初 值 則 它 的 值 是 一 個 不 確 定 的 值 。 這 是 由 于 每 次 函數(shù) 調(diào) 用 結(jié) 束 后 存 儲 單 元 已 釋 放 , 下 次 調(diào) 用 時 又 重 新 另 分 配 存 儲 單 元 ,而 所 分 配 的 單 元 中 的 值 是 不 確 定 的 。(4)雖 然 靜 態(tài) 局 部 變 量 在 函 數(shù) 調(diào) 用 結(jié) 束 后 仍 然 存 在 , 但 其 他 函 數(shù) 是 不能 引 用 它 的 。 需 要 用 靜 態(tài) 局 部 變 量 的 情 況 如
46、下 。(1)需 要 保 留 函 數(shù) 上 一 次 調(diào) 用 結(jié) 束 時 的 值 。例 8.18輸 出 1到 5的 階 乘 值(2)如 果 初 始 化 后 , 變 量 只 被 引 用 而 不 改 變 其 值 , 則 這 時 用 靜 態(tài) 局部 變 量 比 較 方 便 , 以 免 每 次 調(diào) 用 時 重 新 賦 值 。但 是 應(yīng) 該 看 到 , 用 靜 態(tài) 存 儲 要 多 占 內(nèi) 存 (長 期 占 用 不 釋 放 , 而不 能 像 動 態(tài) 存 儲 那 樣 一 個 存 儲 單 元 可 供 多 個 變 量 使 用 , 節(jié) 約 內(nèi)存 ), 而 且 降 低 了 程 序 的 可 讀 性 , 當(dāng) 調(diào) 用 次 數(shù) 多
47、 時 往 往 弄 不 清 靜態(tài) 局 部 變 量 的 當(dāng) 前 值 是 什 么 。 因 此 , 若 非 必 要 , 不 要 多 用 靜 態(tài) 局部 變 量 。 8.9.4 register變 量一 般 情 況 下 , 變 量 (包 括 靜 態(tài) 存 儲 方 式 和 動 態(tài) 存 儲 方 式 )的值 是 存 放 在 內(nèi) 存 中 的 。 當(dāng) 程 序 中 用 到 哪 一 個 變 量 的 值 時 , 由 控制 器 發(fā) 出 指 令 將 內(nèi) 存 中 該 變 量 的 值 送 到 運(yùn) 算 器 中 。 經(jīng) 過 運(yùn) 算 器進(jìn) 行 運(yùn) 算 , 如 果 需 要 存 數(shù) , 再 從 運(yùn) 算 器 將 數(shù) 據(jù) 送 到 內(nèi) 存 存 放
48、 。如 果 有 一 些 變 量 使 用 頻 繁 (例 如 , 在 一 個 函 數(shù) 中 執(zhí) 行 10000次 循 環(huán) , 每 次 循 環(huán) 中 都 要 引 用 某 局 部 變 量 ), 則 為 存 取 變 量 的 值要 花 費 不 少 時 間 。 為 提 高 執(zhí) 行 效 率 , C語 言 允 許 將 局 部 變 量 的值 放 在 CPU中 的 寄 存 器 中 , 需 要 用 時 直 接 從 寄 存 器 取 出 參 加 運(yùn)算 , 不 必 再 到 內(nèi) 存 中 去 存 取 。 由 于 對 寄 存 器 的 存 取 速 度 遠(yuǎn) 高 于對 內(nèi) 存 的 存 取 速 度 , 因 此 這 樣 做 可 以 提 高 執(zhí)
49、 行 效 率 。 這 種 變 量叫 做 寄 存 器 變 量 , 用 關(guān) 鍵 字 register作 聲 明 。 例 8.19使 用 寄 存 器 變 量#include void main() long fac(long);long i, n;scanf(“%ld”, for(i=1; i=n; i+)printf(“%ld!=%ldn”, i, fac(i); long fac(long n) register long i, f=1;for(i=1; i=n; i+)f=f*i;return f; 說 明 :(1)只 有 局 部 自 動 變 量 和 形 式 參 數(shù) 可 以 作 為 寄 存 器
50、 變 量 , 其 他 (如全 局 變 量 )不 行 , 在 調(diào) 用 一 個 函 數(shù) 時 占 用 一 些 寄 存 器 以 存 放 寄 存器 變 量 的 值 , 函 數(shù) 調(diào) 用 結(jié) 束 釋 放 寄 存 器 。 此 后 , 在 調(diào) 用 另 一 個函 數(shù) 時 又 可 以 利 用 它 來 存 放 該 函 數(shù) 的 寄 存 器 變 量 。(2)一 個 計 算 機(jī) 系 統(tǒng) 中 的 寄 存 器 數(shù) 目 是 有 限 的 , 不 能 定 義 任 意 多個 寄 存 器 變 量 。 不 同 的 系 統(tǒng) 允 許 使 用 的 寄 存 器 數(shù) 目 是 有 限 的 ,而 且 對 register變 量 的 處 理 方 法 也
51、是 不 同 的 , 有 的 系 統(tǒng) 對 register變 量 當(dāng) 作 自 動 變 量 處 理 , 分 配 內(nèi) 存 單 元 , 并 不 真 正 把 它 們 存 放在 寄 存 器 中 , 有 的 系 統(tǒng) 只 允 許 將 int、 char和 指 針 型 變 量 定 義 為寄 存 器 變 量 。(3)局 部 靜 態(tài) 變 量 不 能 定 義 為 寄 存 器 變 量 。 8.9.5 用 extern聲 明 外 部 變 量外 部 變 量 是 在 函 數(shù) 的 外 部 定 義 的 全 局 變 量 , 它 的 作用 域 是 從 變 量 的 定 義 處 開 始 , 到 本 程 序 文 件 的 末 尾 。在 此
52、作 用 域 內(nèi) , 全 局 變 量 可 以 為 程 序 中 各 個 函 數(shù) 所 引用 。 編 譯 時 將 外 部 變 量 分 配 在 靜 態(tài) 存 儲 區(qū) 。有 時 需 要 用 extern來 聲 明 外 部 變 量 , 以 擴(kuò) 展 外 部 變量 的 作 用 域 。 1、 在 一 個 文 件 內(nèi) 聲 明 外 部 變 量如 果 外 部 變 量 不 在 文 件 的 開 頭 定 義 , 其 有 效 的 作 用范 圍 只 限 于 定 義 處 到 文 件 結(jié) 束 。 如 果 在 定 義 點 之 前 的 函數(shù) 想 引 用 該 外 部 變 量 , 則 應(yīng) 該 在 引 用 之 前 用 關(guān) 鍵 字extern對
53、該 變 量 作 “ 外 部 變 量 聲 明 ” , 表 示 該 變 量 是 一個 已 經(jīng) 定 義 的 外 部 變 量 。 有 了 此 聲 明 , 就 可 以 從 “ 聲 明 ”處 起 , 合 法 地 使 用 該 外 部 變 量 。 例 8.20用 extern聲 明 外 部 變 量 , 擴(kuò) 展 它 在 程 序 文件 中 的 作 用 域#include void main() int max(int, int);extern A, B;printf(“%dn”, max(A, B);int A=13, B=-8;int max(int x, int y) int z;z=xy ? x : y;
54、return z; 2、 在 多 文 件 的 程 序 中 聲 明 外 部 變 量如 果 一 個 程 序 包 含 兩 個 文 件 , 在 兩 個 文 件 中 都 要 用到 同 一 個 外 部 變 量 Num, 不 能 分 別 在 兩 個 文 件 中 各 自定 義 一 個 外 部 變 量 Num, 否 則 在 進(jìn) 行 程 序 的 連 接 時 會出 現(xiàn) “ 重 復(fù) 定 義 ” 的 錯 誤 。 正 確 的 做 法 是 : 在 任 一 個文 件 中 定 義 外 部 變 量 Num, 而 在 另 一 個 文 件 中 用 extern對 Num作 “ 外 部 變 量 聲 明 ” 。 即 “ extern N
55、um;”。 在 編譯 和 連 接 時 , 系 統(tǒng) 會 由 此 知 道 Num是 一 個 已 在 別 處 定義 的 外 部 變 量 , 并 將 在 另 一 文 件 中 定 義 的 外 部 變 量 的作 用 域 擴(kuò) 展 到 本 文 件 , 在 本 文 件 中 可 以 合 法 地 引 用 外部 變 量 Num。 例 8.21用 extern將 外 部 變 量 的 作 用 域 擴(kuò) 展 到其 他 文 件#include int A;void main() int power(int);int b=3, c, d, m;printf(“enter the number a and its power m:
56、n”);scanf(“%d, %d”, c=A*b;printf(“%d*%d=%dn”, A, m, d); extern A;int power(int n) int i, y=1;for(i=1; i=n; i+)y*=A;return y; 8.9.6 用 static聲 明 外 部 變 量有 時 在 程 序 設(shè) 計 中 希 望 某 些 外 部 變 量 只 限 于 被 本 文 件 引用 , 而 不 能 被 其 他 文 件 引 用 。 這 時 可 以 在 定 義 外 部 變 量 時 加一 個 static聲 明 。例 如 :file1.c file2.cstatic int A; ext
57、ern int A;void main() void fun(int n) A=A*n; 8.9.7 關(guān) 于 變 量 的 聲 明 和 定 義對 變 量 而 言 , 聲 明 與 定 義 的 關(guān) 系 稍 微 復(fù) 雜 一 些 。 在 聲 明 部分 出 現(xiàn) 的 變 量 有 兩 種 情 況 : 一 種 是 需 要 建 立 存 儲 空 間 的 (如 : int a;), 另 一 種 是 不 需 要 建 立 存 儲 空 間 (如 : extern a;)。 前 者 稱 為“ 定 義 性 聲 明 ” , 或 簡 稱 定 義 。 后 者 稱 為 “ 引 用 性 聲 明 ” 。 廣義 地 說 , 聲 明 包 括
58、定 義 , 但 并 非 所 有 的 聲 明 都 是 定 義 。 對 “ int a;”而 言 , 它 既 是 聲 明 , 又 是 定 義 。 而 對 “ extern a;”而 言 , 它 是聲 明 而 不 是 定 義 。 一 般 為 了 敘 述 方 便 , 把 建 立 存 儲 空 間 的 聲 明稱 定 義 , 而 把 不 需 要 建 立 存 儲 空 間 的 聲 明 稱 為 聲 明 。 顯 然 這 里指 的 聲 明 是 狹 義 的 , 即 非 定 義 性 聲 明 。 例 如 :void main() extern A;int A; 8.9.8 存 儲 類 別 小 結(jié)從 上 可 知 , 對 一
59、個 數(shù) 據(jù) 的 定 義 , 需 要 指 定 兩 種 屬性 : 數(shù) 據(jù) 類 型 和 存 儲 類 別 , 分 別 使 用 兩 個 關(guān) 鍵 字 。例 如 :static int a;auto char c;register int d;此 外 , 可 以 用 extern聲 明 變 量 為 已 定 義 的 外 部 變量 , 例 如 :extern b; 下 面 從 不 同 角 度 做 些 歸 納 :(1)從 作 用 域 角 度 分 , 有 局 部 變 量 和 全 局 變 量 。 它 們 采 用的 存 儲 類 別 如 下 :局 部 變 量 :自 動 變 量 , 即 動 態(tài) 局 部 變 量 (離 開 函
60、 數(shù) , 值 就 消 失 )靜 態(tài) 局 部 變 量 (離 開 函 數(shù) , 值 仍 保 留 )寄 存 器 變 量 (離 開 函 數(shù) , 值 就 消 失 )(形 式 參 數(shù) 可 以 定 義 為 自 動 變 量 和 寄 存 器 變 量 )全 局 變 量 :靜 態(tài) 外 部 變 量 (只 限 本 文 件 引 用 )外 部 變 量 (即 非 靜 態(tài) 的 外 部 變 量 , 允 許 其 他 文 件 引 用 ) (2)從 變 量 存 在 的 時 間 (生 存 期 )來 區(qū) 分 , 有 動 態(tài) 存 儲 和靜 態(tài) 存 儲 兩 種 類 型 。 靜 態(tài) 存 儲 是 程 序 整 個 運(yùn) 行 時 間 都存 在 , 而 動
61、 態(tài) 存 儲 則 是 在 調(diào) 用 函 數(shù) 時 臨 時 分 配 單 元 。動 態(tài) 存 儲 :自 動 變 量 (本 函 數(shù) 內(nèi) 有 效 )寄 存 器 變 量 (本 函 數(shù) 內(nèi) 有 效 )形 式 參 數(shù) (本 函 數(shù) 內(nèi) 有 效 )靜 態(tài) 存 儲 :靜 態(tài) 局 部 變 量 (函 數(shù) 內(nèi) 有 效 )靜 態(tài) 外 部 變 量 (本 文 件 內(nèi) 有 效 )外 部 變 量 (其 他 文 件 可 引 用 ) (3)從 變 量 值 存 放 的 位 置 來 區(qū) 分 , 可 分 為 :內(nèi) 存 中 靜 態(tài) 存 儲 區(qū) :靜 態(tài) 局 部 變 量靜 態(tài) 外 部 變 量 (函 數(shù) 外 部 靜 態(tài) 變 量 )外 部 變 量 (
62、可 為 其 他 文 件 引 用 )內(nèi) 存 中 動 態(tài) 存 儲 區(qū) :自 動 變 量 和 形 式 參 數(shù)CPU中 的 寄 存 器 :寄 存 器 變 量 (4)對 一 個 變 量 的 性 質(zhì) 可 以 從 兩 個 方 面 分 析 , 一 是 變 量 的作 用 域 , 一 是 變 量 值 存 在 時 間 的 長 短 , 即 生 存 期 。 前 者是 從 空 間 的 角 度 , 后 者 是 從 時 間 的 角 度 。 二 者 有 聯(lián) 系 但不 是 同 一 回 事 。(5)static對 局 部 變 量 和 全 局 變 量 的 作 用 不 同 。 對 局 部 變量 來 說 , 它 使 變 量 由 動 態(tài)
63、存 儲 方 式 改 變 為 靜 態(tài) 存 儲 方 式 。而 對 全 局 變 量 來 說 , 它 使 變 量 局 部 化 (局 部 于 本 文 件 ),但 仍 為 靜 態(tài) 存 儲 方 式 。 從 作 用 域 角 度 看 , 凡 有 static聲 明的 , 其 作 用 域 都 是 局 限 的 , 或 者 是 局 限 于 本 函 數(shù) 內(nèi) (靜態(tài) 局 部 變 量 ), 或 者 局 限 于 本 文 件 內(nèi) (靜 態(tài) 外 部 變 量 )。 8.10 內(nèi) 部 函 數(shù) 和 外 部 函 數(shù)函 數(shù) 本 質(zhì) 上 是 全 局 的 , 因 為 一 個 函 數(shù) 要 被 另外 的 函 數(shù) 調(diào) 用 , 但 是 , 也 可 以
64、 指 定 函 數(shù) 不 能 被 其他 文 件 調(diào) 用 。 根 據(jù) 函 數(shù) 能 否 被 其 他 源 文 件 調(diào) 用 ,將 函 數(shù) 區(qū) 分 為 內(nèi) 部 函 數(shù) 和 外 部 函 數(shù) 。 8.10.1 內(nèi) 部 函 數(shù)如 果 一 個 函 數(shù) 只 能 被 本 文 件 中 其 他 函 數(shù) 所 調(diào) 用 , 它稱 為 內(nèi) 部 函 數(shù) 。 在 定 義 內(nèi) 部 函 數(shù) 時 , 在 函 數(shù) 名 和 函 數(shù) 類型 的 前 面 加 static, 即 :static 類 型 標(biāo) 識 符 函 數(shù) 名 (形 參 表 );內(nèi) 部 函 數(shù) 又 稱 靜 態(tài) 函 數(shù) , 因 為 它 是 用 static聲 明 的 。使 用 內(nèi) 部 函
65、 數(shù) , 可 以 使 函 數(shù) 的 作 用 域 只 局 限 于 所 在 文 件 ,在 不 同 的 文 件 中 有 相 同 的 內(nèi) 部 函 數(shù) , 互 補(bǔ) 干 擾 。 這 樣 不同 的 人 可 以 分 別 編 寫 不 同 的 函 數(shù) , 而 不 必 擔(dān) 心 所 用 函 數(shù)是 否 會 與 其 他 文 件 中 函 數(shù) 同 名 。 8.10.2 外 部 函 數(shù)(1)在 定 義 函 數(shù) 時 , 如 果 在 函 數(shù) 首 部 的 最 左 端 加 關(guān) 鍵 字extern, 則 表 示 此 函 數(shù) 是 外 部 函 數(shù) , 可 供 其 他 文 件 調(diào) 用 。(2)在 需 要 引 用 此 函 數(shù) 的 文 件 中 ,
66、用 extern對 函 數(shù) 作 聲明 , 表 示 該 函 數(shù) 是 在 其 他 文 件 中 定 義 的 外 部 函 數(shù) 。例 8.22有 一 個 字 符 串 , 內(nèi) 有 若 干 個 字 符 , 今 輸 入 一 個字 符 , 要 求 程 序 將 字 符 串 中 該 字 符 刪 去 。 用 外 部 函 數(shù)實 現(xiàn) 。 習(xí) 題8.3 寫 一 個 判 素 數(shù) 的 函 數(shù) , 在 主 函 數(shù) 輸 入 一 個 整 數(shù) , 輸出 是 否 素 數(shù) 的 信 息 。8.4 寫 一 個 函 數(shù) , 使 給 定 的 一 個 3 3的 二 維 整 型 數(shù) 組 轉(zhuǎn)置 , 即 行 列 互 換 。8.5 寫 一 個 函 數(shù) , 使 輸 入 的 一 個 字 符 串 按 反 序 存 放 , 在主 函 數(shù) 中 輸 入 和 輸 出 字 符 串 。8.6 寫 一 個 函 數(shù) , 將 兩 個 字 符 串 連 接 。 8.13 用 遞 歸 方 法 求 n階 勒 讓 德 多 項 式 的 值 , 遞 歸 公 式 為 : 1/)(*)1()(*)12( 101)( 21 nnxpnxpxn nx nxp nnn
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 川渝旅游日記成都重慶城市介紹推薦景點美食推薦
- XX國有企業(yè)黨委書記個人述責(zé)述廉報告及2025年重點工作計劃
- 世界濕地日濕地的含義及價值
- 20XX年春節(jié)節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)人到場心到崗
- 大唐女子圖鑒唐朝服飾之美器物之美繪畫之美生活之美
- 節(jié)后開工第一課輕松掌握各要點節(jié)后常見的八大危險
- 廈門城市旅游介紹廈門景點介紹廈門美食展示
- 節(jié)后開工第一課復(fù)工復(fù)產(chǎn)十注意節(jié)后復(fù)工十檢查
- 傳統(tǒng)文化百善孝為先孝道培訓(xùn)
- 深圳城市旅游介紹景點推薦美食探索
- 節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)勿忘安全本心人人講安全個個會應(yīng)急
- 預(yù)防性維修管理
- 常見閥門類型及特點
- 設(shè)備預(yù)防性維修
- 2.乳化液泵工理論考試試題含答案