《C語言程序設計》第5章數組、字符串、指針課件_第1頁
《C語言程序設計》第5章數組、字符串、指針課件_第2頁
《C語言程序設計》第5章數組、字符串、指針課件_第3頁
《C語言程序設計》第5章數組、字符串、指針課件_第4頁
《C語言程序設計》第5章數組、字符串、指針課件_第5頁
已閱讀5頁,還剩75頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針第第5章章 數組、字符串、指針數組、字符串、指針C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針本章要求:本章要求:1、掌握、掌握C語言數組在內存中的存儲形式語言數組在內存中的存儲形式2、掌握一維數組和二維數組的定義及使用、掌握一維數組和二維數組的定義及使用3、掌握使用指針處理數組的方法、掌握使用指針處理數組的方法4、掌握使用字符數組及指針處理字符串數據、掌握使用字符數組及指針處理字符串數據的方法的方法5、掌握與數組有關的基本算法(如排序、查、掌握與數組有關的基本算法(如排序、查找、插入、刪除等)的

2、程序設計找、插入、刪除等)的程序設計C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針 重點:重點: 一維數組、二維數組的定義與使用一維數組、二維數組的定義與使用方法,使用指針訪問數組和字符串的方法,使用指針訪問數組和字符串的方法。方法。 難點:難點: 二維數組與指針;與數組有關的常二維數組與指針;與數組有關的常用算法(排序、查找與插入等)。用算法(排序、查找與插入等)。C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針5.1 數組概述數組概述 例例. 輸入輸入10個數,求出他們的平均數。個數,求出他們的平均數。main() int n,a,s=0;

3、 float ave; for (n=1;nave) printf(“%d”,a1);if (a2ave) printf(“%d”,a2);if (a3ave) printf(“%d”,a3); . /* 實際程序是不能這樣寫實際程序是不能這樣寫*/C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針思考:思考: 發現:如果不是發現:如果不是10個數,而是個數,而是100,1000,甚至是甚至是10000,此時按上面方法編寫程序就,此時按上面方法編寫程序就非常冗長。非常冗長。 如果可以使用如果可以使用循環循環來編寫,程序可以簡潔來編寫,程序可以簡潔許多。許多。 要使用循環:

4、要使用循環:必須使用必須使用ai (i=1,210)的形的形式來代表式來代表a1,a2a10 在在C語言中使用語言中使用“數組數組”來實現來實現: aia0 a1a9C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針#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; for(i=0;iave) printf(%f ,ai);聲明有聲明有10個元素個元素的一維數組的一維數組aa0 a1 a9aiaiaiaiC語言程序設計語言

5、程序設計第第5章數組、章數組、字符串、指針字符串、指針在程序設計中,為了處理方便,在程序設計中,為了處理方便, 把具有相把具有相同類型的若干變量按有序的形式組織起來。同類型的若干變量按有序的形式組織起來。這些按序排列的這些按序排列的同類數據同類數據元素的集合稱為元素的集合稱為數組數組。在語言中,在語言中, 數組屬于構造數據類型。數組屬于構造數據類型。 按類型分為按類型分為: 數值數組、數值數組、 字符數組、字符數組、 指指針數組、結構數組針數組、結構數組等等 按維數可分為:按維數可分為:一維數組、二維數組、一維數組、二維數組、多維數組多維數組。 數組在內存中占用一片連續的存儲單元數組在內存中占

6、用一片連續的存儲單元C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針5.2 一維數組一維數組只有一個下標變量的數組,稱為一維數組。只有一個下標變量的數組,稱為一維數組。 5.2.1 一維數組定義一維數組定義 一般形式為:一般形式為: 類型符類型符 數組名數組名 常量表達式常量表達式 ; 其中:其中: 類型說明符是任一種基本數據類型或構類型說明符是任一種基本數據類型或構造數據類型,造數據類型, 數組名是用戶定義的標識符;數組名是用戶定義的標識符; 方括號中的常量表達式表示數據元素的方括號中的常量表達式表示數據元素的個數,也稱為數組的長度。個數,也稱為數組的長度。C語言程序

7、設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針 例如:例如:int a10; float b10,c20; char ch20; 數組在內存中占據一片連續的存儲空間:數組在內存中占據一片連續的存儲空間: 以以 int a5為例,在內存中為:為例,在內存中為:a0a1a2a3a4相當于聲明了相當于聲明了5個整型變量個整型變量C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針說明:說明:數組的所有元素的數據類型都是相同的。數組的所有元素的數據類型都是相同的。數組取名規則應符合標識符的規定,數組數組取名規則應符合標識符的規定,數組名不能與同一函數中其它變量名相同

8、:名不能與同一函數中其它變量名相同: int a; float a10; 是錯誤的。是錯誤的。C語言中規定數組的下標從語言中規定數組的下標從0開始,方括號開始,方括號中常量表達式表示數組元素的個數。中常量表達式表示數組元素的個數。不能在方括號中用變量來表示元素的個數,不能在方括號中用變量來表示元素的個數, 但是可以是符號常數或常量表達式。例如:但是可以是符號常數或常量表達式。例如:int n=5,an; 是錯誤的。是錯誤的。C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針5.2.2 一維數組的初始化一維數組的初始化1、數組聲明時初始化、數組聲明時初始化 在編譯階段進行的

9、。這樣將減少運行時間,在編譯階段進行的。這樣將減少運行時間,提高效率。提高效率。數組初始化的一般形式為:數組初始化的一般形式為:類型符類型符 數組名數組名常量表達式常量表達式=值值,值值值值;例如:例如: int a10= 0,1,2,3,4,5,6,7,8,9 ; 相當于相當于a0=0; a1=1;. a9=9; C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針說明:說明: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個元素賦個元素賦值,其余賦值,

10、其余賦0值值不能給數組整體不能給數組整體賦值,改成賦值,改成1可以省略數組元可以省略數組元素個數。素個數。靜態存儲類型,靜態存儲類型,初值為初值為0初值的個數不能初值的個數不能超過元素個數超過元素個數C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針2、使用賦值語句初始化、使用賦值語句初始化 用賦值語句初始化是在程序執行過程中實現用賦值語句初始化是在程序執行過程中實現的。例如:的。例如:int a3;a0=5;a1=8;a2=9; 對于數組的元素用賦值語句初始化,常常使對于數組的元素用賦值語句初始化,常常使用循環來完成,例如:用循環來完成,例如:int k,a10;for

11、(k=0;k10;k+) ak=1; /*對數組中所有元素賦初值為對數組中所有元素賦初值為1*/C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針5.2.3 數組元素的引用數組元素的引用 數組元素是組成數組的基本單元,數組元素數組元素是組成數組的基本單元,數組元素可以看成一種變量。引用數組元素有下標法和可以看成一種變量。引用數組元素有下標法和指針法。本小節介紹下標法,指針法將在指針法。本小節介紹下標法,指針法將在5.5節節中介紹。中介紹。使用下標法引用一維數組元素的一般形式為:使用下標法引用一維數組元素的一般形式為: 數組名數組名下標下標 其中,的下標只能為整型常量或整型

12、表達式。其中,的下標只能為整型常量或整型表達式。若為小數時,若為小數時,C編譯將自動取整。編譯將自動取整。C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針說明:說明:int n=3,a10;an=5; an+1=10;int a10,x,y;a10=5;int a10;printf(%d,a); 正確代碼。引用數正確代碼。引用數組元素的時候,可組元素的時候,可以用變量。以用變量。錯誤代碼錯誤代碼。最大下。最大下標為標為9,沒有,沒有a10元素。元素。錯誤代碼錯誤代碼。不能用不能用一個語句輸出整個一個語句輸出整個數組。數組。C語言程序設計語言程序設計第第5章數組、章數組、

13、字符串、指針字符串、指針5.2.4 一維數組的基本操作一維數組的基本操作可通過循環給數組元素輸入數據可通過循環給數組元素輸入數據 int a10,i,; for(i=0;i10;i+) scanf(“%d”,&ai);也可通過循環輸出數組元素也可通過循環輸出數組元素 for(i=0;i10;i+) printf(“%d”,ai);例,輸入例,輸入5個數,再按倒序輸出個數,再按倒序輸出5-1.cC語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針求數組中最大元素求數組中最大元素#define N 10main() int i,p,max,aN; printf(Ente

14、r %d Numbersn,N); for(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; 及其下標及其下標求最大、最小值以及排序求最大、最小值以及排序算法中的最大、最小值確算法中的最大、最小值確定定 都可以采用類似方法:都可以采用類似方法:把第一個元素假想為當前把第一個元素假想為當前找到的最大、最小值,在找到的最大、最小值,在后續的比較中進行更新。后續的比較中進行更新。5-2.cC語言程序設計語言程序設計第

15、第5章數組、章數組、字符串、指針字符串、指針一維數組的倒置一維數組的倒置for(i=0;i N/2;i+) t=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.cC語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針5.2.5 一

16、維數組的應用舉例一維數組的應用舉例 例:如果要統計例:如果要統計09,1019,2029,. 8089,9099分數段及分數段及100分的人數。分的人數。 編程分析:編程分析:a數組用來存放數組用來存放20個學生成績;個學生成績;另用數組另用數組bn來存各分數段的人數:來存各分數段的人數:bn0存存09分的人數,分的人數,bn1存存1019分的人數,分的人數,bn9存存9099分的人數,分的人數, bn10存存100分的人數。分的人數。 5-4.cC語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針一維數組的應用舉例:一維數組的應用舉例:5.8.1 排序問題排序問題(教材(

17、教材P.166) 數據的排序就是將一批數據由小大到數據的排序就是將一批數據由小大到(升序)(升序)或由大到小或由大到小(降序)(降序)進行排進行排列。常用的有列。常用的有選擇法、冒泡法。選擇法、冒泡法。 首先要將需要排序的數據放到數組中,首先要將需要排序的數據放到數組中,這樣,便于我們排序。這樣,便于我們排序。C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針1選擇法排序選擇法排序 算法描述:從剩下的元素集中找一個最小的元素依次放到算法描述:從剩下的元素集中找一個最小的元素依次放到第第i個位置。個位置。i從從0開始開始原始數據:原始數據:8 6 9 3 2 7第一輪后:第

18、一輪后: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個數需要經歷個數需要經歷5輪選擇(輪選擇(i=04) 每一輪做的工作:每一輪做的工作: 從第從第i個到最后一個個到最后一個中找一個最小的。中找一個最小的。 與第與第i個交換。放到個交換。放到ai這個位置。這個位置。C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針代碼:代碼: for(i=0; i5; i+) p=i; for(

19、j=i+1; j6; j+) if(ajap) p=j; t=ai; ai=ap; ap=t; iN-1;iN; 從第從第i個到最個到最后一個中找后一個中找一個最小的。一個最小的。 與第與第i個交個交換。換。6個數需要經歷個數需要經歷5輪選擇輪選擇(i=04)5-5.cC語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針 2冒泡法排序(升序)冒泡法排序(升序)算法描述算法描述第一輪:第一輪:8693268932689326839268329 683296382963289 第二輪:第二輪:5個數共個數共4輪即可輪即可C語言程序設計語言程序設計第第5章數組、章數組、字符串、指

20、針字符串、指針代碼:代碼: for(i=0; i4; i+) for(j=0; jaj+1) t=aj; aj=aj+1; aj+1=t; iN-1;iN-i-1;每輪需要經過每輪需要經過4-i次比較次比較發現前面的數比后面發現前面的數比后面的數大則需要交換,的數大則需要交換,把大的換到后面去。把大的換到后面去。5個數需要經歷個數需要經歷4輪選擇輪選擇(i=03)5-6.cC語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針5.3 二維數組與多維數組二維數組與多維數組5.3.1 二維數組的聲明二維數組的聲明 二維數組說明的一般形式是:二維數組說明的一般形式是:類型符類型符

21、數組名數組名常量表達式常量表達式1常量表達式常量表達式2; 其中:其中:常量表達式常量表達式1表示第一維下標的長度表示第一維下標的長度常量表達式常量表達式2 表示第二維下標的長度。表示第二維下標的長度。例如:例如: int a34; float b44; char c510; C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針int a34; 該數組的下標變量共有該數組的下標變量共有34個,個,即:即:a00a01a02a03a10a11a12a13a20a21a22a23a00 a01 a02 a03 a10a23二維數組在內存的存放順序是二維數組在內存的存放順序是“先

22、行后列先行后列”注意:語言允許二維數組注意:語言允許二維數組a34a34可分解為可分解為三個一維數組,其數組名分別為三個一維數組,其數組名分別為a0, a1, a0, a1, a2a2。這三個一維數組都有。這三個一維數組都有4 4個元素。個元素。C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針5.3.2 二維數組元素的引用二維數組元素的引用二維數組的元素的引用形式為:二維數組的元素的引用形式為: 數組名數組名下標下標下標下標使用二維數組的情況舉例:使用二維數組的情況舉例: 學生多門功課的成績,如:學生多門功課的成績,如:a1003可以用來記錄可以用來記錄100個學生個學

23、生3門功門功課的成績。課的成績。 矩陣,如:矩陣,如:a33可以用來記錄可以用來記錄33的矩陣。一個的矩陣。一個數組元素正好存放一個矩陣的元素。數組元素正好存放一個矩陣的元素。C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針5.3.3 二維數組的初始化二維數組的初始化 二維數組初始化也是在類型說明時給各二維數組初始化也是在類型說明時給各下標變量賦以初值。下標變量賦以初值。1. 按行分段賦值可寫為按行分段賦值可寫為 int 53=80,75,92,61,65,71, 59,63,70,85,87,90,76,77,85; 2. 按行連續賦值可寫為按行連續賦值可寫為 int

24、 a53= 80,75,92,61,65,71,59,63, 70,85,87, 90,76,77,85 ; 注意:這兩種賦初值的結果是完全相同的。注意:這兩種賦初值的結果是完全相同的。C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針說明:說明:int a33=1,2,3;int a 3=1,2,3,4,5,6,7,8;100200300123456780C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針5.3.4 二維數組的基本操作二維數組的基本操作二維數組的操作一般需要使用二重循環。二維數組的操作一般需要使用二重循環。1二維數組的輸入輸出二維數

25、組的輸入輸出設數組己定義設數組己定義 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”);C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針2求最大元素及其所在的行和列求最大元素及其所在的行和列 編程基本思路與在一維數組求最大值元素相編程基本思路與在一維數組求最大值元素相同,同,row, column存放最大值所在行列號。存放最大值所在行列號。3. 矩陣的

26、轉置(方陣)矩陣的轉置(方陣) 對比一維數組的倒置,注意:對比一維數組的倒置,注意: 哪些元素要交換?哪些元素要交換? 和誰交換?和誰交換?a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23a30 a31 a32 a33 如果不是方如果不是方陣,則要定義陣,則要定義另一個數組。另一個數組。bji = aijC語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針5.3.6 多維數組的聲明和引用多維數組的聲明和引用 在處理三維空問題等其它復雜問題時要使用在處理三維空問題等其它復雜問題時要使用到三維及三維以上的數組,通常把三維及三維到三維及三

27、維以上的數組,通常把三維及三維以上的數組稱為多維數組。以上的數組稱為多維數組。 定義多維數組的格式如下:定義多維數組的格式如下:類型符類型符 數組名數組名常量常量1常量常量2常量常量3;例如:例如:int a555; /* 聲明聲明a是三維數組是三維數組*/float b26105; /* 聲明聲明b是四維數組是四維數組*/注意:操作多維數組常常要用到多重循環。注意:操作多維數組常常要用到多重循環。C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針2.6 指針變量指針變量2.6.1 地址與指針的概念地址與指針的概念 數據存放在內存中,每個字節內存單元按數據存放在內存中,每

28、個字節內存單元按順序編號,稱為順序編號,稱為“內存地址內存地址”。 通過內存單元的地址即可準確地找到該內通過內存單元的地址即可準確地找到該內存單元。存單元。 變量的地址就是變量的指針變量的地址就是變量的指針5x2003變量名變量名變量值變量值變量地址變量地址p指針指針變量變量C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針2.6.3 指針變量的定義指針變量的定義 指針變量定義的一般形式:指針變量定義的一般形式: 類型符類型符 *標識符標識符;說明:說明: “*”直接修飾的直接修飾的“標識符標識符”是指針變量。是指針變量。int *p,x; /* p是指針變量,是指針變量

29、,x是整型變量是整型變量 */ 指針所指對象的類型稱為指針的基準類型。指針所指對象的類型稱為指針的基準類型。int *p1; /* p1的基準類型為整型,即的基準類型為整型,即p1所所指向對象的類型是整型指向對象的類型是整型 */char *p2; /* p2的基準類型為字符型,即的基準類型為字符型,即p2所指向對象的類型是字符型所指向對象的類型是字符型 */C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針2.6.4 指針變量的初始化指針變量的初始化#include void main() int *p; *p =5; printf(*p=%dn,*p); 錯誤代碼:可

30、能引錯誤代碼:可能引起嚴重后果起嚴重后果不定值不定值p指向不可預料的指向不可預料的內存空間內存空間*p可以表示可以表示p變量所指的變量所指的變量變量C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針初始化指針變量的方法主要有以下初始化指針變量的方法主要有以下3種:種:int a,*p; p=&a; int a, *p1,*p2=&a; p1=p2; 使用使用malloc函數或函數或calloc函數,給它們分函數,給它們分配一個自由的內存空間地址。配一個自由的內存空間地址。apap1p2C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針

31、2.6.5 指針變量的訪問指針變量的訪問 格式為:格式為: *指針變量指針變量例:例:int a=5, *p=&a;la為整型變量,變量里存放的是為整型變量,變量里存放的是5lp為指針變量,變量里存放的是變量為指針變量,變量里存放的是變量a的的地址地址l&a表示變量表示變量a的地址的地址l*p表示變量表示變量p所指向的變量,即所指向的變量,即5ap&a5*pC語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針 p+1 p-1 + -運算C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針5.4 數組與指針數組與指針 5.4.1 一

32、維數組與指針一維數組與指針1、使用指針引用數組元素、使用指針引用數組元素 系統給一個一維數組在內存中分配的一片系統給一個一維數組在內存中分配的一片連續存儲空間,連續存儲空間,C C語言規定其數組名就是語言規定其數組名就是數組在內存中的數組在內存中的首地址首地址。 使用指針引用數組元素的準備工作:使用指針引用數組元素的準備工作: int a10, *p /*定義數組與指針變量定義數組與指針變量* / 做賦值操作:做賦值操作: p = a;p = &a0;兩種方法效果兩種方法效果完全一樣完全一樣C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針使用指針引用數組元素使用

33、指針引用數組元素使用指針變量使用指針變量p指向指向數組數組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數組數組注意:指針變注意:指針變量量p的運算的運算*(p+0)*(p+1)*(p+2)*(p+i)*(p+9)C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針說明:說明: p+i指向元素指向元素ai 使用指針法引用一維數組的第使用指針法引用一維數組的第i個元素的個元素的方法:方法:使用指針變量使用指針變量*(p+i)訪問元素訪問

34、元素ai。使用數組名使用數組名*(a+i)訪問元素訪問元素ai。指向數組的指針變量也可以帶下標,即:指向數組的指針變量也可以帶下標,即: pi與與*(p+i)等價,表示元素等價,表示元素ai。 C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針例子:方法一分析例子:方法一分析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

35、)a+i*(a+i)替代替代aia+i指向元素指向元素ai, 即為即為ai的地址,的地址,替代替代&aiC語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針例子:方法二分析例子:方法二分析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,然后逐個指向數組

36、中然后逐個指向數組中的各個元素。的各個元素。pp=a+1;,p+)*p*pC語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針三種方法的比較:三種方法的比較:方法一與老方法的下標法執行效率是相同方法一與老方法的下標法執行效率是相同的,的,C編譯系統是將編譯系統是將ai轉換為轉換為*(a+i)處理,處理,即先計算元素的地址。即先計算元素的地址。方法二比方法一和下標法執行效率高,用方法二比方法一和下標法執行效率高,用指針變量直接指向元素,不必每次都重新指針變量直接指向元素,不必每次都重新計算地址,有規律地改變地址值(計算地址,有規律地改變地址值(p+)能大大提高程序執行效率。能

37、大大提高程序執行效率。用下標法比較直觀,能直接知道是第幾個用下標法比較直觀,能直接知道是第幾個元素。使用指針法,一定要知道當前指針元素。使用指針法,一定要知道當前指針指向哪個元素,否則可能得到意想不到的指向哪個元素,否則可能得到意想不到的結果。結果。 C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針例,輸入例,輸入5個個數,再按倒序數,再按倒序輸出輸出使用指針引用數組元素,應注意以下使用指針引用數組元素,應注意以下2個問題:個問題:若指針若指針p指向數組指向數組a,雖然,雖然p+i與與a+i、*(p+i)與與*(a+i)意義相同,但注意意義相同,但注意p與與a的區別的區

38、別:l a代表數組的首地址,是不變的;代表數組的首地址,是不變的;l p是一個指針變量,可以指向數組中的任是一個指針變量,可以指向數組中的任何元素何元素.for(p=a; a(p+10); a+) printf(%d, *a)指針變量可以指向數組中的任何元素,注指針變量可以指向數組中的任何元素,注意指針變量的當前值。意指針變量的當前值。 5-7.cC語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針指向數組元素的指針的一些運算指向數組元素的指針的一些運算int a10,*p=a;p+*p+*(p+)*(+p) (*p)+5a08a12a2.3ai.pp&a0同同a0

39、pa166pC語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針5.4.2 二維數組與指針二維數組與指針 1. 二維數組的指針二維數組的指針例:例: int a34;a00a01a02a03a10a11a12a13a20a21a22a23a00 a01 a02 a03 a10a23在內存中:在內存中:C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針二級指針常量。二級指針常量。因為數組名可以看成是由因為數組名可以看成是由3個元素個元素a0、a1、a2構成的一維數組,構成的一維數組,每個元素指向該行的首地址。因此,二維每個元素指向該行的首地址。因此,二維

40、數組名是一個二級指針常量。數組名是一個二級指針常量。一級指針常量。一級指針常量。a0可以看成是由可以看成是由a00、a01、a02、a03構成的一維數組,構成的一維數組,可以將可以將a0這個特殊數組名理解為指向這個特殊數組名理解為指向int類型的一級指針常量。類型的一級指針常量。a1與與a0具有同具有同樣性質,樣性質,a1與與a0的偏移量是一行元素的偏移量是一行元素的長度。的長度。 C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針 2使用指向元素的指針變量來引用使用指向元素的指針變量來引用定義一個指

41、向二維數組元素類型的指針變量,通定義一個指向二維數組元素類型的指針變量,通過指針變量來引用數組元素。過指針變量來引用數組元素。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); C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針3使用行指針變量來引用數組元素使用行指針變量來引用數組元素 對于二維數組,可以定義一個指向一行對于二維數組,可以定義一個指向一行(即一個一維數組)的行指針

42、變量,行指針(即一個一維數組)的行指針變量,行指針變量就是一個二級指針變量,其性質與二維變量就是一個二級指針變量,其性質與二維數組名相同。數組名相同。行指針的定義形式如下:行指針的定義形式如下: 類型標識符類型標識符 (*指針變量名指針變量名)元素個數元素個數;例如:例如:int (*p)4; 定義一個指向一行有定義一個指向一行有4個整型元素的行指針個整型元素的行指針變量。變量。C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針例例 使用行指針變量使用行指針變量void main() int a34=1,2,3,4,5,6,7,8,9,10,11,12; int i,j,

43、 (*p)4 ; p=a; for(i=0; i3; i+) for(j=0;j4;j+) printf(%4d, *(*p+j) ); p+; printf(n); C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針 注意:注意: 不要將不要將int(*p)4寫成寫成int *p4 int *p4 表示定義一個包含表示定義一個包含4個元素的一個元素的一維數組,每個元素為整型的指針變量。維數組,每個元素為整型的指針變量。 int(*p)4定義的是一個指向一個為數組定義的是一個指向一個為數組的行指針變量指針變量的行指針變量指針變量p,每執行一次,每執行一次p+,指向二維數組

44、的下一行。指向二維數組的下一行。 *p+j指向當前行第指向當前行第j個元素的地址,個元素的地址, *(*p+j)為當前行第為當前行第j個元素的值。個元素的值。 二維數組名二維數組名a是一個行指針常量,不能進行是一個行指針常量,不能進行a+、a-的運算,的運算,p是行指針變量,可以進行是行指針變量,可以進行p+等指針運算操作。等指針運算操作。C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針5.5 字符數組與字符串字符數組與字符串 5.5.1 字符數組與初值化字符數組與初值化 例如:例如: char c10; 例如:例如: char ch510; 字符數組也可在定義時作初始

45、化賦值。字符數組也可在定義時作初始化賦值。 (1)逐個元素初始化,當初始化數據少于)逐個元素初始化,當初始化數據少于數組長度,多余元素為數組長度,多余元素為“空空”(0),當),當初始化數據多于元素個數時,將出錯。初始化數據多于元素個數時,將出錯。 char c10=c, ,p,r,o,g,r,a,m;C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針char d210= I, ,a,m, ,a, ,b,o, y,G,o,o,d, ,b,o,y(2) 指定初值時,若未指定數組長度,則長度等指定初值時,若未指定數組長度,則長度等于初值個數。于初值個數。char c = I,

46、 ,a,m, ,h,a,p,p,y; C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針5.5.3 字符串與字符數組字符串與字符數組 在語言中沒有專門的字符串變量,通常在語言中沒有專門的字符串變量,通常用一個字符數組來存放一個字符串。用一個字符數組來存放一個字符串。 字符串總是以字符串總是以0作為串的結束符。因作為串的結束符。因此當把一個字符串存入一個數組時,此當把一個字符串存入一個數組時, 也把結也把結束符束符0存入數組,并以此作為該字符串是存入數組,并以此作為該字符串是否結束的標志。否結束的標志。字符數組可以用字符串來初始化字符數組可以用字符串來初始化: char c

47、=C program; 或:或: char c=C program;Cprogra m 0C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針5.5.4 字符數組的輸入輸出字符數組的輸入輸出 字符數組的輸入輸出一般采用下面兩種字符數組的輸入輸出一般采用下面兩種方法:方法:可用可用printf函數和函數和scanf函數中使用。函數中使用。 1、用、用“%c”格式符逐個輸入輸出。格式符逐個輸入輸出。 2、用、用“%s”格式符按字符串輸入輸出格式符按字符串輸入輸出。例:例: char c8; printf(Input:); scanf(%s,c); printf(%s,c);H

48、ello 0運行時輸入:運行時輸入:HellocC語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針說明:說明:輸出時,遇輸出時,遇0結束,且輸出字符中不包含結束,且輸出字符中不包含0。“%s”格式輸出字符串時,格式輸出字符串時,printf()函數的函數的輸出項是字符數組名,而不是元素名。輸出項是字符數組名,而不是元素名。char c = Good!;printf(%s,c); printf(%c,c0);printf(%s,c0); /* 錯誤錯誤 */ “%s”格式輸出時,即使數組長度大于字格式輸出時,即使數組長度大于字符串長度,遇符串長度,遇0也結束。例如:也結束。

49、例如:char c10 = Good!;printf(%s,c); /*只輸出只輸出5個字符個字符 */C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針“%s”格式輸出時,若數組中包含一個以上格式輸出時,若數組中包含一個以上0,遇第一個,遇第一個0時結束。例如:時結束。例如:char c = Good!0boy;printf(%s,c); /*輸出結果輸出結果:Good! */輸入時,遇輸入時,遇回車鍵、空格鍵回車鍵、空格鍵結束,但獲得結束,但獲得的字符中不包含回車鍵本身,而是在字符的字符中不包含回車鍵本身,而是在字符串末尾添串末尾添0C語言中,數組名代表該數組的起始地

50、址,語言中,數組名代表該數組的起始地址,scanf()函數中不需要地址運算符函數中不需要地址運算符&。char str13;scanf(%s,str);scanf(%s,&str); /* 錯誤的錯誤的 */C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針一個一個scanf函數輸入的字符串中有空格時函數輸入的字符串中有空格時要特別注意。例如:要特別注意。例如:char str13;scanf(“%s”,str);運行時輸入:運行時輸入:How are you?結果只有結果只有“How”被放入被放入str解決方案:解決方案: 輸入到多個字符串:輸入到多個字

51、符串:char str15,str25,str35; scanf(%s%s%s,str1,str2,str3); 使用逐個字符輸入:使用逐個字符輸入: for(i=0;i=11;i+) ci=getchar(); c12=0; C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針5.6 字符串字符指針字符串字符指針 5.6.1 指向字符串的指針指向字符串的指針例:例:char s10; s=Welcome; s=Welcome; C語言中使用字符指針來處理字符串的很語言中使用字符指針來處理字符串的很方便。首先需要定義一個基類型為字符型的方便。首先需要定義一個基類型為字符型的

52、指針變量。例如:指針變量。例如:char *s;兩種賦值方法:兩種賦值方法: char *s= Welcome ; char *s; s=Welcome; 兩種方法:兩種方法:s變量得到的都變量得到的都是字符串的首是字符串的首地址。地址。C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針例:寫出程序的運行結果。例:寫出程序的運行結果。void main() char *p; char s =ABCD; for(p=s;ps+4;p+) printf(%sn,p); getch();ABCD0spppp例:已知字符串例:已知字符串char s1 =“How are you”

53、;將將s1中的空格刪除后放入字符數組中的空格刪除后放入字符數組s2中。中。5-8.c5-9.cC語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針5.6.2 使用字符串指針變量與字符數組的區別使用字符串指針變量與字符數組的區別三者含義:三者含義: 字符串指針變量字符串指針變量本身是一個變量,用于本身是一個變量,用于存放字符串的首地址。存放字符串的首地址。 字符串字符串本身是存放在一塊連續的內存空本身是存放在一塊連續的內存空間中并以間中并以0作為字符串的結束。作為字符串的結束。 字符數組字符數組是由若干個數組元素組成的,是由若干個數組元素組成的,它可用來存放整個字符串。它可用

54、來存放整個字符串。注意:注意:char *ps=“C Language”;char *ps;ps=“C Language”;char st=“C Language”;char st20;st=C Language。C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針 5.6.3 字符串處理函數字符串處理函數 用于輸入輸出的字符串函數,用于輸入輸出的字符串函數, 應包含頭應包含頭文件文件“stdio.h” 。1.字符串輸出函數:字符串輸出函數: 格式:格式: puts (str) ;說明:說明: str為數組名或指針變量。為數組名或指針變量。 等價于:等價于:printf(“

55、%sn”,str);有換行。有換行。2.字符串輸入函數字符串輸入函數 格式:格式: gets (str);說明:說明: str為數組名或指針變量。為數組名或指針變量。 將輸入的字符串加上結束標志將輸入的字符串加上結束標志0 。 以回車最為輸入結束。以回車最為輸入結束。C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針使用其它字符串函數應包含頭文件使用其它字符串函數應包含頭文件string.h。3.字符串連接函數:字符串連接函數:strcat (str1,str2) 4.字符串拷貝函數:字符串拷貝函數:strcpy (str1,str2)5.字符串比較函數:字符串比較函數:

56、strcmp(str1,str2)6. 測字符串長度函數:測字符串長度函數:strlen(str) 7. 字符大寫轉小寫函數:字符大寫轉小寫函數:strlwr(str) 8. 字符小寫轉大寫函數:字符小寫轉大寫函數:strupr(str) 使用方法:使用方法: 例:例:strcat(str1,str2); 執行后結果在執行后結果在str1中。中。 例:例:k=strlen(str); 結果在函數的返回值中,結果在函數的返回值中,可以賦值給其他變量。可以賦值給其他變量。C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針5.7 指針數組與多級指針變量指針數組與多級指針變量5.

57、7.1 指針數組指針數組概念:指針數組是一個數組,該數組中的每概念:指針數組是一個數組,該數組中的每一個元素是指針變量。一個元素是指針變量。定義定義: 類型標識符類型標識符 *數組名數組名數組元素個數數組元素個數;例如:例如: int *p4; 定義一個指針數組,數組名定義一個指針數組,數組名p,有,有4個元素,個元素,每一個元素是指向整型變量的指針。每一個元素是指向整型變量的指針。注意與指向數組的指針變量的區分:注意與指向數組的指針變量的區分:int(*p)4定義一個指針變量,它指向有定義一個指針變量,它指向有4個個元素的一維數組。元素的一維數組。C語言程序設計語言程序設計第第5章數組、章數

58、組、字符串、指針字符串、指針 指針數組的用途:處理多個字符串。指針數組的用途:處理多個字符串。先來看使用二維數組存放多個字符串:先來看使用二維數組存放多個字符串:char ch 16=Follow me, BASIC, Great Wall, FORTRAN, Computer Design“使用二維數組處理浪費較多內存。使用二維數組處理浪費較多內存。C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針使用指針數組使用指針數組char *pc =Follow me, BASIC, Great Wall, FORTRAN, Computer Design;說明:說明:pc是一

59、維數組,里面存放著是一維數組,里面存放著5個指向個指向字符型變量的指針。字符型變量的指針。pc0pc1pc2pc3pc4F 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 0C語言程序設計語言程序設計第第5章數組、章數組、字符串、指針字符串、指針例例 將若干字符串按字母順序輸出。將若干字符串按字母順序輸出。#include stdio.h#include string.hvoid main() char *temp; int i, j, k, n=5; char *pc = Follow me, BASIC, Great Wall, FORTRAN, Computer Design“ ;C語言程序設計語言程序設計第第5章數組、章數組、字符串、

溫馨提示

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

評論

0/150

提交評論