C語言程序設(shè)計(jì)-第5章數(shù)組字符串指針ppt課件_第1頁
C語言程序設(shè)計(jì)-第5章數(shù)組字符串指針ppt課件_第2頁
C語言程序設(shè)計(jì)-第5章數(shù)組字符串指針ppt課件_第3頁
C語言程序設(shè)計(jì)-第5章數(shù)組字符串指針ppt課件_第4頁
C語言程序設(shè)計(jì)-第5章數(shù)組字符串指針ppt課件_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第第5章章 數(shù)組、字符串、指針數(shù)組、字符串、指針本章要求:本章要求:1、掌握、掌握C語言數(shù)組在內(nèi)存中的存儲(chǔ)形式語言數(shù)組在內(nèi)存中的存儲(chǔ)形式2、掌握一維數(shù)組和二維數(shù)組的定義及使用、掌握一維數(shù)組和二維數(shù)組的定義及使用3、掌握使用指針處理數(shù)組的方法、掌握使用指針處理數(shù)組的方法4、掌握使用字符數(shù)組及指針處理字符串?dāng)?shù)據(jù)、掌握使用字符數(shù)組及指針處理字符串?dāng)?shù)據(jù)的方法的方法5、掌握與數(shù)組有關(guān)的基本算法如排序、查、掌握與數(shù)組有關(guān)的基本算法如排序、查找、插入、刪除等的程序設(shè)計(jì)找、插入、刪除等的程序設(shè)計(jì) 重點(diǎn):重點(diǎn): 一維數(shù)組、二維數(shù)組的定義與使用一維數(shù)組、二維數(shù)組的定義與使用方法,使用指針訪問數(shù)組和字符串的方法,使

2、用指針訪問數(shù)組和字符串的方法。方法。 難點(diǎn):難點(diǎn): 二維數(shù)組與指針;與數(shù)組有關(guān)的常二維數(shù)組與指針;與數(shù)組有關(guān)的常用算法排序、查找與插入等)。用算法排序、查找與插入等)。5.1 數(shù)組概述數(shù)組概述 例例. 輸入輸入10個(gè)數(shù),求出他們的平均數(shù)。個(gè)數(shù),求出他們的平均數(shù)。main() int n,a,s=0; float ave; for (n=1;nave) printf(“%d”,a1);if (a2ave) printf(“%d”,a2);if (a3ave) printf(“%d”,a3); . /* 實(shí)際程序是不能這樣寫實(shí)際程序是不能這樣寫*/考慮:考慮: 發(fā)現(xiàn):如果不是發(fā)現(xiàn):如果不是10個(gè)數(shù)

3、,而是個(gè)數(shù),而是100,1000,甚至是甚至是10000,此時(shí)按上面方法編寫程序就,此時(shí)按上面方法編寫程序就非常冗長。非常冗長。 如果可以使用循環(huán)來編寫,程序可以簡潔如果可以使用循環(huán)來編寫,程序可以簡潔許多。許多。 要使用循環(huán):必須使用要使用循環(huán):必須使用ai (i=1,210)的形的形式來代表式來代表a1,a2a10 在在C語言中使用語言中使用“數(shù)組來實(shí)現(xiàn)數(shù)組來實(shí)現(xiàn): aia0 a1a9#include void main()int n,i;float s=0, ave, a10; for(i=0;i10;i+) scanf(%f,&ai); s=s+ai; ave=s/10; fo

4、r(i=0;iave) printf(%f ,ai);聲明有聲明有10個(gè)元素個(gè)元素的一維數(shù)組的一維數(shù)組aa0 a1 a9aiaiaiai在程序設(shè)計(jì)中,為了處理方便,在程序設(shè)計(jì)中,為了處理方便, 把具有相把具有相同類型的若干變量按有序的形式組織起來。同類型的若干變量按有序的形式組織起來。這些按序排列的同類數(shù)據(jù)元素的集合稱為這些按序排列的同類數(shù)據(jù)元素的集合稱為數(shù)組。數(shù)組。在語言中,在語言中, 數(shù)組屬于構(gòu)造數(shù)據(jù)類型。數(shù)組屬于構(gòu)造數(shù)據(jù)類型。按類型分為按類型分為: 數(shù)值數(shù)組、數(shù)值數(shù)組、 字符數(shù)組、字符數(shù)組、 指針指針數(shù)組、結(jié)構(gòu)數(shù)組等數(shù)組、結(jié)構(gòu)數(shù)組等按維數(shù)可分為:一維數(shù)組、二維數(shù)組、多按維數(shù)可分為:一維數(shù)

5、組、二維數(shù)組、多維數(shù)組。維數(shù)組。數(shù)組在內(nèi)存中占用一片連續(xù)的存儲(chǔ)單元數(shù)組在內(nèi)存中占用一片連續(xù)的存儲(chǔ)單元5.2 一維數(shù)組一維數(shù)組只有一個(gè)下標(biāo)變量的數(shù)組,稱為一維數(shù)組。只有一個(gè)下標(biāo)變量的數(shù)組,稱為一維數(shù)組。 5.2.1 一維數(shù)組定義一維數(shù)組定義 一般形式為:一般形式為: 類型符類型符 數(shù)組名數(shù)組名 常量表達(dá)式常量表達(dá)式 ; 其中:其中:類型說明符是任一種基本數(shù)據(jù)類型或構(gòu)造數(shù)類型說明符是任一種基本數(shù)據(jù)類型或構(gòu)造數(shù)據(jù)類型,據(jù)類型, 數(shù)組名是用戶定義的標(biāo)識(shí)符;數(shù)組名是用戶定義的標(biāo)識(shí)符; 方括號中的常量表達(dá)式表示數(shù)據(jù)元素的個(gè)數(shù),方括號中的常量表達(dá)式表示數(shù)據(jù)元素的個(gè)數(shù),也稱為數(shù)組的長度。也稱為數(shù)組的長度。 例

6、如:例如: int a10; float b10,c20; char ch20; 數(shù)組在內(nèi)存中占據(jù)一片連續(xù)的存儲(chǔ)空間:數(shù)組在內(nèi)存中占據(jù)一片連續(xù)的存儲(chǔ)空間: 以以 int a5為例,在內(nèi)存中為:為例,在內(nèi)存中為:a0a1a2a3a4相當(dāng)于聲明了相當(dāng)于聲明了5個(gè)整型變量個(gè)整型變量說明:說明:數(shù)組的所有元素的數(shù)據(jù)類型都是相同的。數(shù)組的所有元素的數(shù)據(jù)類型都是相同的。數(shù)組取名規(guī)則應(yīng)符合標(biāo)識(shí)符的規(guī)定,數(shù)組數(shù)組取名規(guī)則應(yīng)符合標(biāo)識(shí)符的規(guī)定,數(shù)組名不能與同一函數(shù)中其它變量名相同:名不能與同一函數(shù)中其它變量名相同: int a; float a10; 是錯(cuò)誤的。是錯(cuò)誤的。C語言中規(guī)定數(shù)組的下標(biāo)從語言中規(guī)定數(shù)組的下

7、標(biāo)從0開始,方括號開始,方括號中常量表達(dá)式表示數(shù)組元素的個(gè)數(shù)。中常量表達(dá)式表示數(shù)組元素的個(gè)數(shù)。不能在方括號中用變量來表示元素的個(gè)數(shù),不能在方括號中用變量來表示元素的個(gè)數(shù), 但是可以是符號常數(shù)或常量表達(dá)式。例如:但是可以是符號常數(shù)或常量表達(dá)式。例如:int n=5,an; 是錯(cuò)誤的。是錯(cuò)誤的。5.2.2 一維數(shù)組的初始化一維數(shù)組的初始化1、數(shù)組聲明時(shí)初始化、數(shù)組聲明時(shí)初始化 在編譯階段進(jìn)行的。這樣將減少運(yùn)行時(shí)間,在編譯階段進(jìn)行的。這樣將減少運(yùn)行時(shí)間,提高效率。提高效率。數(shù)組初始化的一般形式為:數(shù)組初始化的一般形式為:類型符類型符 數(shù)組名數(shù)組名常量表達(dá)式常量表達(dá)式=值值,值值值值;例如:例如: i

8、nt a10= 0,1,2,3,4,5,6,7,8,9 ; 相當(dāng)于相當(dāng)于a0=0; a1=1;. a9=9; 說明:說明:int a10=0,1,2,3,4;int a10=1;static int a3;int a =1,2,3,4,5;int a5=1,2,3,4,5,1 ;給前給前5個(gè)元素賦個(gè)元素賦值,其余賦值,其余賦0值值不能給數(shù)組整體不能給數(shù)組整體賦值,改成賦值,改成1可以省略數(shù)組元可以省略數(shù)組元素個(gè)數(shù)。素個(gè)數(shù)。靜態(tài)存儲(chǔ)類型,靜態(tài)存儲(chǔ)類型,初值為初值為0初值的個(gè)數(shù)不能初值的個(gè)數(shù)不能超過元素個(gè)數(shù)超過元素個(gè)數(shù)2、使用賦值語句初始化、使用賦值語句初始化 用賦值語句初始化是在程序執(zhí)行過程中實(shí)

9、現(xiàn)用賦值語句初始化是在程序執(zhí)行過程中實(shí)現(xiàn)的。例如:的。例如:int a3;a0=5;a1=8;a2=9; 對于數(shù)組的元素用賦值語句初始化,常常使對于數(shù)組的元素用賦值語句初始化,常常使用循環(huán)來完成,例如:用循環(huán)來完成,例如:int k,a10;for(k=0;k10;k+) ak=1; /*對數(shù)組中所有元素賦初值為對數(shù)組中所有元素賦初值為1*/5.2.3 數(shù)組元素的引用數(shù)組元素的引用 數(shù)組元素是組成數(shù)組的基本單元,數(shù)組元素?cái)?shù)組元素是組成數(shù)組的基本單元,數(shù)組元素可以看成一種變量。引用數(shù)組元素有下標(biāo)法和可以看成一種變量。引用數(shù)組元素有下標(biāo)法和指針法。本小節(jié)介紹下標(biāo)法,指針法將在指針法。本小節(jié)介紹下標(biāo)

10、法,指針法將在5.5節(jié)節(jié)中介紹。中介紹。使用下標(biāo)法引用一維數(shù)組元素的一般形式為:使用下標(biāo)法引用一維數(shù)組元素的一般形式為: 數(shù)組名數(shù)組名下標(biāo)下標(biāo) 其中,的下標(biāo)只能為整型常量或整型表達(dá)式。其中,的下標(biāo)只能為整型常量或整型表達(dá)式。若為小數(shù)時(shí),若為小數(shù)時(shí),C編譯將自動(dòng)取整。編譯將自動(dòng)取整。說明:說明:int n=3,a10;an=5; an+1=10;int a10,x,y;a10=5;int a10;printf(%d,a); 正確代碼。引用數(shù)正確代碼。引用數(shù)組元素的時(shí)候,可組元素的時(shí)候,可以用變量。以用變量。錯(cuò)誤代碼。最大下錯(cuò)誤代碼。最大下標(biāo)為標(biāo)為9,沒有,沒有a10元素。元素。錯(cuò)誤代碼。不能用錯(cuò)

11、誤代碼。不能用一個(gè)語句輸出整個(gè)一個(gè)語句輸出整個(gè)數(shù)組。數(shù)組。5.2.4 一維數(shù)組的基本操作一維數(shù)組的基本操作可通過循環(huán)給數(shù)組元素輸入數(shù)據(jù)可通過循環(huán)給數(shù)組元素輸入數(shù)據(jù) int a10,i,; for(i=0;i10;i+) scanf(“%d”,&ai);也可通過循環(huán)輸出數(shù)組元素也可通過循環(huán)輸出數(shù)組元素 for(i=0;i10;i+) printf(“%d”,ai);例,輸入例,輸入5個(gè)數(shù),再按倒序輸出個(gè)數(shù),再按倒序輸出5-1.c求數(shù)組中最大元素求數(shù)組中最大元素#define N 10main() int i,p,max,aN; printf(Enter %d Numbersn,N); f

12、or(i=0;iN;i+) scanf(%d,&ai); max = a0; for(i=1;i max) max = ai; printf( The Max =%dn,max);p=0;a%d=%dn,p,max); p = i; 及其下標(biāo)及其下標(biāo)求最大、最小值以及排序求最大、最小值以及排序算法中的最大、最小值確算法中的最大、最小值確定定 都可以采用類似方法:都可以采用類似方法:把第一個(gè)元素假想為當(dāng)前把第一個(gè)元素假想為當(dāng)前找到的最大、最小值,在找到的最大、最小值,在后續(xù)的比較中進(jìn)行更新。后續(xù)的比較中進(jìn)行更新。5-2.c一維數(shù)組的倒置一維數(shù)組的倒置for(i=0;i N/2;i+) t

13、=ai; ai=aN-i-1; aN-i-1=t;0 0 0 2 4 6 8 1 3 5 7 91 1 9 2 4 6 8 1 3 5 7 02 2 9 7 4 6 8 1 3 5 2 03 3 9 7 5 6 8 1 3 4 2 04 4 9 7 5 3 8 1 6 4 2 05 5 9 7 5 3 1 8 6 4 2 0a0 a1 a9類似問題:字符串的回文比較類似問題:字符串的回文比較5-3.c5.2.5 一維數(shù)組的應(yīng)用舉例一維數(shù)組的應(yīng)用舉例 例:如果要統(tǒng)計(jì)例:如果要統(tǒng)計(jì)09,1019,2029,. 8089,9099分?jǐn)?shù)段及分?jǐn)?shù)段及100分的人數(shù)。分的人數(shù)。 編程分析:編程分析:a數(shù)組

14、用來存放數(shù)組用來存放20個(gè)學(xué)生成績;個(gè)學(xué)生成績;另用數(shù)組另用數(shù)組bn來存各分?jǐn)?shù)段的人數(shù):來存各分?jǐn)?shù)段的人數(shù):bn0存存09分的人數(shù),分的人數(shù),bn1存存1019分的人數(shù),分的人數(shù),bn9存存9099分的人數(shù),分的人數(shù),bn10存存100分的人數(shù)。分的人數(shù)。 5-4.c一維數(shù)組的應(yīng)用舉例:一維數(shù)組的應(yīng)用舉例:5.8.1 排序問題教材排序問題教材P.166) 數(shù)據(jù)的排序就是將一批數(shù)據(jù)由小大到數(shù)據(jù)的排序就是將一批數(shù)據(jù)由小大到升序或由大到小降序進(jìn)行排升序或由大到小降序進(jìn)行排列。常用的有選擇法、冒泡法。列。常用的有選擇法、冒泡法。 首先要將需要排序的數(shù)據(jù)放到數(shù)組中,首先要將需要排序的數(shù)據(jù)放到數(shù)組中,這樣

15、,便于我們排序。這樣,便于我們排序。1選擇法排序選擇法排序 算法描述:從剩下的元素集中找一個(gè)最小的元素依次放到算法描述:從剩下的元素集中找一個(gè)最小的元素依次放到第第i個(gè)位置。個(gè)位置。i從從0開始開始原始數(shù)據(jù):原始數(shù)據(jù):8 6 9 3 2 7第一輪后:第一輪后:2 6 9 3 8 7第二輪后:第二輪后:2 3 9 6 8 7第三輪后:第三輪后:2 3 6 9 8 7第四輪后:第四輪后:2 3 6 7 8 9第五輪后:第五輪后:2 3 6 7 8 9a0 a1 a2 a3 a4 a5869327 6個(gè)數(shù)需要經(jīng)歷個(gè)數(shù)需要經(jīng)歷5輪選擇輪選擇i=04) 每一輪做的工作:每一輪做的工作: 從第從第i個(gè)到最

16、后一個(gè)個(gè)到最后一個(gè)中找一個(gè)最小的。中找一個(gè)最小的。 與第與第i個(gè)交換。放到個(gè)交換。放到ai這個(gè)位置。這個(gè)位置。代碼:代碼: for(i=0; i5; i+) p=i; for(j=i+1; j6; j+) if(ajap) p=j; t=ai; ai=ap; ap=t; iN-1;iN; 從第從第i個(gè)到最個(gè)到最后一個(gè)中找后一個(gè)中找一個(gè)最小的。一個(gè)最小的。 與第與第i個(gè)交個(gè)交換。換。6個(gè)數(shù)需要經(jīng)歷個(gè)數(shù)需要經(jīng)歷5輪選擇輪選擇i=04)5-5.c 2冒泡法排序升序)冒泡法排序升序)算法描述算法描述第一輪:第一輪:8693268932689326839268329 683296382963289 第二

17、輪:第二輪:5個(gè)數(shù)共個(gè)數(shù)共4輪即可輪即可代碼:代碼: for(i=0; i4; i+) for(j=0; jaj+1) t=aj; aj=aj+1; aj+1=t; iN-1;iN-i-1;每輪需要經(jīng)過每輪需要經(jīng)過4-i次比較次比較發(fā)現(xiàn)前面的數(shù)比后面發(fā)現(xiàn)前面的數(shù)比后面的數(shù)大則需要交換,的數(shù)大則需要交換,把大的換到后面去。把大的換到后面去。5個(gè)數(shù)需要經(jīng)歷個(gè)數(shù)需要經(jīng)歷4輪選擇輪選擇i=03)5-6.c5.3 二維數(shù)組與多維數(shù)組二維數(shù)組與多維數(shù)組5.3.1 二維數(shù)組的聲明二維數(shù)組的聲明 二維數(shù)組說明的一般形式是:二維數(shù)組說明的一般形式是:類型符類型符 數(shù)組名數(shù)組名常量表達(dá)式常量表達(dá)式1常量表達(dá)式常量

18、表達(dá)式2; 其中:其中:常量表達(dá)式常量表達(dá)式1表示第一維下標(biāo)的長度表示第一維下標(biāo)的長度常量表達(dá)式常量表達(dá)式2 表示第二維下標(biāo)的長度。表示第二維下標(biāo)的長度。例如:例如: int a34; float b44; char c510; int a34; 該數(shù)組的下標(biāo)變量共有該數(shù)組的下標(biāo)變量共有34個(gè),個(gè),即:即:a00a01a02a03a10a11a12a13a20a21a22a23a00 a01 a02 a03 a10a23二維數(shù)組在內(nèi)存的存放順序是二維數(shù)組在內(nèi)存的存放順序是“先行后列先行后列”注意:語言允許二維數(shù)組注意:語言允許二維數(shù)組a34a34可分解為可分解為三個(gè)一維數(shù)組,其數(shù)組名分別為三個(gè)

19、一維數(shù)組,其數(shù)組名分別為a0, a1, a0, a1, a2a2。這三個(gè)一維數(shù)組都有。這三個(gè)一維數(shù)組都有4 4個(gè)元素。個(gè)元素。5.3.2 二維數(shù)組元素的引用二維數(shù)組元素的引用二維數(shù)組的元素的引用形式為:二維數(shù)組的元素的引用形式為: 數(shù)組名數(shù)組名下標(biāo)下標(biāo)下標(biāo)下標(biāo)使用二維數(shù)組的情況舉例:使用二維數(shù)組的情況舉例: 學(xué)生多門功課的成績,如:學(xué)生多門功課的成績,如:a1003可以用來記錄可以用來記錄100個(gè)學(xué)生個(gè)學(xué)生3門功課門功課的成績。的成績。 矩陣,如:矩陣,如:a33可以用來記錄可以用來記錄33的矩陣。一個(gè)數(shù)的矩陣。一個(gè)數(shù)組元素正好存放一個(gè)矩陣的元素。組元素正好存放一個(gè)矩陣的元素。5.3.3 二維

20、數(shù)組的初始化二維數(shù)組的初始化 二維數(shù)組初始化也是在類型說明時(shí)給各二維數(shù)組初始化也是在類型說明時(shí)給各下標(biāo)變量賦以初值。下標(biāo)變量賦以初值。1. 按行分段賦值可寫為按行分段賦值可寫為 int 53=80,75,92,61,65,71, 59,63,70,85,87,90,76,77,85; 2. 按行連續(xù)賦值可寫為按行連續(xù)賦值可寫為 int a53= 80,75,92,61,65,71,59,63, 70,85,87, 90,76,77,85 ; 注意:這兩種賦初值的結(jié)果是完全相同的。注意:這兩種賦初值的結(jié)果是完全相同的。說明:說明:int a33=1,2,3;int a 3=1,2,3,4,5,6

21、,7,8;1002003001234567805.3.4 二維數(shù)組的基本操作二維數(shù)組的基本操作二維數(shù)組的操作一般需要使用二重循環(huán)。二維數(shù)組的操作一般需要使用二重循環(huán)。1二維數(shù)組的輸入輸出二維數(shù)組的輸入輸出設(shè)數(shù)組己定義設(shè)數(shù)組己定義 int aNM;其程序段如下:其程序段如下: for(i=0;iN;i+) for(j=0;jM;j+) scanf(“%d”,&aij); for(i=0;iN;i+) for(j=0;jM;j+) printf(“%d ”,aij); printf(“n”);2求最大元素及其所在的行和列求最大元素及其所在的行和列 編程基本思路與在一維數(shù)組求最大值元素相編程

22、基本思路與在一維數(shù)組求最大值元素相同,同,row, column存放最大值所在行列號。存放最大值所在行列號。3. 矩陣的轉(zhuǎn)置方陣)矩陣的轉(zhuǎn)置方陣) 對比一維數(shù)組的倒置,注意:對比一維數(shù)組的倒置,注意:哪些元素要交換?哪些元素要交換?和誰交換?和誰交換?a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23a30 a31 a32 a33 如果不是方如果不是方陣,則要定義陣,則要定義另一個(gè)數(shù)組。另一個(gè)數(shù)組。bji = aij5.3.6 多維數(shù)組的聲明和引用多維數(shù)組的聲明和引用 在處理三維空問題等其它復(fù)雜問題時(shí)要使用在處理三維空問題等其它復(fù)雜問題時(shí)要使用到三維及三

23、維以上的數(shù)組,通常把三維及三維到三維及三維以上的數(shù)組,通常把三維及三維以上的數(shù)組稱為多維數(shù)組。以上的數(shù)組稱為多維數(shù)組。 定義多維數(shù)組的格式如下:定義多維數(shù)組的格式如下:類型符類型符 數(shù)組名數(shù)組名常量常量1常量常量2常量常量3;例如:例如:int a555; /* 聲明聲明a是三維數(shù)組是三維數(shù)組*/float b26105; /* 聲明聲明b是四維數(shù)組是四維數(shù)組*/注意:操作多維數(shù)組常常要用到多重循環(huán)。注意:操作多維數(shù)組常常要用到多重循環(huán)。2.6 指針變量指針變量2.6.1 地址與指針的概念地址與指針的概念 數(shù)據(jù)存放在內(nèi)存中,每個(gè)字節(jié)內(nèi)存單元按數(shù)據(jù)存放在內(nèi)存中,每個(gè)字節(jié)內(nèi)存單元按順序編號,稱為順

24、序編號,稱為“內(nèi)存地址內(nèi)存地址”。 通過內(nèi)存單元的地址即可準(zhǔn)確地找到該內(nèi)通過內(nèi)存單元的地址即可準(zhǔn)確地找到該內(nèi)存單元。存單元。 變量的地址就是變量的指針變量的地址就是變量的指針5x2019變量名變量名變量值變量值變量地址變量地址p指針指針變量變量2.6.3 指針變量的定義指針變量的定義 指針變量定義的一般形式:指針變量定義的一般形式: 類型符類型符 *標(biāo)識(shí)符標(biāo)識(shí)符;說明:說明: “*”直接修飾的直接修飾的“標(biāo)識(shí)符是指針變量。標(biāo)識(shí)符是指針變量。int *p,x; /* p是指針變量,是指針變量,x是整型變量是整型變量 */ 指針?biāo)笇ο蟮念愋头Q為指針的基準(zhǔn)類型。指針?biāo)笇ο蟮念愋头Q為指針的基準(zhǔn)類型

25、。int *p1; /* p1的基準(zhǔn)類型為整型,即的基準(zhǔn)類型為整型,即p1所所指向?qū)ο蟮念愋褪钦椭赶驅(qū)ο蟮念愋褪钦?*/char *p2; /* p2的基準(zhǔn)類型為字符型,即的基準(zhǔn)類型為字符型,即p2所指向?qū)ο蟮念愋褪亲址退赶驅(qū)ο蟮念愋褪亲址?*/2.6.4 指針變量的初始化指針變量的初始化#include void main() int *p; *p =5; printf(*p=%dn,*p); 錯(cuò)誤代碼:可能引錯(cuò)誤代碼:可能引起嚴(yán)重后果起嚴(yán)重后果不定值不定值p指向不可預(yù)料的指向不可預(yù)料的內(nèi)存空間內(nèi)存空間*p可以表示可以表示p變量所指的變量所指的變量變量初始化指針變量的方法主要有以下

26、初始化指針變量的方法主要有以下3種:種:int a,*p; p=&a; int a, *p1,*p2=&a; p1=p2; 使用使用malloc函數(shù)或函數(shù)或calloc函數(shù),給它們分函數(shù),給它們分配一個(gè)自由的內(nèi)存空間地址。配一個(gè)自由的內(nèi)存空間地址。apap1p22.6.5 指針變量的訪問指針變量的訪問 格式為:格式為: *指針變量指針變量例:例:int a=5, *p=&a;la為整型變量,變量里存放的是為整型變量,變量里存放的是5lp為指針變量,變量里存放的是變量為指針變量,變量里存放的是變量a的的地址地址l&a表示變量表示變量a的地址的地址l*p表示變量表示

27、變量p所指向的變量,即所指向的變量,即5ap&a5*p p+1 p-1 + -運(yùn)算5.4 數(shù)組與指針數(shù)組與指針 5.4.1 一維數(shù)組與指針一維數(shù)組與指針1、使用指針引用數(shù)組元素、使用指針引用數(shù)組元素 系統(tǒng)給一個(gè)一維數(shù)組在內(nèi)存中分配的一片系統(tǒng)給一個(gè)一維數(shù)組在內(nèi)存中分配的一片連續(xù)存儲(chǔ)空間,連續(xù)存儲(chǔ)空間,C語言規(guī)定其數(shù)組名就是語言規(guī)定其數(shù)組名就是數(shù)組在內(nèi)存中的首地址。數(shù)組在內(nèi)存中的首地址。 使用指針引用數(shù)組元素的準(zhǔn)備工作:使用指針引用數(shù)組元素的準(zhǔn)備工作: int a10, *p /*定義數(shù)組與指針變量定義數(shù)組與指針變量* / 做賦值操作:做賦值操作:p = a;p = &a0;兩種方

28、法效果兩種方法效果完全一樣完全一樣使用指針引用數(shù)組元素使用指針引用數(shù)組元素使用指針變量使用指針變量p指向指向數(shù)組數(shù)組a:方法一:方法一:int a10, *p;p=a;方法二:方法二:int a10, *p=a;a0a1a2.ai.a9pp+1或或a+1p+2或或a+2p+i或或a+ip+9或或a+9a數(shù)組數(shù)組注意:指針變注意:指針變量量p的運(yùn)算的運(yùn)算*(p+0)*(p+1)*(p+2)*(p+i)*(p+9)說明:說明: p+i指向元素指向元素ai 使用指針法引用一維數(shù)組的第使用指針法引用一維數(shù)組的第i個(gè)元素的個(gè)元素的方法:方法:使用指針變量使用指針變量*(p+i)訪問元素訪問元素ai。使用

29、數(shù)組名使用數(shù)組名*(a+i)訪問元素訪問元素ai。指向數(shù)組的指針變量也可以帶下標(biāo),即:指向數(shù)組的指針變量也可以帶下標(biāo),即: pi與與*(p+i)等價(jià),表示元素等價(jià),表示元素ai。 例子:方法一分析例子:方法一分析int i,imax,max,aN; for(i=0;iN;i+) scanf(%d, &ai ); max = a0; imax= 0; for(i=1;i max) max = ai ; imax = i; printf(“Max:a%d=%dn,imax,max);*(a+i)*(a+i)a+i*(a+i)替代替代aia+i指向元素指向元素ai, 即為即為ai的地址,的地

30、址,替代替代&ai例子:方法二分析例子:方法二分析int i,imax,max,aN; for(i=0;iN;i+) scanf(%d, &ai ); max = a0; imax= 0; for(i=1;i max) max = ai ; imax = i; printf(“Max:a%d=%dn,imax,max);,*p;(p=a;pa+N;p+)p變量指向變量指向a1p變量開始指向變量開始指向a0,然后逐個(gè)指向數(shù)組中然后逐個(gè)指向數(shù)組中的各個(gè)元素。的各個(gè)元素。pp=a+1;,p+)*p*p三種方法的比較:三種方法的比較:方法一與老方法的下標(biāo)法執(zhí)行效率是相同方法一與老方法的

31、下標(biāo)法執(zhí)行效率是相同的,的,C編譯系統(tǒng)是將編譯系統(tǒng)是將ai轉(zhuǎn)換為轉(zhuǎn)換為*(a+i)處置,處置,即先計(jì)算元素的地址。即先計(jì)算元素的地址。方法二比方法一和下標(biāo)法執(zhí)行效率高,用方法二比方法一和下標(biāo)法執(zhí)行效率高,用指針變量直接指向元素,不必每次都重新指針變量直接指向元素,不必每次都重新計(jì)算地址,有規(guī)律地改變地址值計(jì)算地址,有規(guī)律地改變地址值p+)能大大提高程序執(zhí)行效率。能大大提高程序執(zhí)行效率。用下標(biāo)法比較直觀,能直接知道是第幾個(gè)用下標(biāo)法比較直觀,能直接知道是第幾個(gè)元素。使用指針法,一定要知道當(dāng)前指針元素。使用指針法,一定要知道當(dāng)前指針指向哪個(gè)元素,否則可能得到意想不到的指向哪個(gè)元素,否則可能得到意想不

32、到的結(jié)果。結(jié)果。 例,輸入例,輸入5個(gè)個(gè)數(shù),再按倒序數(shù),再按倒序輸出輸出使用指針引用數(shù)組元素,應(yīng)注意以下使用指針引用數(shù)組元素,應(yīng)注意以下2個(gè)問題:個(gè)問題:若指針若指針p指向數(shù)組指向數(shù)組a,雖然,雖然p+i與與a+i、*(p+i)與與*(a+i)意義相同,但注意意義相同,但注意p與與a的區(qū)別的區(qū)別:a代表數(shù)組的首地址,是不變的;代表數(shù)組的首地址,是不變的;p是一個(gè)指針變量,可以指向數(shù)組中的任何是一個(gè)指針變量,可以指向數(shù)組中的任何元素元素.for(p=a; a(p+10); a+) printf(%d, *a)指針變量可以指向數(shù)組中的任何元素,注指針變量可以指向數(shù)組中的任何元素,注意指針變量的當(dāng)前

33、值。意指針變量的當(dāng)前值。 5-7.c指向數(shù)組元素的指針的一些運(yùn)算指向數(shù)組元素的指針的一些運(yùn)算int a10,*p=a;p+*p+*(p+)*(+p)(*p)+5a08a12a2.3ai.pp&a0同同a0pa166p5.4.2 二維數(shù)組與指針二維數(shù)組與指針 1. 二維數(shù)組的指針二維數(shù)組的指針例:例: int a34;a00a01a02a03a10a11a12a13a20a21a22a23a00 a01 a02 a03 a10a23在內(nèi)存中:在內(nèi)存中:二級指針常量。因?yàn)閿?shù)組名可以看成是由二級指針常量。因?yàn)閿?shù)組名可以看成是由3個(gè)元素個(gè)元素a0、a1、a2構(gòu)成的一維數(shù)組,構(gòu)成的一維數(shù)組,每個(gè)

34、元素指向該行的首地址。因而,二維每個(gè)元素指向該行的首地址。因而,二維數(shù)組名是一個(gè)二級指針常量。數(shù)組名是一個(gè)二級指針常量。一級指針常量。一級指針常量。a0可以看成是由可以看成是由a00、a01、a02、a03構(gòu)成的一維數(shù)組,構(gòu)成的一維數(shù)組,可以將可以將a0這個(gè)特殊數(shù)組名理解為指向這個(gè)特殊數(shù)組名理解為指向int類型的一級指針常量。類型的一級指針常量。a1與與a0具有同具有同樣性質(zhì),樣性質(zhì),a1與與a0的偏移量是一行元素的偏移量是一行元素的長度。的長度。 2使用指向元素的指針變量來引用定義一個(gè)指向二維數(shù)組元素類型的指針變量,通定義一個(gè)指向二維數(shù)組元素類型的指針變量,通過指針變量來引用數(shù)組元素。過指針

35、變量來引用數(shù)組元素。void main() int a34 = 1,2,3,4,5,6,7,8,9,10,11,12, i,*p; p=a0; for(i=0; i12; i+) printf(%4d, *p+); if ( (i%4 = 0) printf(n); 3使用行指針變量來引用數(shù)組元素使用行指針變量來引用數(shù)組元素 對于二維數(shù)組,可以定義一個(gè)指向一行對于二維數(shù)組,可以定義一個(gè)指向一行即一個(gè)一維數(shù)組的行指針變量,行指針即一個(gè)一維數(shù)組的行指針變量,行指針變量就是一個(gè)二級指針變量,其性質(zhì)與二維變量就是一個(gè)二級指針變量,其性質(zhì)與二維數(shù)組名相同。數(shù)組名相同。行指針的定義形式如下:行指針的定義形

36、式如下: 類型標(biāo)識(shí)符類型標(biāo)識(shí)符 (*指針變量名指針變量名)元素個(gè)數(shù)元素個(gè)數(shù);例如:例如:int (*p)4; 定義一個(gè)指向一行有定義一個(gè)指向一行有4個(gè)整型元素的行指針個(gè)整型元素的行指針變量。變量。例例 使用行指針變量使用行指針變量void main() int a34=1,2,3,4,5,6,7,8,9,10,11,12; int i,j, (*p)4 ; p=a; for(i=0; i3; i+) for(j=0;j4;j+) printf(%4d, *(*p+j) ); p+; printf(n); 注意: 不要將不要將int(*p)4寫成寫成int *p4 int *p4 表示定義一個(gè)包

37、含表示定義一個(gè)包含4個(gè)元素的一個(gè)元素的一維數(shù)組,每個(gè)元素為整型的指針變量。維數(shù)組,每個(gè)元素為整型的指針變量。 int(*p)4定義的是一個(gè)指向一個(gè)為數(shù)組的定義的是一個(gè)指向一個(gè)為數(shù)組的行指針變量指針變量行指針變量指針變量p,每執(zhí)行一次,每執(zhí)行一次p+,指,指向二維數(shù)組的下一行。向二維數(shù)組的下一行。 *p+j指向當(dāng)前行第指向當(dāng)前行第j個(gè)元素的地址,個(gè)元素的地址, *(*p+j)為當(dāng)前行第為當(dāng)前行第j個(gè)元素的值。個(gè)元素的值。 二維數(shù)組名二維數(shù)組名a是一個(gè)行指針常量,不能進(jìn)行是一個(gè)行指針常量,不能進(jìn)行a+、a-的運(yùn)算,的運(yùn)算,p是行指針變量,可以進(jìn)行是行指針變量,可以進(jìn)行p+等指針運(yùn)算操作。等指針運(yùn)算

38、操作。5.5 字符數(shù)組與字符串字符數(shù)組與字符串 5.5.1 字符數(shù)組與初值化字符數(shù)組與初值化 例如:例如: char c10; 例如:例如: char ch510; 字符數(shù)組也可在定義時(shí)作初始化賦值。字符數(shù)組也可在定義時(shí)作初始化賦值。 (1逐個(gè)元素初始化,當(dāng)初始化數(shù)據(jù)少于逐個(gè)元素初始化,當(dāng)初始化數(shù)據(jù)少于數(shù)組長度,多余元素為數(shù)組長度,多余元素為“空空”(0),當(dāng)初),當(dāng)初始化數(shù)據(jù)多于元素個(gè)數(shù)時(shí),將出錯(cuò)。始化數(shù)據(jù)多于元素個(gè)數(shù)時(shí),將出錯(cuò)。 char c10=c, ,p,r,o,g,r,a,m;char d210= I, ,a,m, ,a, ,b,o, y,G,o,o,d, ,b,o,y(2) 指定初

39、值時(shí),若未指定數(shù)組長度,則長度等指定初值時(shí),若未指定數(shù)組長度,則長度等于初值個(gè)數(shù)。于初值個(gè)數(shù)。char c = I, ,a,m, ,h,a,p,p,y; 5.5.3 字符串與字符數(shù)組字符串與字符數(shù)組 在語言中沒有專門的字符串變量,通常在語言中沒有專門的字符串變量,通常用一個(gè)字符數(shù)組來存放一個(gè)字符串。用一個(gè)字符數(shù)組來存放一個(gè)字符串。 字符串總是以字符串總是以0作為串的結(jié)束符。因此作為串的結(jié)束符。因此當(dāng)把一個(gè)字符串存入一個(gè)數(shù)組時(shí),當(dāng)把一個(gè)字符串存入一個(gè)數(shù)組時(shí), 也把結(jié)束也把結(jié)束符符0存入數(shù)組,并以此作為該字符串是否結(jié)存入數(shù)組,并以此作為該字符串是否結(jié)束的標(biāo)志。束的標(biāo)志。字符數(shù)組可以用字符串來初始化

40、字符數(shù)組可以用字符串來初始化: char c=C program; 或:或: char c=C program;Cprogra m 05.5.4 字符數(shù)組的輸入輸出字符數(shù)組的輸入輸出 字符數(shù)組的輸入輸出一般采用下面兩種字符數(shù)組的輸入輸出一般采用下面兩種方法:可用方法:可用printf函數(shù)和函數(shù)和scanf函數(shù)中使用。函數(shù)中使用。 1、用、用“%c格式符逐個(gè)輸入輸出。格式符逐個(gè)輸入輸出。 2、用、用“%s格式符按字符串輸入輸出。格式符按字符串輸入輸出。例:例: char c8; printf(Input:); scanf(%s,c); printf(%s,c);H ello 0運(yùn)行時(shí)輸入:運(yùn)行時(shí)

41、輸入:Helloc說明:說明:輸出時(shí),遇輸出時(shí),遇0完畢,且輸出字符中不包含完畢,且輸出字符中不包含0?!?s格式輸出字符串時(shí),格式輸出字符串時(shí),printf()函數(shù)函數(shù)的輸出項(xiàng)是字符數(shù)組名,而不是元素名。的輸出項(xiàng)是字符數(shù)組名,而不是元素名。char c = Good!;printf(%s,c); printf(%c,c0);printf(%s,c0); /* 錯(cuò)誤錯(cuò)誤 */ “%s格式輸出時(shí),即使數(shù)組長度大于格式輸出時(shí),即使數(shù)組長度大于字符串長度,遇字符串長度,遇0也結(jié)束。例如:也結(jié)束。例如:char c10 = Good!;printf(%s,c); /*只輸出只輸出5個(gè)字符個(gè)字符 */“

42、%s格式輸出時(shí),若數(shù)組中包含一個(gè)以格式輸出時(shí),若數(shù)組中包含一個(gè)以上上0,遇第一個(gè),遇第一個(gè)0時(shí)結(jié)束。例如:時(shí)結(jié)束。例如:char c = Good!0boy;printf(%s,c); /*輸出結(jié)果輸出結(jié)果:Good! */輸入時(shí),遇回車鍵、空格鍵結(jié)束,但獲得輸入時(shí),遇回車鍵、空格鍵結(jié)束,但獲得的字符中不包含回車鍵本身,而是在字符的字符中不包含回車鍵本身,而是在字符串末尾添串末尾添0C語言中,數(shù)組名代表該數(shù)組的起始地址,語言中,數(shù)組名代表該數(shù)組的起始地址,scanf()函數(shù)中不需要地址運(yùn)算符函數(shù)中不需要地址運(yùn)算符&。char str13;scanf(%s,str);scanf(%s,&

43、amp;str); /* 錯(cuò)誤的錯(cuò)誤的 */一個(gè)一個(gè)scanf函數(shù)輸入的字符串中有空格時(shí)函數(shù)輸入的字符串中有空格時(shí)要特別注意。例如:要特別注意。例如:char str13;scanf(“%s”,str);運(yùn)行時(shí)輸入:運(yùn)行時(shí)輸入:How are you?結(jié)果只有結(jié)果只有“How被放入被放入str解決方案:解決方案:輸入到多個(gè)字符串:輸入到多個(gè)字符串:char str15,str25,str35; scanf(%s%s%s,str1,str2,str3);使用逐個(gè)字符輸入:使用逐個(gè)字符輸入: for(i=0;i=11;i+) ci=getchar(); c12=0; 5.6 字符串字符指針字符串字

44、符指針 5.6.1 指向字符串的指針指向字符串的指針例:例:char s10; s=Welcome; s=Welcome; C語言中使用字符指針來處理字符串的很語言中使用字符指針來處理字符串的很方便。首先需要定義一個(gè)基類型為字符型的方便。首先需要定義一個(gè)基類型為字符型的指針變量。例如:指針變量。例如:char *s;兩種賦值方法:兩種賦值方法: char *s= Welcome ; char *s; s=Welcome; 兩種方法:兩種方法:s變量得到的都變量得到的都是字符串的首是字符串的首地址。地址。例:寫出程序的運(yùn)行結(jié)果。例:寫出程序的運(yùn)行結(jié)果。void main() char *p; c

45、har s =ABCD; for(p=s;ps+4;p+) printf(%sn,p); getch();ABCD0spppp例:已知字符串例:已知字符串char s1 =“How are you”;將將s1中的空格刪除后放入字符數(shù)組中的空格刪除后放入字符數(shù)組s2中。中。5-8.c5-9.c5.6.2 使用字符串指針變量與字符數(shù)組的區(qū)別使用字符串指針變量與字符數(shù)組的區(qū)別三者含義:三者含義:字符串指針變量本身是一個(gè)變量,用于存字符串指針變量本身是一個(gè)變量,用于存放字符串的首地址。放字符串的首地址。字符串本身是存放在一塊連續(xù)的內(nèi)存空間字符串本身是存放在一塊連續(xù)的內(nèi)存空間中并以中并以0作為字符串的結(jié)

46、束。作為字符串的結(jié)束。字符數(shù)組是由若干個(gè)數(shù)組元素組成的,它字符數(shù)組是由若干個(gè)數(shù)組元素組成的,它可用來存放整個(gè)字符串??捎脕泶娣耪麄€(gè)字符串。注意:注意:char *ps=“C Language”;char *ps;ps=“C Language”;char st=“C Language”;char st20;st=C Language。 5.6.3 字符串處理函數(shù) 用于輸入輸出的字符串函數(shù),用于輸入輸出的字符串函數(shù), 應(yīng)包含頭應(yīng)包含頭文件文件“stdio.h” 。1.字符串輸出函數(shù):字符串輸出函數(shù): 格式:格式: puts (str) ;說明:說明: str為數(shù)組名或指針變量。為數(shù)組名或指針變量。

47、 等價(jià)于:等價(jià)于:printf(“%sn”,str);有換行。有換行。2.字符串輸入函數(shù)字符串輸入函數(shù) 格式:格式: gets (str);說明:說明: str為數(shù)組名或指針變量。為數(shù)組名或指針變量。 將輸入的字符串加上結(jié)束標(biāo)志將輸入的字符串加上結(jié)束標(biāo)志0 。 以回車最為輸入結(jié)束。以回車最為輸入結(jié)束。使用其它字符串函數(shù)應(yīng)包含頭文件使用其它字符串函數(shù)應(yīng)包含頭文件string.h。3.字符串連接函數(shù):字符串連接函數(shù):strcat (str1,str2) 4.字符串拷貝函數(shù):字符串拷貝函數(shù):strcpy (str1,str2)5.字符串比較函數(shù):字符串比較函數(shù):strcmp(str1,str2)6.

48、 測字符串長度函數(shù):測字符串長度函數(shù):strlen(str) 7. 字符大寫轉(zhuǎn)小寫函數(shù):字符大寫轉(zhuǎn)小寫函數(shù):strlwr(str) 8. 字符小寫轉(zhuǎn)大寫函數(shù):字符小寫轉(zhuǎn)大寫函數(shù):strupr(str) 使用方法:使用方法: 例:例:strcat(str1,str2); 執(zhí)行后結(jié)果在執(zhí)行后結(jié)果在str1中。中。 例:例:k=strlen(str); 結(jié)果在函數(shù)的返回值中,結(jié)果在函數(shù)的返回值中,可以賦值給其他變量??梢再x值給其他變量。5.7 指針數(shù)組與多級指針變量指針數(shù)組與多級指針變量5.7.1 指針數(shù)組指針數(shù)組概念:指針數(shù)組是一個(gè)數(shù)組,該數(shù)組中的每概念:指針數(shù)組是一個(gè)數(shù)組,該數(shù)組中的每一個(gè)元素是

49、指針變量。一個(gè)元素是指針變量。定義定義: 類型標(biāo)識(shí)符類型標(biāo)識(shí)符 *數(shù)組名數(shù)組名數(shù)組元素個(gè)數(shù)數(shù)組元素個(gè)數(shù);例如:例如: int *p4; 定義一個(gè)指針數(shù)組,數(shù)組名定義一個(gè)指針數(shù)組,數(shù)組名p,有,有4個(gè)元素,個(gè)元素,每一個(gè)元素是指向整型變量的指針。每一個(gè)元素是指向整型變量的指針。注意與指向數(shù)組的指針變量的區(qū)分:注意與指向數(shù)組的指針變量的區(qū)分:int(*p)4定義一個(gè)指針變量,它指向有定義一個(gè)指針變量,它指向有4個(gè)個(gè)元素的一維數(shù)組。元素的一維數(shù)組。 指針數(shù)組的用途:處理多個(gè)字符串。指針數(shù)組的用途:處理多個(gè)字符串。先來看使用二維數(shù)組存放多個(gè)字符串:先來看使用二維數(shù)組存放多個(gè)字符串:char ch 16

50、=Follow me, BASIC, Great Wall, FORTRAN, Computer Design“使用二維數(shù)組處理浪費(fèi)較多內(nèi)存。使用二維數(shù)組處理浪費(fèi)較多內(nèi)存。使用指針數(shù)組使用指針數(shù)組char *pc =Follow me, BASIC, Great Wall, FORTRAN, Computer Design;說明:說明:pc是一維數(shù)組,里面存放著是一維數(shù)組,里面存放著5個(gè)指向個(gè)指向字符型變量的指針。字符型變量的指針。pc0pc1pc2pc3F ollo wm e 0B A SI C 0G re at W all 0F O R T R A N 0C o m p u terD e sig n 0例例 將若干字符串按字母順序輸出。將若干字符串按字母順序輸出。#include stdio.h#include string.hvoid main() char *temp; int i, j, k, n=5; char *pc = Follow me, BASIC,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論