高級(jí)語言程序設(shè)計(jì) 課件 鄭巖 第5、6章 數(shù)組、函數(shù)_第1頁
高級(jí)語言程序設(shè)計(jì) 課件 鄭巖 第5、6章 數(shù)組、函數(shù)_第2頁
高級(jí)語言程序設(shè)計(jì) 課件 鄭巖 第5、6章 數(shù)組、函數(shù)_第3頁
高級(jí)語言程序設(shè)計(jì) 課件 鄭巖 第5、6章 數(shù)組、函數(shù)_第4頁
高級(jí)語言程序設(shè)計(jì) 課件 鄭巖 第5、6章 數(shù)組、函數(shù)_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第5章數(shù)組5.1一維數(shù)組二維數(shù)組5.2字符數(shù)組和字符串5.3本章內(nèi)容導(dǎo)讀本章主要介紹一維數(shù)組和二維數(shù)組的定義、初始化和數(shù)組元素的引用方法,同時(shí)介紹字符數(shù)組和字符串的處理方法。通過學(xué)習(xí)本章,讀者應(yīng)掌握以下內(nèi)容:掌握一維數(shù)組、二維數(shù)組、字符數(shù)組的定義、初始化和數(shù)組元素的引用方法;掌握字符串的存儲(chǔ)和處理方法;掌握常用的處理字符、字符串的庫函數(shù)的使用方法。數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),處于這種結(jié)構(gòu)中的變量具有相同的性質(zhì),并按一定的順序排列。數(shù)組的定義:

數(shù)據(jù)類型數(shù)組名[數(shù)組長(zhǎng)度];

a[0]0145a[1]a[2]a[3]a[4]a[5]23a數(shù)組元素(下標(biāo)變量)數(shù)組中的每個(gè)分量,用下標(biāo)來表示其所處位置,各分量排列有序且數(shù)據(jù)類型相同。數(shù)組元素的表示:數(shù)組名[下標(biāo)]

數(shù)組名表示數(shù)組存儲(chǔ)區(qū)域的首地址,數(shù)組的首地址也就是第一個(gè)元素的地址,是一個(gè)地址常量,不能向它賦值。例如:a或&a[0]下標(biāo)用來表示該數(shù)組元素在數(shù)組中相對(duì)位置,是整型常量,最小值為0,最大值為數(shù)組長(zhǎng)度-1。例如a[3]中的下標(biāo)35.1一維數(shù)組定義

一維數(shù)組是只有一個(gè)下標(biāo)的數(shù)組,數(shù)組同變量一樣,也必須先定義后使用。例如inta[6];

數(shù)據(jù)類型符數(shù)組名1[長(zhǎng)度1],數(shù)組名2[長(zhǎng)度2],…;說明(1)“數(shù)據(jù)類型符”是指數(shù)組元素的數(shù)據(jù)類型,數(shù)據(jù)類型可以是任何基本類型。(2)數(shù)組名,與變量名一樣,必須遵循標(biāo)識(shí)符命名規(guī)則。(3)數(shù)組長(zhǎng)度是用常量表達(dá)式來表示數(shù)組元素的個(gè)數(shù),它是一個(gè)整型值,其中可以包含常數(shù)和符號(hào)常量,但不能出現(xiàn)變量。(4)數(shù)組名中存放的是一個(gè)地址常量,它代表整個(gè)數(shù)組的首地址。同一數(shù)組中的所有元素,按其下標(biāo)的順序占用一段連續(xù)的存儲(chǔ)單元。(5)數(shù)組元素的下標(biāo),是元素相對(duì)于數(shù)組首地址或起始地址的偏移量,所以從0開始順序編號(hào)。(6)一個(gè)數(shù)組定義語句中可以只定義一個(gè)數(shù)組,也可以定義多個(gè)數(shù)組,還可以同時(shí)定義數(shù)組和變量。

1、一維數(shù)組的定義5.1一維數(shù)組引用形式數(shù)組名[下標(biāo)表達(dá)式]說明(1)“下標(biāo)表達(dá)式”可以是一個(gè)整型常量、整型變量或整型表達(dá)式,取值范圍是0至(元素個(gè)數(shù)-1)。

注意:在運(yùn)行C語言程序時(shí),系統(tǒng)不自動(dòng)檢驗(yàn)數(shù)組元素的下標(biāo)是否越界。因此在編寫程序時(shí),保證數(shù)組下標(biāo)不越界十分重要。(2)一個(gè)數(shù)組元素,實(shí)質(zhì)上是一個(gè)變量,它具有和相同類型單個(gè)變量一樣的屬性,可以進(jìn)行賦值和參與各種運(yùn)算。(3)C語言中,數(shù)組作為一個(gè)整體,不能參加數(shù)據(jù)運(yùn)算,只能對(duì)單個(gè)的元素進(jìn)行處理。2、一維數(shù)組元素的引用5.1一維數(shù)組格式數(shù)據(jù)類型符數(shù)組名[長(zhǎng)度]={初值表},…;說明(1)如果對(duì)數(shù)組的全部元素賦以初值,定義時(shí)可以不指定數(shù)組長(zhǎng)度(系統(tǒng)根據(jù)初值個(gè)數(shù)自動(dòng)確定)。如果被定義數(shù)組的長(zhǎng)度,與初值個(gè)數(shù)不同,則數(shù)組長(zhǎng)度不能省略。(2)“初值表”中的初值個(gè)數(shù),可以少于元素個(gè)數(shù),即允許只給部分元素賦初值。若只對(duì)數(shù)組的前若干個(gè)元素賦初值,則沒有給出初值的元素均有默認(rèn)的初值。對(duì)于數(shù)值型數(shù)組默認(rèn)的初值為0;對(duì)于字符型數(shù)組,默認(rèn)的初值為空字符'\0'(ASCII碼值為0)。3、一維數(shù)組的初始化5.1一維數(shù)組給一維數(shù)組的全部元素賦初值給一維數(shù)組的部分元素賦初值初值的個(gè)數(shù)不能超過一維數(shù)組元素的個(gè)數(shù)給一維數(shù)組的全部元素賦初值時(shí)允許省略數(shù)組長(zhǎng)度的說明注意:①數(shù)組長(zhǎng)度可省略,賦初值時(shí)系統(tǒng)自動(dòng)分配。②花括號(hào)中的常量個(gè)數(shù)小于數(shù)組長(zhǎng)度,相應(yīng)賦值后,其余賦0。③若數(shù)組長(zhǎng)度小于初值個(gè)數(shù),則編譯錯(cuò)誤。

inta[]={0,1,2,3,4,5,6,7,8,9};inta[10]={0,1,2,3,4,5,6,7,8,9};inta[10]={0,1,2,3,4};inta[4]={1,2,3,4,5};【例5-1】利用冒泡排序法對(duì)一維數(shù)組的n個(gè)整數(shù)從小到大排序?;舅枷耄和ㄟ^相鄰兩個(gè)數(shù)之間的比較和交換,使數(shù)值較小的數(shù)據(jù)逐漸從底部移向頂部,數(shù)值較大的數(shù)逐漸從頂部移向底部。就像水底的氣泡一樣逐漸向上冒,故而得名。排序過程:設(shè)有n個(gè)數(shù)據(jù),存放到a[1]到a[n]的n個(gè)數(shù)組元素中。(1)從a[1]到a[n],依次把兩個(gè)相鄰元素兩兩比較,即a[1]與a[2]比,a[2]與a[3]比,…,a[n-1]與a[n]比;(2)每次兩相鄰元素比較后,若前一個(gè)元素值比后一個(gè)元素值大,則交換兩元素值;否則,不交換。(3)重復(fù)上述算法,把a(bǔ)[1]到a[n]中的最大值換到a[n],再把a(bǔ)[1]到a[n-1]中最大值換到a[n-1],……最后把a(bǔ)[1]到a[2]中最大值換到a[2]中,即完成排序。#include<stdio.h>intmain(void){int

i,j,k,n,temp,a[200];

printf("Inputnumbers:\n");

scanf("%d",&n);/*從鍵盤輸入待排序的數(shù)據(jù)個(gè)數(shù)n<200*/for(k=1;k<=n;k++)

scanf("%d",&a[k]);/*利用for循環(huán)依次從鍵盤輸入待排序的數(shù)據(jù)*/for(i=1;i<=n-1;i++)/*外層循環(huán),變量i控制排序總共進(jìn)行n-1輪*/for(j=n;j>=i+1;j--)/*內(nèi)層循環(huán),變量j控制每輪進(jìn)行比較的次數(shù)是n-i*/if(a[j]<a[j-1]){temp=a[j];a[j]=a[j-1];a[j-1]=temp;}/*相鄰兩個(gè)元素比較,若前大后小則交換*/for(k=1;k<=n;k++)

printf("%d",a[k]);/*利用for循環(huán)依次輸出排序結(jié)果*/return0;}【例5-2】利用選擇排序法對(duì)一維數(shù)組的n個(gè)整數(shù)從小到大排序?;舅悸罚涸诿恳惠啽容^中不是每當(dāng)a[i]<a[j]時(shí)就交換,而是用一個(gè)變量k記下其中值較小的元素的下標(biāo)值,在a[i]與a[i+1]到a[n]全部進(jìn)行比較后,只將a[i]與a[i+1]到a[n]中值最小的那個(gè)元素進(jìn)行交換,為此每一輪只需將a[i]與a[k]的值交換即可。#include<stdio.h>intmain(void){

int

i,j,temp,k,n,a[200];

printf("Inputnumbers:\n");

scanf("%d",&n);/*從鍵盤輸入待排序的數(shù)據(jù)個(gè)數(shù)n<200*/for(i=0;i<n;i++)

scanf("%d",&a[i]);/*利用for循環(huán)依次從鍵盤輸入待排序的數(shù)據(jù)*/for(i=0;i<n-1;i++)/*外層循環(huán),變量i控制排序總共進(jìn)行n-1輪*/{k=i;for(j=i+1;j<n;j++)/*內(nèi)層循環(huán),變量j控制每輪進(jìn)行比較的次數(shù)*/if(a[j]<a[k])k=j;/*k記錄每輪比較中的最小數(shù)的下標(biāo)*/if(k!=i){temp=a[i];a[i]=a[k];a[k]=temp;}/*將第i輪的最小數(shù)與a[i]交換*/}

printf("thesortednumbers:\n");for(i=0;i<n;i++)printf("%d",a[i]);/*利用for循環(huán)依次輸出排序結(jié)果*/return0;}定義格式

數(shù)據(jù)類型符數(shù)組名[行長(zhǎng)度][列長(zhǎng)度];例:inta[3][4];

a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]014523a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[0][0]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[1][2]67101189a[0]a[1]a[2]第0行第1行第2行存儲(chǔ)結(jié)構(gòu):以行為主序方式存放。二維數(shù)組長(zhǎng)度=行長(zhǎng)度*列長(zhǎng)度

邏輯結(jié)構(gòu)

第0列第1列第2列第3列5.2二維數(shù)組1、二維數(shù)組的定義引用形式數(shù)組名[行下標(biāo)][列下標(biāo)]

行號(hào)列號(hào)說明(1)“行下標(biāo)”和“列下標(biāo)”可以是整型常量、整型變量、整型表達(dá)式或符號(hào)常量。(2)“行下標(biāo)”和“列下標(biāo)”的值,都應(yīng)在已定義數(shù)組大小的范圍內(nèi)。例如數(shù)組x[3][4],則可用的行下標(biāo)范圍為0~2,列下標(biāo)范圍為0~3。2、二維數(shù)組元素的引用5.2二維數(shù)組直述型:將所有常量寫在一個(gè)花括號(hào)內(nèi),各個(gè)常量之間用逗號(hào)分開,按數(shù)組元素存儲(chǔ)的順序?qū)Ω髟刭x初值。inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};分列型:用花括號(hào)嵌套,即每一組一維數(shù)組的初值數(shù)據(jù)再用一對(duì)花括號(hào)括起。注意:若對(duì)全部元素都賦初值,第一維長(zhǎng)度可省略,但第二維長(zhǎng)度不能省。inta[3][4]={{1},{5},{9}};inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};3、二維數(shù)組的初始化5.2二維數(shù)組【例5-3】輸入一個(gè)3*3的數(shù)組,將其行和列互換。#include<stdio.h>intmain(void){

int

i,j,b[3][3];staticinta[3][3]={{1,2,3},{4,5,6},{7,8,9}};for(i=0;i<=2;i++)for(j=0;j<=2;j++)b[j][i]=a[i][j];for(i=0;i<=2;i++){for(j=0;j<=2;j++)

printf("%d",b[i][j]);

printf("\n");}return0;}47258369【例5-4】求矩陣A與B乘積C。#include<stdio.h>intmain(void){int

i,j,k,m=2,n=3,p=2;staticinta[2][3]={{6,8,7},{3,4,5}};staticintb[3][2]={{1,2},{2,1},{-1,0}};staticintc[2][2]={{0,0},{0,0}};for(i=0;i<m;i++)for(j=0;j<p;j++){c[i][j]=0;for(k=0;k<n;k++)c[i][j]=c[i][j]+a[i][k]*b[k][j];}for(i=0;i<m;i++){for(j=0;j<p;j++)

printf("%d",c[i][j]);

printf("\n");}return0;}1520610一維字符數(shù)組的定義

char數(shù)組名[數(shù)組長(zhǎng)度]={初值表};charc[10];二維字符數(shù)組的定義char數(shù)組名[行長(zhǎng)度][列長(zhǎng)度]={{初值表},{初值表},…,{初值表}};5.3字符數(shù)組和字符串1、字符數(shù)組的定義和初始化用字符常量對(duì)字符數(shù)組進(jìn)行初始化charstr[8]={'p','r','o','g','r','a','m','\0'};charstr[8]={112,114,111,103,114,97,109,0};用字符的ASCII碼值對(duì)字符數(shù)組進(jìn)行初始化用字符串對(duì)字符數(shù)組進(jìn)行初始化charstr[]="program";charstr[]={"program"};

注意:只能在定義時(shí)賦初值,不能在語句中直接將一個(gè)字符串賦給一個(gè)字符數(shù)組,可用strcpy()實(shí)現(xiàn)將一個(gè)字符串賦給另一個(gè)字符數(shù)組。

int

qus[19];qus[]="What'syourname?";1、字符數(shù)組的定義和初始化5.3字符數(shù)組和字符串字符數(shù)組的輸入除了可以通過初始化使字符數(shù)組各元素獲得初值外,也可使用getchar()或scanf()函數(shù)輸入字符。例如charstr[10];

for(i=0;i<10;i++)

scanf("%c",&str[i]);2、字符數(shù)組的輸入和輸出5.3字符數(shù)組和字符串字符數(shù)組的輸出字符數(shù)組的輸出,可以用putchar()或printf()函數(shù)。例如charstr[10]="clanguage";

for(i=0;i<10;i++)printf("%c",str[i]);

printf("\n");

注意:逐個(gè)字符輸入、輸出時(shí)需要給出元素的下標(biāo),而且使用%c格式符。另外,從鍵盤上輸入字符時(shí),無需輸入字符的定界符──單引號(hào);輸出時(shí),系統(tǒng)也不輸出字符的定界符。2、字符數(shù)組的輸入和輸出5.3字符數(shù)組和字符串逐個(gè)字符的輸入和輸出scanf("%c",&ch);printf("%c",ch);ch=getchar();putchar(ch);

3、字符串5.3字符數(shù)組和字符串【例5-5】逐個(gè)字符輸入輸出。#include<stdio.h>intmain(void){inti;charstr[10];for(i=0;i<9;i++)scanf("%c",&str[i]);

str[i]='\0';for(i=0;i<9;i++)printf("%c",str[i]);return0;}123456789123456789str[i]=getchar();putchar(str[i]);字符串的整體輸入和輸出scanf("%s",字符數(shù)組名);注意:輸入時(shí)自動(dòng)加'\0'。printf("%s",字符數(shù)組名);charc[]={"China"};printf("%s",c);輸出:Chinacharc[]={"China"};printf("%s",c[0]);charstr[13];scanf("%s",str);輸入:Howareyou<CR>charstr[13];scanf("%s",&str);charstr1[5],str2[5],str3[5];scanf("%s%s%s",str1,str2,str3);輸入:Howareyou<CR>整行輸入和輸出gets(str);注意:讀入由鍵盤輸入的字符(包括空格),直至換行符為止(換行符不存入)。puts(str);注意:把字符串的內(nèi)容顯示在屏幕上。charstr[]={"China\nBeijing"};puts(str);輸出:ChinaBeijing3、字符串5.3字符數(shù)組和字符串在使用以下字符串處理的庫函數(shù)時(shí)應(yīng)在源程序中包含頭文件“string.h”。字符串輸入函數(shù)gets()調(diào)用格式

gets(字符數(shù)組名)功能:從標(biāo)準(zhǔn)輸入設(shè)備即鍵盤上讀取一個(gè)字符串(可以包含空格,僅以回車換行符作為結(jié)束標(biāo)志),并將其存儲(chǔ)到指定的字符數(shù)組中。說明(1)gets()函數(shù)讀取的字符串的長(zhǎng)度沒有限制,編程者應(yīng)保證字符數(shù)組有足夠大的空間,存放輸入的字符串。(2)gets()函數(shù)和使用%s格式的scanf()函數(shù)都可以從鍵盤輸入字符串,但兩者是有區(qū)別的。對(duì)于scanf()函數(shù),回車換行符和空格符都看成是輸入字符串的結(jié)束標(biāo)志;對(duì)于gets()函數(shù)輸入的字符串中允許包含空格,只有回車換行符才看作是輸入字符串的結(jié)束標(biāo)志。4、字符串處理的常用庫函數(shù)5.3字符數(shù)組和字符串字符串輸出函數(shù)puts()調(diào)用格式puts(字符數(shù)組名)功能:把字符數(shù)組中所存放的字符串,輸出到標(biāo)準(zhǔn)輸出設(shè)備中去,并用'\n'取代字符串的結(jié)束標(biāo)志'\0'。所以用puts()函數(shù)輸出字符串時(shí),不要求另加換行符。說明(1)字符串中允許包含轉(zhuǎn)義字符,輸出時(shí)產(chǎn)生一個(gè)控制操作。(2)puts()函數(shù)和使用%s格式的printf()函數(shù)都可以輸出字符串,但兩者是有區(qū)別的。對(duì)于printf()函數(shù),不輸出字符串結(jié)束標(biāo)志符;對(duì)于puts()函數(shù),字符串結(jié)束標(biāo)志符轉(zhuǎn)換為回車換行符輸出。此外,puts()函數(shù)一次只能輸出一個(gè)字符串,而printf()函數(shù)用來輸出字符串時(shí)一次可以輸出多個(gè)。4、字符串處理的常用庫函數(shù)5.3字符數(shù)組和字符串字符串比函數(shù)strcmp()調(diào)用格式

strcmp(字符串1,字符串2)參數(shù):“字符串1”和“字符串2”可以是字符串常量,也可以是已經(jīng)存放字符串的字符數(shù)組名。功能:比較兩個(gè)字符串的大小。

如果字符串1=字符串2,函數(shù)返回值是0;

如果字符串1<字符串2,函數(shù)返回值是負(fù)整數(shù);

如果字符串1>字符串2,函數(shù)返回值是正整數(shù)。說明(1)如果一個(gè)字符串是另一個(gè)字符串從頭開始的子串,則母串為大。(2)不能使用關(guān)系運(yùn)算符==比較兩個(gè)字符串,只能用strcmp()函數(shù)處理。4、字符串處理的常用庫函數(shù)5.3字符數(shù)組和字符串strcmp(str1,str2);strcmp("China","Korea");strcmp(str1,"Beijing");字符串復(fù)制函數(shù)strcpy()調(diào)用格式

strcpy(字符數(shù)組名,字符串[,整型表達(dá)式])參數(shù):字符數(shù)組”是已經(jīng)定義的字符數(shù)組名;“字符串”可以是字符串常量,也可以是已經(jīng)存放字符串的字符數(shù)組名;“整型表達(dá)式”可以是任何整型表達(dá)式,這一參數(shù)也可以省略。功能:將“字符串”的前“整型表達(dá)式”個(gè)字符組成新的字符串復(fù)制到“字符數(shù)組”中。若省略“整型表達(dá)式”,則將“字符串”完整地復(fù)制到“字符數(shù)組”中,字符數(shù)組的原有內(nèi)容被覆蓋。說明(1)字符數(shù)組必須定義得足夠大,以便容納復(fù)制過來的字符串。復(fù)制時(shí),連同結(jié)束標(biāo)志'0'一起復(fù)制。(2)不能用賦值運(yùn)算符=將一個(gè)字符串直接賦值給一個(gè)字符數(shù)組,只能用strcpy()函數(shù)處理。4、字符串處理的常用庫函數(shù)5.3字符數(shù)組和字符串charstr1[10],str2[]={"China"};strcpy(str1,str2);字符串連接函數(shù)strcat()調(diào)用格式strcat(字符數(shù)組名,字符串)功能:把“字符串”連接到“字符數(shù)組”中字符串的尾端(最后一個(gè)有效字符的后面),組成新的字符串并存儲(chǔ)到“字符數(shù)組”?!白址麛?shù)組”中原來的結(jié)束標(biāo)志,被“字符串”的第一個(gè)字符覆蓋,而“字符串”在操作中未被修改。返回值:字符數(shù)組的首地址。說明(1)由于沒有邊界檢查,編程者要注意“字符數(shù)組”定義得足夠大,以便容納連接后的目標(biāo)字符串;否則會(huì)因長(zhǎng)度不夠而產(chǎn)生問題。(2)連接前兩個(gè)字符串都有結(jié)束標(biāo)志'0',連接后“字符數(shù)組”中存儲(chǔ)的字符串的結(jié)束標(biāo)志'0'被舍棄,只在目標(biāo)串的最后保留一個(gè)'0'。4、字符串處理的常用庫函數(shù)5.3字符數(shù)組和字符串charstr1[30]={"People'sRepublicof"};charstr2[]={"China"};printf("%s",strcat(str1,str2));輸出:People'sRepublicofChina測(cè)字符串長(zhǎng)度函數(shù)strlen()調(diào)用格式strlen(字符串)功能:求字符串(常量或字符數(shù)組)的實(shí)際長(zhǎng)度(不包含結(jié)束標(biāo)志)。字符串大寫字母轉(zhuǎn)換成小寫函數(shù)strlwr()調(diào)用格式strlwr(字符串)功能:將字符串中的大寫字母轉(zhuǎn)換成小寫,其它字符(包括小寫字母和非字母字符)不轉(zhuǎn)換。字符串小寫字母轉(zhuǎn)換成大寫函數(shù)strupr()調(diào)用格式strupr(字符串)功能:將字符串中小寫字母轉(zhuǎn)換成大寫,其它字符(包括大寫字母和非字母字符)不轉(zhuǎn)換。charstr[10]={"China"};printf("%d",strlen(str));輸出:5【例5-6】從鍵盤輸入一個(gè)字符串,回車鍵結(jié)束,并將字符串在屏幕上輸出。#include<stdio.h>intmain(void){

inti;staticcharstr[80];

clrscr();for(i=0;i<80;i++){str[i]=getch();/*逐次給數(shù)組元素str[i]賦值,但不回顯在屏幕上*/

printf("*"); /*以星號(hào)代替輸入字符的個(gè)數(shù)*/if(str[i]=='\x0d')break;/*若輸入回車則終止循環(huán)*/}i=0;while(str[i]!='\x0d')

printf("%c",str[i++]); /*逐次輸出字符數(shù)組的各個(gè)元素*/

printf("\n");

getch(); /*程序暫停*/return0;}

ThankYou!第6章函數(shù)6.1函數(shù)的概念和模塊化程序設(shè)計(jì)函數(shù)聲明6.2函數(shù)的參數(shù)和數(shù)據(jù)傳遞方式6.36.4變量的存儲(chǔ)類型和作用域6.5函數(shù)的嵌套調(diào)用和遞歸調(diào)用6.6常用庫函數(shù)本章內(nèi)容導(dǎo)讀本章主要介紹函數(shù)的定義和調(diào)用方法,函數(shù)之間數(shù)據(jù)傳遞方式以及常用的庫函數(shù),函數(shù)的嵌套調(diào)用和遞歸調(diào)用以及模塊化程序設(shè)計(jì)。通過學(xué)習(xí)本章,讀者應(yīng)掌握以下內(nèi)容:了解模塊化程序設(shè)計(jì)方法;掌握用戶自定義函數(shù)的定義和調(diào)用方法;掌握函數(shù)聲明的作用;掌握函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳遞方式;了解變量生存期和作用域的概念;了解遞歸函數(shù)的概念和一般設(shè)計(jì)方法。函數(shù)是一段相對(duì)獨(dú)立、功能完整的程序。一個(gè)C語言程序是由一個(gè)或多個(gè)函數(shù)組成,每個(gè)函數(shù)分別對(duì)應(yīng)一個(gè)功能模塊。特點(diǎn)(1)一個(gè)C程序由一個(gè)或多個(gè)函數(shù)組成,其中必須有且只能有一個(gè)main函數(shù)(稱為主函數(shù))。(2)C程序的執(zhí)行從主函數(shù)開始,如果在主函數(shù)中調(diào)用其他函數(shù),調(diào)用后返回到主函數(shù),并在主函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。(3)主函數(shù)可以調(diào)用其他函數(shù),但其他函數(shù)不能調(diào)用主函數(shù)。主函數(shù)由操作系統(tǒng)調(diào)用,其他函數(shù)之間可以互相調(diào)用。(4)函數(shù)之間沒有從屬關(guān)系,互相獨(dú)立,不能嵌套定義。1、函數(shù)的概念6.1函數(shù)的概念和模塊化程序設(shè)計(jì)從函數(shù)定義的角度劃分庫函數(shù)(又稱標(biāo)準(zhǔn)庫函數(shù)):由C語言的函數(shù)庫提供,即C語言自身已經(jīng)定義好的函數(shù),在包含相應(yīng)頭文件后用戶可以直接使用;用戶函數(shù)(又稱自定義函數(shù)):是用戶根據(jù)需要自行定義的完成某一特定功能的一段程序。從函數(shù)有無參數(shù)的角度劃分有參函數(shù):定義函數(shù)時(shí)有參數(shù)的稱為有參函數(shù);無參函數(shù):定義函數(shù)時(shí)無參數(shù)的稱為無參函數(shù)。1、函數(shù)的概念6.1函數(shù)的概念和模塊化程序設(shè)計(jì)從函數(shù)有無返回值的角度劃分有返回值函數(shù):調(diào)用后返回一個(gè)值;無返回值函數(shù):調(diào)用后不返回值。從函數(shù)作用范圍的角度劃分C語言允許將一個(gè)源程序分放在不同的程序文件中,采用分塊編譯、連接生成一個(gè)目標(biāo)程序,其中每個(gè)程序文件稱為一個(gè)“編譯單元”。每個(gè)編譯單元可以包含若干個(gè)函數(shù)。外部函數(shù):可以被任何編譯單元調(diào)用的;內(nèi)部函數(shù):只能在本編譯單元中被調(diào)用。1、函數(shù)的概念6.1函數(shù)的概念和模塊化程序設(shè)計(jì)函數(shù)定義的一般形式數(shù)據(jù)類型符函數(shù)名(形式參數(shù)表){數(shù)據(jù)定義語句部分;執(zhí)行語句部分;}函數(shù)首部(函數(shù)頭)函數(shù)體

例:兩個(gè)數(shù)之和的函數(shù)。doubleadd(doublex,doubley){doublez;z=x+y;returnz;}函數(shù)體:{}中的內(nèi)容,包括說明語句和執(zhí)行語句??蘸瘮?shù):函數(shù)體為空的函數(shù),例{},便于擴(kuò)充和細(xì)化程序。說明(1)任何函數(shù)(包括主函數(shù))都是由函數(shù)首部和函數(shù)體兩部分組成。(2)函數(shù)首部末尾不能加分號(hào)。(3)“函數(shù)名”是一個(gè)標(biāo)識(shí)符,在同一個(gè)編譯單元中函數(shù)不能重名。(4)C語言中,所有函數(shù)(包括主函數(shù))都是平行的。一個(gè)函數(shù)的定義,可以放在程序中的任意位置,主函數(shù)之前或之后。但是在一個(gè)函數(shù)的函數(shù)體內(nèi)不能再定義另一個(gè)函數(shù),即不允許函數(shù)的嵌套定義。2、函數(shù)的定義6.1函數(shù)的概念和模塊化程序設(shè)計(jì)

無參函數(shù)定義格式

數(shù)據(jù)類型符或void函數(shù)名(void){數(shù)據(jù)定義語句部分;執(zhí)行語句部分;}

有參函數(shù)定義格式

數(shù)據(jù)類型符或void函數(shù)名(形式參數(shù)表){定義語句部分;執(zhí)行語句部分;}2、函數(shù)的定義6.1函數(shù)的概念和模塊化程序設(shè)計(jì)

無返回值函數(shù)定義格式

void函數(shù)名(形式參數(shù)表或void)

{數(shù)據(jù)定義語句部分;執(zhí)行語句部分;

}

有返回值函數(shù)定義格式數(shù)據(jù)類型符函數(shù)名(形式參數(shù)表或void)

{定義語句部分;執(zhí)行語句部分;}2、函數(shù)的定義6.1函數(shù)的概念和模塊化程序設(shè)計(jì)C程序是通過對(duì)函數(shù)的調(diào)用來執(zhí)行函數(shù)體。被調(diào)函數(shù)應(yīng)該先定義,后調(diào)用。格式

函數(shù)名([實(shí)際參數(shù)表]);調(diào)用方式

(1)以函數(shù)語句的方式

函數(shù)名(實(shí)際參數(shù)表);(2)以函數(shù)表達(dá)式的方式

變量=帶函數(shù)的表達(dá)式;(3)以函數(shù)實(shí)參的方式func1(x,y,z);c=max(a,b);printf("thelargenumberis%f",add(x,y));3、函數(shù)的調(diào)用6.1函數(shù)的概念和模塊化程序設(shè)計(jì)【例6-1】編寫一個(gè)程序求解從m個(gè)元素選n個(gè)元素的組合數(shù)程序。計(jì)算公式:分析:用函數(shù)f(x)求x!;cmn=f(m)/f(n)/f(m-n);longf(x)intx;{longy;for(y=1;x>0;--x)y=y*x;return(y);}#include<stdio.h>intmain(void){int

m,n;longcmn,temp;longf();

printf("Entermandn:");

scanf("%d%d",&m,&n);

cmn=f(m);temp=f(n);

cmn=cmn/temp;

cmn=cmn/f(m-n);

printf("Thecombination:%ld\n",cmn);return0;}Entermandn:43Thecombination:4函數(shù)的形式參數(shù)和實(shí)際參數(shù)形式參數(shù)(簡(jiǎn)稱形參):是在函數(shù)定義中設(shè)置的,用來接收從主調(diào)函數(shù)傳來的對(duì)應(yīng)實(shí)參的數(shù)據(jù)。實(shí)際參數(shù)(簡(jiǎn)稱實(shí)參):是調(diào)用函數(shù)時(shí)的實(shí)際參數(shù),實(shí)參可以是常量、變量或表達(dá)式,也可以是函數(shù)的返回值,無論哪種形式必須有確定的值。注意(1)形參在調(diào)用時(shí)才被分配內(nèi)存空間,調(diào)用結(jié)束后釋放。(2)實(shí)參可以是常量、變量或表達(dá)式,但要求有確定值。(3)實(shí)參在數(shù)量、類型和順序上與形參必須一一對(duì)應(yīng)和匹配。如果參數(shù)的數(shù)量不一致,則會(huì)出現(xiàn)編譯錯(cuò)誤;如果參數(shù)的順序不一致,則傳遞到被調(diào)函數(shù)中的數(shù)據(jù)不合邏輯;如果參數(shù)的類型不一致,則按照形參類型對(duì)實(shí)參進(jìn)行自動(dòng)轉(zhuǎn)換,如果是不能進(jìn)行轉(zhuǎn)換的類型,則出現(xiàn)編譯錯(cuò)誤。(4)實(shí)參向形參的單向傳遞,“值傳遞”,即只由實(shí)參傳給形參,而不能由形參傳回給實(shí)參。3、函數(shù)的調(diào)用6.1函數(shù)的概念和模塊化程序設(shè)計(jì)返回值類型函數(shù)返回值的類型即函數(shù)類型,是指返回給主調(diào)函數(shù)的結(jié)果的類型,應(yīng)根據(jù)具體函數(shù)的功能確定。如果函數(shù)不返回任何值,則函數(shù)返回值類型定義為“void”,稱為“空類型”。有參函數(shù)的返回值,是通過函數(shù)中的return語句獲得。return語句功能:返回調(diào)用函數(shù),并將“返回值表達(dá)式”的值帶給調(diào)用函數(shù)。使用方式(1)無返回值的函數(shù)return;(2)有返回值的函數(shù)return(返回值表達(dá)式);或return返回值表達(dá)式;4、函數(shù)的返回6.1函數(shù)的概念和模塊化程序設(shè)計(jì)說明(1)一個(gè)函數(shù)中可以有多個(gè)return語句

(2)若無return語句,則執(zhí)行到函數(shù)體末尾后,并不是不返回一個(gè)值,而是返回一個(gè)不確定的值。

(3)若無值返回,則函數(shù)應(yīng)定義為void類型。

(4)return語句中表達(dá)式的類型與函數(shù)類型一致。若不一致,以函數(shù)值類型為準(zhǔn)。4、函數(shù)的返回6.1函數(shù)的概念和模塊化程序設(shè)計(jì)(1)暫停執(zhí)行函數(shù)調(diào)用所在的語句,轉(zhuǎn)向執(zhí)行被調(diào)函數(shù)。(2)為函數(shù)的所有形參分配內(nèi)存,再計(jì)算所有實(shí)參的值,依次賦予對(duì)應(yīng)的形參。若是無參函數(shù),則不執(zhí)行這一操作。(3)進(jìn)入函數(shù)體,先執(zhí)行數(shù)據(jù)定義語句部分,為函數(shù)體中定義的變量、數(shù)組等分配內(nèi)存。(4)執(zhí)行函數(shù)體中的執(zhí)行語句部分。如果是無返回值的函數(shù),則執(zhí)行到返回語句;如果返回語句被省略,則執(zhí)行到函數(shù)體的右花括號(hào);如果是有返回值的函數(shù),則執(zhí)行到返回語句時(shí),計(jì)算表達(dá)式的值作為函數(shù)的返回值。(5)收回分配給函數(shù)體中定義的變量、數(shù)組、形參等的內(nèi)存單元。(6)返回到主調(diào)函數(shù)繼續(xù)執(zhí)行。如果函數(shù)調(diào)用的形式是“語句”,則執(zhí)行其后面的語句;如果函數(shù)調(diào)用的形式是“表達(dá)式”,則繼續(xù)執(zhí)行表達(dá)式所在的語句。5、函數(shù)的調(diào)用過程6.1函數(shù)的概念和模塊化程序設(shè)計(jì)C語言中,一個(gè)大的程序由許多源程序文件(又稱程序模塊,通常是一些相關(guān)函數(shù)的集合)組成,而源程序文件由預(yù)編譯和許多函數(shù)組成。C語言程序源文件(程序模塊)結(jié)構(gòu)包含文件,例如#include<stdio.h>宏定義,例如#definePI3.14159條件編譯,例如#if…#else…#endif函數(shù)聲明,例如定義函數(shù)的原型全局變量說明,例如函數(shù)外定義的變量函數(shù)定義源文件包含文件宏定義條件編譯函數(shù)預(yù)說明全局變量說明函數(shù)模塊定義函數(shù)模塊定義……大程序6、模塊化程序設(shè)計(jì)方法6.1函數(shù)的概念和模塊化程序設(shè)計(jì)在調(diào)用函數(shù)之前應(yīng)當(dāng)對(duì)調(diào)用的函數(shù)進(jìn)行聲明,讓編譯程序預(yù)先了解函數(shù)的有關(guān)信息。格式[存儲(chǔ)類型][數(shù)據(jù)類型符]函數(shù)名(形參類型[形參名1][,形參類型[形參名2],…]);說明(1)函數(shù)聲明是一條語句,末尾加分號(hào);而函數(shù)首部不是語句,末尾不加分號(hào)。(2)函數(shù)聲明與函數(shù)定義是不同的。函數(shù)定義是編寫一段程序,除了指定函數(shù)名、返回值類型、形參名、形參類型外,還有函數(shù)體;而函數(shù)聲明只是把函數(shù)名、返回值類型、形參名、形參類型等通知編譯程序,以便在調(diào)用該函數(shù)時(shí)系統(tǒng)據(jù)此對(duì)照檢查,它沒有函數(shù)體。例如,intmax(int

x,inty){……}的函數(shù)原型是intmax(int,int);6.2函數(shù)的聲明若主調(diào)函數(shù)與被調(diào)函數(shù)不在同一編譯單元中,則在定義函數(shù)的編譯單元中必須將該函數(shù)定義為外部函數(shù),同時(shí)在主調(diào)函數(shù)的函數(shù)體中或主調(diào)函數(shù)所在編譯單元的開頭將被調(diào)函數(shù)進(jìn)行聲明:extern數(shù)據(jù)類型符函數(shù)名(形式參數(shù)表);;若主函數(shù)與被調(diào)函數(shù)在同一編譯單元中,則可以不說明其函數(shù)原型。同時(shí)C語言又規(guī)定,若被調(diào)函數(shù)的函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前,則在主調(diào)函數(shù)中可以省略對(duì)被調(diào)函數(shù)的聲明。因?yàn)樵谡{(diào)用之前,編譯程序已經(jīng)知道了被調(diào)函數(shù)的函數(shù)類型、參數(shù)個(gè)數(shù)、類型和順序等信息。除了上述兩種情況,都需要對(duì)被調(diào)函數(shù)進(jìn)行聲明。

6.2函數(shù)的聲明被調(diào)用函數(shù)若為系統(tǒng)函數(shù)(庫函數(shù)):除了少數(shù)庫函數(shù)(如scanf()、printf())外,都要求在本文件開頭用包含命令包含被調(diào)函數(shù)的信息。用戶函數(shù)函數(shù)聲明的幾種形式

數(shù)據(jù)類型符函數(shù)名(形參類型形參名1,形參類型形參名2,……);

數(shù)據(jù)類型符函數(shù)名(形參類型1,形參類型2,……);

數(shù)據(jù)類型符函數(shù)名();intmax(inta,intb);intmax(int,int);intmax();6.2函數(shù)的聲明說明(1)函數(shù)原型告訴編譯程序函數(shù)返回的數(shù)據(jù)類型、函數(shù)所要接收的參數(shù)個(gè)數(shù)、參數(shù)類型和參數(shù)順序,編譯程序利用函數(shù)原型校驗(yàn)函數(shù)調(diào)用是否正確。(2)函數(shù)原型中可以只說明形參類型和形參個(gè)數(shù),而無需說明形參名。例如,對(duì)函數(shù)intmax(int

x,inty){……}的聲明以下兩種形式均可:

int

max(int,int);

int

max(int

x,int

y);(3)函數(shù)原型、函數(shù)定義、函數(shù)調(diào)用要保持一致。和函數(shù)原型不匹配的函數(shù)調(diào)用會(huì)導(dǎo)致語法錯(cuò)誤;函數(shù)原型和函數(shù)定義不一致,也會(huì)產(chǎn)生錯(cuò)誤。6.2函數(shù)的聲明說明(4)函數(shù)原型可以在主調(diào)函數(shù)中聲明;也可以在所有函數(shù)的外部(如文件聲明處)進(jìn)行聲明。這種情況下,在該聲明之后定義的所有函數(shù)均可以調(diào)用該函數(shù),而不必再聲明。(5)如果程序中沒有包含函數(shù)原型,則編譯程序會(huì)用第一次出現(xiàn)的該函數(shù)(函數(shù)定義或函數(shù)原型)來構(gòu)造函數(shù)原型。6.2函數(shù)的聲明函數(shù)之間數(shù)據(jù)傳遞方式值傳遞地址傳遞返回值全局變量傳遞前兩種方式是利用定義函數(shù)時(shí)設(shè)置的形參和調(diào)用函數(shù)時(shí)給出的實(shí)參來傳遞數(shù)據(jù)的。

6.3函數(shù)的參數(shù)和數(shù)據(jù)傳遞方式

值傳遞方式是在形參和實(shí)參之間傳遞數(shù)據(jù)的一種方式。傳遞方式傳遞的是參數(shù)值。判斷的唯一方法是看函數(shù)定義時(shí)的形參是不是變量形式如果形參是變量,則是值傳遞方式。1、值傳遞方式6.3函數(shù)的參數(shù)和數(shù)據(jù)傳遞方式數(shù)組作為函數(shù)參數(shù)的兩種形式

數(shù)組元素作為函數(shù)實(shí)參數(shù)組元素只能用作函數(shù)實(shí)參,其用法與普通變量完全相同,即在發(fā)生函數(shù)調(diào)用時(shí),把數(shù)組元素的值傳送給形參,實(shí)現(xiàn)單向值傳送。數(shù)組元素作為實(shí)參時(shí),只要數(shù)組的類型和函數(shù)形參的類型一致即可,并不要求函數(shù)的形參也是下標(biāo)變量。換言之,對(duì)數(shù)組元素的處理是按普通變量對(duì)待的。普通變量或下標(biāo)變量作為函數(shù)參數(shù)時(shí),形參變量和實(shí)參變量由編譯程序分配不同的內(nèi)存單元。在函數(shù)調(diào)用時(shí)進(jìn)行值傳送,把實(shí)參變量的值賦予形參變量。

2、數(shù)組作為函數(shù)參數(shù)的數(shù)據(jù)傳遞方式6.3函數(shù)的參數(shù)和數(shù)據(jù)傳遞方式數(shù)組名作為函數(shù)參數(shù)(形參和實(shí)參)數(shù)組名作函數(shù)參數(shù)時(shí),既可以作形參,也可以作實(shí)參。數(shù)組名作函數(shù)參數(shù)時(shí),要求形參和相對(duì)應(yīng)的實(shí)參都必須是類型相同的數(shù)組(或指向數(shù)組的指針變量),都必須有明確的數(shù)組說明。如果形參是數(shù)組名,則傳遞方式稱為“地址傳遞方式”

2、數(shù)組作為函數(shù)參數(shù)的數(shù)據(jù)傳遞方式6.3函數(shù)的參數(shù)和數(shù)據(jù)傳遞方式當(dāng)一維數(shù)組名做形參時(shí)可以指定數(shù)組的長(zhǎng)度,也可以不指定數(shù)組的長(zhǎng)度,而只在數(shù)組名后面跟一對(duì)空的方括號(hào)。當(dāng)多維數(shù)組名做實(shí)參和形參時(shí),形參數(shù)組可以省略第一維的長(zhǎng)度說明,但第二維及以上的長(zhǎng)度說明不能省略。

不是在形參和實(shí)參之間進(jìn)行數(shù)據(jù)傳遞,而是通過函數(shù)調(diào)用直接返回一個(gè)值到主調(diào)函數(shù)。因此,這種方式通常用于從被調(diào)函數(shù)向主調(diào)函數(shù)回傳值。注意(1)函數(shù)首部中需要有“數(shù)據(jù)類型符”,說明該函數(shù)返回值的數(shù)據(jù)類型。(2)函數(shù)體中需要有語句“return(表達(dá)式);”,其中的表達(dá)式即是函數(shù)的返回值。3、利用返回值的數(shù)據(jù)傳遞方式6.3函數(shù)的參數(shù)和數(shù)據(jù)傳遞方式變量存儲(chǔ)類型自動(dòng)型(auto)寄存器型(register)外部型(extern)靜態(tài)型(static)變量存儲(chǔ)方式靜態(tài)存儲(chǔ)方式在編譯時(shí)由系統(tǒng)分配固定的存儲(chǔ)空間,直到程序運(yùn)行結(jié)束后才釋放所占用的存儲(chǔ)空間。動(dòng)態(tài)存儲(chǔ)方式在程序運(yùn)行時(shí)根據(jù)需要?jiǎng)討B(tài)地分配和釋放存儲(chǔ)空間。自動(dòng)型和寄存型器變量屬于動(dòng)態(tài)存儲(chǔ)方式,外部型和靜態(tài)型變量屬于靜態(tài)存儲(chǔ)方式。1、變量的存儲(chǔ)類型6.4變量的存儲(chǔ)類型和作用域自動(dòng)型變量

定義格式

[auto]數(shù)據(jù)類型變量表;

說明

(1)自動(dòng)變量屬于動(dòng)態(tài)存儲(chǔ)方式。在函數(shù)中定義的自動(dòng)變量,只在該函數(shù)內(nèi)有效;函數(shù)被調(diào)用時(shí)分配存儲(chǔ)空間,調(diào)用結(jié)束就釋放。在復(fù)合語句中定義的自動(dòng)變量,只在該復(fù)合語句中有效;退出復(fù)合語句后,也不能再使用,否則將引起錯(cuò)誤。(2)定義時(shí)如果沒有初始化,則其值是不確定的。如果初始化,則賦初值操作是在調(diào)用時(shí)進(jìn)行的,且每次調(diào)用都要重新賦一次初值。(3)由于自動(dòng)變量的作用域和生存期,都局限于定義它的個(gè)體內(nèi)(函數(shù)或復(fù)合語句),因此不同的個(gè)體中允許使用同名的變量而不會(huì)混淆。即使在函數(shù)內(nèi)定義的自動(dòng)變量,也可與該函數(shù)內(nèi)部的復(fù)合語句中定義的自動(dòng)變量同名。建議:系統(tǒng)不會(huì)混淆,并不意味著人也不會(huì)混淆,所以盡量少用同名自動(dòng)型變量!1、變量的存儲(chǔ)類型6.4變量的存儲(chǔ)類型和作用域靜態(tài)型變量定義格式

static數(shù)據(jù)類型變量表;

說明(1)靜態(tài)內(nèi)部變量屬于靜態(tài)存儲(chǔ)。在程序執(zhí)行過程中,即使所在函數(shù)調(diào)用結(jié)束也不釋放。換言之,在程序執(zhí)行期間,靜態(tài)內(nèi)部變量始終存在,但其它函數(shù)是不能引用它們的。(2)定義但不初始化,則自動(dòng)賦以0(整型和實(shí)型)或‘\0’(字符型);且每次調(diào)用它們所在的函數(shù)時(shí),不再重新賦初值,只是保留上次調(diào)用結(jié)束時(shí)的值。(3)何時(shí)使用靜態(tài)內(nèi)部變量:需要保留函數(shù)上一次調(diào)用結(jié)束時(shí)的值。變量只被引用而不改變其值。1、變量的存儲(chǔ)類型6.4變量的存儲(chǔ)類型和作用域寄存器型變量一般情況下,變量的值都是存儲(chǔ)在內(nèi)存。為提高執(zhí)行效率,C語言允許將局部變量的值存放到寄存器,這種變量稱為寄存器變量。

定義格式register數(shù)據(jù)類型變量表;

說明(1)只有局部變量才能定義為寄存器變量,全局變量不行。(2)對(duì)寄存器變量的實(shí)際處理,隨系統(tǒng)而異。例如,微機(jī)上的MSC和TC將寄存器變量實(shí)際當(dāng)作自動(dòng)變量處理。(3)允許使用的寄存器數(shù)目是有限的,不能定義任意多個(gè)寄存器變量。1、變量的存儲(chǔ)類型6.4變量的存儲(chǔ)類型和作用域外部型變量定義格式

extern數(shù)據(jù)類型外部變量表;

說明:外部型變量是專門用于在多個(gè)編譯單元之間傳遞數(shù)據(jù)的。當(dāng)編譯單元A需要使用在編譯單元B中定義的變量,則編譯單元A需要將該變量聲明為外部型變量,以便C編譯系統(tǒng)在編譯單元A之外的其它編譯單元中尋找該變量的定義,而在編譯單元B中需要定義該變量的存儲(chǔ)類型和數(shù)據(jù)類型。關(guān)鍵字extern與auto、static和register的用法不同,后三個(gè)關(guān)鍵字是在定義變量時(shí)加關(guān)鍵字,而extern是對(duì)已經(jīng)定義的全局變量進(jìn)行聲明。注意:函數(shù)內(nèi)的extern變量說明,表示引用本源文件中的外部變量;函數(shù)外(通常在文件開頭)的extern變量說明,表示引用其它文件中的外部變量。1、變量的存儲(chǔ)類型6.4變量的存儲(chǔ)類型和作用域變量的生存期從系統(tǒng)為變量分配內(nèi)存單元(或寄存器)開始到系統(tǒng)收回內(nèi)存單元(或寄存器)的期間稱為“變量的生存期”。在變量的生存期以外使用該變量會(huì)導(dǎo)致編譯錯(cuò)誤。變量的作用域C語言中所有的變量都有其作用域。變量說明的位置不同,其作用域也不同。2、變量的生存期和作用域6.4變量的存儲(chǔ)類型和作用域intf1(inta)/*函數(shù)f1*/{

int

b,c;

……} /*a、b、c作用域:僅限于函數(shù)f1()中*/

intf2(intx)/*函數(shù)f2*/{

int

y,z;

……} /*x、y、z作用域:僅限于函數(shù)f2()中*/intmain(void){

int

m,n;

……} /*m、n作用域:僅限于函數(shù)main()中*/說明(1)主函數(shù)中定義的內(nèi)部變量,也只能在主函數(shù)中使用,其它函數(shù)不能使用。同時(shí),主函數(shù)中也不能使用其它函數(shù)中定義的內(nèi)部變量。因?yàn)橹骱瘮?shù)也是一個(gè)函數(shù),與其它函數(shù)是平行關(guān)系。這一點(diǎn)是與其它語言不同的,應(yīng)予以注意。(2)形參變量也是內(nèi)部變量,屬于被調(diào)用函數(shù);實(shí)參變量,則是調(diào)用函數(shù)的內(nèi)部變量。(3)允許在不同的函數(shù)中使用相同的變量名,它們代表不同的對(duì)象,分配不同的單元,互不干擾,也不會(huì)發(fā)生混淆。(4)在復(fù)合語句中也可定義變量,其作用域只在復(fù)合語句范圍內(nèi)。2、變量的生存期和作用域6.4變量的存儲(chǔ)類型和作用域全局變量

定義:生存期覆蓋了定義點(diǎn)到整個(gè)程序結(jié)束的變量。局部變量定義:生存期只覆蓋了某個(gè)函數(shù)(或復(fù)合語句)的變量。對(duì)于局部變量,聲明存儲(chǔ)類型的作用是指定變量的存儲(chǔ)位置(靜態(tài)存儲(chǔ)區(qū)或動(dòng)態(tài)存儲(chǔ)區(qū))和生存期;對(duì)于全局變量,聲明存儲(chǔ)類型的作用是擴(kuò)展或限制變量的作用域。2、變量的生存期和作用域6.4變量的存儲(chǔ)類型和作用域內(nèi)部變量

定義:在一個(gè)函數(shù)(或復(fù)合語句)內(nèi)部定義的變量。作用域:該函數(shù)(或復(fù)合語句)范圍內(nèi)有效,即只在包含變量定義的函數(shù)(或復(fù)合語句)內(nèi)部,才能使用該變量,在此函數(shù)(或復(fù)合語句)之外則不能使用。說明(1)主函數(shù)中定義的內(nèi)部變量,只能在主函數(shù)中使用,其它函數(shù)不能使用。同時(shí),主函數(shù)中也不能使用其它函數(shù)中定義的內(nèi)部變量。因?yàn)橹骱瘮?shù)也是一個(gè)函數(shù),與其它函數(shù)是平行關(guān)系。這一點(diǎn)是與其它高級(jí)語言不同。(2)形參變量也是內(nèi)部變量,僅限于函數(shù)內(nèi)使用。(3)允許在不同函數(shù)中使用重名的變量,它們代表不同的對(duì)象,分配不同的內(nèi)存單元,互不干擾,也不會(huì)發(fā)生混淆。2、變量的生存期和作用域6.4變量的存儲(chǔ)類型和作用域說明(4)復(fù)合語句中也可定義變量,所定義的變量是內(nèi)部變量,其作用域只在該復(fù)合語句范圍內(nèi)。例如,

if(i>j) {

int

k; k=i;i=j;j=k;k有效 }

2、變量的生存期和作用域6.4變量的存儲(chǔ)類型和作用域外部變量定義:在函數(shù)外部定義的變量。作用域:從定義位置開始到本文件結(jié)束為止。它不屬于任何一個(gè)函數(shù),可被作用域內(nèi)的所有函數(shù)直接引用。說明(1)外部變量可以加強(qiáng)函數(shù)模塊之間的數(shù)據(jù)聯(lián)系,但又使這些函數(shù)依賴這些外部變量,因而使得這些函數(shù)的獨(dú)立性降低。從模塊化程序設(shè)計(jì)的觀點(diǎn)來看這是不利的,因此不是非用不可時(shí),不建議使用外部變量。(2)在同一源程序文件中,允許外部變量和內(nèi)部變量重名。如果外部變量和內(nèi)部變量重名,則在內(nèi)部變量的作用域內(nèi),外部變量將被屏蔽而不起作用。2、變量的生存期和作用域6.4變量的存儲(chǔ)類型和作用域說明(3)外部變量的作用域是從定義點(diǎn)到本文件結(jié)束。如果定義點(diǎn)之前的函數(shù)需要使用這些外部變量時(shí),需要在函數(shù)內(nèi)對(duì)被使用的外部變量進(jìn)行說明。外部變量說明的一般形式為:extern數(shù)據(jù)類型外部變量1[,外部變量2……];注意:外部變量的定義和外部變量的說明不同。外部變量的定義,必須在所有的函數(shù)之外,且只能定義一次。而外部變量的說明,出現(xiàn)在需要使用該全局變量的函數(shù)內(nèi),而且可以出現(xiàn)多次。2、變量的生存期和作用域6.4變量的存儲(chǔ)類型和作用域靜態(tài)局部變量和靜態(tài)外部變量同屬靜態(tài)存儲(chǔ)方式,區(qū)別在于:(1)定義的位置不同。靜態(tài)局部變量在函數(shù)內(nèi)定義,靜態(tài)外部變量在函數(shù)外定義。(2)作用域不同。靜態(tài)局部變量屬于內(nèi)部變量,其作用域僅限于定義它的函數(shù)內(nèi);雖然生存期為整個(gè)源程序,但其它函數(shù)是不能使用它的。靜態(tài)外部變量在函數(shù)外定義,其作用域?yàn)槎x它的源文件內(nèi);生存期為整個(gè)源程序,但其它源文件中的函數(shù)也是不能使用它的。(3)初始化處理不同。靜態(tài)局部變量,僅在第1次調(diào)用它所在的函數(shù)時(shí)被初始化,當(dāng)再次調(diào)用定義它的函數(shù)時(shí),不再初始化,而是保留上1次調(diào)用結(jié)束時(shí)的值。而靜態(tài)外部變量是在函數(shù)外定義的,不存在靜態(tài)內(nèi)部變量的“重復(fù)”初始化問題,其當(dāng)前值由最近1次給它賦值的操作決定。

2、變量的生存期和作用域6.4變量的存儲(chǔ)類型和作用域務(wù)必牢記:把局部變量改變?yōu)殪o態(tài)內(nèi)部變量后,改變了它的存儲(chǔ)方式,即改變了它的生存期。把外部變量改變?yōu)殪o態(tài)外部變量后,改變了它的作用域,限制了它的使用范圍。因此,關(guān)鍵字“static”在不同的地方所起的作用是不同的。2、變量的生存期和作用域6.4變量的存儲(chǔ)類型和作用域不是在形參和實(shí)參之間傳遞數(shù)據(jù),而是利用在主調(diào)函數(shù)和被調(diào)函數(shù)中都有效的全局變量,在主調(diào)函數(shù)和被調(diào)函數(shù)之間共享數(shù)據(jù)。如前所述,全局變量是生存期覆蓋了定義點(diǎn)到整個(gè)程序結(jié)束的變量。具體地,全局變量有兩種,一是在任何函數(shù)之外定義的全局變量,其作用域覆蓋了定義點(diǎn)到整個(gè)程序結(jié)束之間的所有函數(shù),這種全局變量叫做“外部變量”;二是在函數(shù)體內(nèi)部定義為static型的變量,該變量在從函數(shù)返回后,仍保留所分配的內(nèi)存(活著),但是不能使用,其作用域仍是該函數(shù)體內(nèi)。這種全局變量叫做“內(nèi)部變量”。因此,在函數(shù)之間利用全局變量傳遞數(shù)據(jù),只能使用“外部變量”。3、利用全局變量的數(shù)據(jù)傳遞方式6.4變量的存儲(chǔ)類型和作用域遞歸函數(shù):又稱自調(diào)用函數(shù),簡(jiǎn)潔但不一定高效。三個(gè)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論