最新版課件最新版課件c語言 (42)_第1頁
最新版課件最新版課件c語言 (42)_第2頁
最新版課件最新版課件c語言 (42)_第3頁
最新版課件最新版課件c語言 (42)_第4頁
最新版課件最新版課件c語言 (42)_第5頁
已閱讀5頁,還剩95頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、8.1 8.1 指針與指針變量指針與指針變量8.2 8.2 指針與函數(shù)指針與函數(shù)8.3 8.3 指針與數(shù)組指針與數(shù)組8.4 8.4 指針與字符串指針與字符串8.5 8.5 指針數(shù)組與號令行指標指針數(shù)組與號令行指標8.6 8.6 程序舉例程序舉例 字符類型(字符類型(charchar) 整型整型(short,int,long,unsigned(short,int,long,unsigned) 單精度型(單精度型(floatfloat) 實型(浮點型)實型(浮點型) 雙精度型(雙精度型(doubledouble) 枚舉類型(枚舉類型(enumenum) 數(shù)組類型(數(shù)組類型( ) 組織類型組織類型

2、結構體類型(結構體類型(structstruct) 共用體類型(共用體類型(unionunion) 指針類型(指針類型(* *) 空類型(空類型(voidvoid)根基類型根基類型數(shù)數(shù)據(jù)據(jù)類類型型回想回想: : C C語言的信息類型語言的信息類型2. 變量的三要素變量的三要素:名字、類型與值名字、類型與值 每個變量都通過變量名與相應的存儲單元相連系每個變量都通過變量名與相應的存儲單元相連系,具體安排哪些單元給變量具體安排哪些單元給變量,由編譯系統(tǒng)完成變量由編譯系統(tǒng)完成變量名到對應內(nèi)存單元地址的變幻名到對應內(nèi)存單元地址的變幻. 變量安排存儲空間的大小由類型決意變量安排存儲空間的大小由類型決意.

3、變量的值那么是指相應存儲單元的內(nèi)容變量的值那么是指相應存儲單元的內(nèi)容. 往往稱變量往往稱變量p指向變量指向變量a.4000 4800pa4000373.3.內(nèi)存存取方式內(nèi)存存取方式 直截了當存取直截了當存取: :把直截了當按變量名或地址存取變把直截了當按變量名或地址存取變量值的方式稱為量值的方式稱為 “ “直截了當存取直截了當存取”方式方式. . 間接存取間接存取: :通過定義一種特別的變量特意存放內(nèi)存通過定義一種特別的變量特意存放內(nèi)存或變量的地址或變量的地址, ,接著依照該地址值再去會見相應的存接著依照該地址值再去會見相應的存儲單元儲單元 . .4.指針的概念 指針指針: :它示意一個變量指

4、向另一個變量如此的指它示意一個變量指向另一個變量如此的指向關系向關系. . 所謂指針即地址所謂指針即地址. . 一個變量的指針即該變量的地址一個變量的指針即該變量的地址, ,似似40004000便是指便是指向變量向變量a a的指針的指針. . 指針變量指針變量: :特意存放地址的變量特意存放地址的變量, ,似似p p即是一個指即是一個指針變量針變量, ,它存放的是它存放的是a a的地址的地址4000.4000.8.1.2 指針變量的定義與初始化指針變量的定義與初始化1. 指針變量的定義指針變量的定義 類型標識符類型標識符 *指針變量名;指針變量名;例例:float *p1; (定義定義p1為指

5、向實型變量的指針變量為指向實型變量的指針變量) char *p2; (定義定義p2為指向字符型變量的指針變量為指向字符型變量的指針變量)如果有定義如果有定義: int a,*p;語句僅僅定義了指針變量語句僅僅定義了指針變量p,但指針變量同時未指向但指針變量同時未指向確定的變量確定的變量(或內(nèi)存單元或內(nèi)存單元). 指針變量初始化指針變量初始化:在定義指針時同時給指針一個初在定義指針時同時給指針一個初始值始值.似似: int a,*p=&a;400037p a2. 2. 指針變量初始化指針變量初始化 &:&:取地址運算符取地址運算符* *: :取內(nèi)容運算符取內(nèi)容運算符 似似

6、: int a=1,: int a=1,* *p=&a;p=&a;printf(“%d”,printf(“%d”,* *p); p); 3.3.與指針引用有關的兩個運算符與指針引用有關的兩個運算符:&:&與與* *此處此處* *是會見指針所指對象的運算符是會見指針所指對象的運算符, ,與指針定義時的與指針定義時的* *差別差別. .4. 指針變量的引用指針變量的引用 *指針變量名代表所指變量的內(nèi)容. 指針變量名代表所指變量的地址.有定義: int a,*p=&a;用*p來示意p指向的對象a,*p與a是等價的. *p能夠象一樣變量一樣使用. 例似:a=12

7、;*p=12;*p=*p+10;scanf(%d,&a); scanf(%d,p);printf(%d%d,*p,a);OperatorsOperatorsAssociativityAssociativity() - . left to right! + - + - * & (type) sizeof right to left* % left to right+ - left to right left to right = left to right= != left to right& left to right left to right| left to ri

8、ght& left to right| left to right?: right to left= += -= *= = %= &= = |= = right to left, left to rightTable Precedence and Associativity of Operators 1. int a=1,*p=&a;&*p的含意是啥?的含意是啥?摸摸索索答答:&*p即即&(*p),與與&a等價等價,也與也與p等價等價.2. *&a的含意是啥的含意是啥? 答答:*&a即即*(&a),與與*p等價等價

9、,也與也與a等價等價. 答:a+ 3. (*p)+相當于啥相當于啥? 4. scanf(%d,&*p);printf(%d,*&a);printf(%d, (*p)+);8.1.3 指針運算指針運算1. 1. 指針的賦值運算指針的賦值運算例似例似:int a,b,*pa,*pb; pa=&a;pb=&b; paapbb(1)將變量地址值賦給指針變量)將變量地址值賦給指針變量,使指針指向該變量使指針指向該變量.(2) 一樣類型的指針變量間的賦值一樣類型的指針變量間的賦值似似:pb=pa; 即即 pa,pb都指向變量都指向變量a,此刻此刻a、*pa、*pb是是等價的

10、等價的.注重注重:只有一樣類型的指針變量才能彼此賦值只有一樣類型的指針變量才能彼此賦值.&a&bpapba,*pab,*pb&a&apapba,*pa,*pbb()給指針變量賦空值()給指針變量賦空值 給指針變量賦空值,講明該指針不指向任何變量. “空”指針值用NULL示意,NULL是在頭文件stdio.h中預定義的常量,其值為.似: #include stdio.h int *pa=NULL; 亦能夠用下面的語句給指針賦“空值”: pa=0; 這個地方指針pa同時非指向0地址單元,而是具有一個確定的“空值”,示意pa不指向任何變量.注重:指針固然能夠賦值0,但

11、卻不能把其它的常量地址賦給指針.例似: pa=4000; 黑白法的.例例8.1 8.1 從鍵盤上輸入兩個整數(shù)到從鍵盤上輸入兩個整數(shù)到a a、b,b,按由大到小輸出按由大到小輸出. . main( ) int a,b,*pa=&a,*pb=&b,*p; scanf(%d%d,&a,&b); if (*pa*pb) p=pa; pa=pb; pb=p; printf(n a=%d,b=%dn,a,b); printf(n max=%d,min=%d,*pa,*pb); 1222ppapb1222ppapb如果輸入如果輸入: 12 22 輸出結論輸出結論: a=12,

12、b=22 max=22,min=122. 2. 指針的算術運算指針的算術運算 (1) (1) 加減運算加減運算: : 一個指針能夠加、減一個整數(shù)一個指針能夠加、減一個整數(shù)n. n. 例似例似: : int a10,int a10,* *p=a,p=a,* *x x; x=p+3x=p+3; * *p p加上加上3 3* *2 2個字節(jié)賦給個字節(jié)賦給x, xx, x指向數(shù)組的第三個重量指向數(shù)組的第三個重量* * float a10, float a10, * *p=a, p=a, * *x x; p=p+3p=p+3; * *p p加上加上3 3* *4 4個字節(jié)賦給個字節(jié)賦給x, xx, x指

13、向數(shù)組的第三個重量指向數(shù)組的第三個重量* * (2) 自增自減運算例似例似: int a10,*p=a,*x; x=p+; * x第一個元素第一個元素,p指向第二個元素指向第二個元素*x=+p; * x、 p均指向數(shù)組的第二個元素均指向數(shù)組的第二個元素*答答:先輸出先輸出p指向的變量的值(即指向的變量的值(即*p),接接著著p+. 1. (*p)+是否等價于是否等價于*p+ ? *p+等價于啥?等價于啥? 答答:(*p)+不等價于不等價于*p+.*p+等價于等價于*(p+). (*p)+示意當前所指向的信息自增示意當前所指向的信息自增. *(p+)示意地址自增示意地址自增.2. 解講解講pri

14、ntf(%d, *(p+); 摸摸索索 3. 3.指針的關系運算指針的關系運算 許可對兩個一樣類型的指針變量履行全部的關系運許可對兩個一樣類型的指針變量履行全部的關系運算算.似似:pq,p=q,py) return (&x); else return (&y);舉例舉例return xy?&x:&y; 或或8.2.3 8.2.3 指向函數(shù)的指針(略)指向函數(shù)的指針(略) 一個函數(shù)包羅一組指令序列一個函數(shù)包羅一組指令序列,存儲在某一段內(nèi)存中存儲在某一段內(nèi)存中,這段這段內(nèi)存空間的起始地址稱為函數(shù)的入口地址內(nèi)存空間的起始地址稱為函數(shù)的入口地址. 稱函數(shù)入口地址為函數(shù)的

15、指針稱函數(shù)入口地址為函數(shù)的指針.函數(shù)名代表函數(shù)的入口函數(shù)名代表函數(shù)的入口地址地址. 能夠定義一個指針變量能夠定義一個指針變量,其值等于該函數(shù)的入口地址其值等于該函數(shù)的入口地址,指指向那個函數(shù)向那個函數(shù),如此通過那個指針變量也能調(diào)用那個函數(shù)如此通過那個指針變量也能調(diào)用那個函數(shù).這這種指針變量稱為指向函數(shù)的指針變量種指針變量稱為指向函數(shù)的指針變量. 定義指向函數(shù)的指針變量的一樣形式為定義指向函數(shù)的指針變量的一樣形式為: 類型標識符(類型標識符(*指針變量名指針變量名)( ); 例似例似: int (*p)(); * 指針變量指針變量p能夠指向一個整型函數(shù)能夠指向一個整型函數(shù)* float (*q)

16、(); * 指針變量指針變量q能夠指向一個浮點型函數(shù)能夠指向一個浮點型函數(shù)* 給函數(shù)指針賦初值給函數(shù)指針賦初值:將函數(shù)名(函數(shù)的入口地址值)將函數(shù)名(函數(shù)的入口地址值)賦給指針變量賦給指針變量.例似例似: int m, (*p)( ); int max(int a,int b);那么能夠那么能夠 p=max; * p指向函數(shù)指向函數(shù)max() * 指針調(diào)用函數(shù)的一樣形式為指針調(diào)用函數(shù)的一樣形式為: (*指針變量指針變量)( 實參表實參表); 似上例似上例:m=(*p)(12,22); *對比對比 m=max(12,22); *#define M 8main() float aM=11,2,-3

17、,4.5,5,69,7,80; float (*p)(); float max(float a ,int n); p=max; printf(%.2fn, (*p)(a,M) ); printf(%.2fn, max(a,M) );float max(float a,int n)int k;float s;s=a0;for (k=0;ks) s=ak;return s; 程序運行結論程序運行結論: 80.00 80.00例例 8.7 8.7 函數(shù)函數(shù)max()max()用來求一維數(shù)組的元用來求一維數(shù)組的元素的最大值素的最大值. .(1) 定義一個指向函數(shù)的指針變量定義一個指向函數(shù)的指針變量,形

18、似形似: float (*p)();(2) 為函數(shù)指針賦值為函數(shù)指針賦值,標準似下標準似下: p=函數(shù)名;函數(shù)名; 注重注重:賦值時只需給出函數(shù)名賦值時只需給出函數(shù)名,不要帶指標不要帶指標.(3) 通過函數(shù)指針調(diào)用函數(shù)通過函數(shù)指針調(diào)用函數(shù),調(diào)用標準似下調(diào)用標準似下: s=(*p)(實參實參);指向函數(shù)的指針的使用環(huán)節(jié)指向函數(shù)的指針的使用環(huán)節(jié):8.3 8.3 指針與數(shù)組指針與數(shù)組8.3.1 指向一維數(shù)組的指針指向一維數(shù)組的指針 1. 指向數(shù)組的指針的定義方式與指向根基類型變量的指向數(shù)組的指針的定義方式與指向根基類型變量的指針的定義方式一樣指針的定義方式一樣.例似例似:int a10=1,3,5,

19、7,9,11,13,15, 17,19;int *p;p=&a2; (把數(shù)組元素把數(shù)組元素a2的地址賦給指針變量的地址賦給指針變量p)p=&a0; (把數(shù)組元素把數(shù)組元素a0的地址賦給指針變量的地址賦給指針變量p)p=a; (把數(shù)組的首地址賦給指針變量把數(shù)組的首地址賦給指針變量p)vC C語言規(guī)定語言規(guī)定: :數(shù)組名代表數(shù)組首地址數(shù)組名代表數(shù)組首地址, ,是一個地址常是一個地址常量量, ,或是一個常量指針或是一個常量指針. .等價等價 13151719pa0:a9av在定義指針變量的同時可賦初值在定義指針變量的同時可賦初值:v int a10=1,3,5,7,9,11,13,1

20、5, 17,19;v int *p=&a0; (或或 int *p=a;)2.2.通過指針引用數(shù)組元素通過指針引用數(shù)組元素 C C規(guī)定規(guī)定:p+1:p+1指向數(shù)組的下一元素指向數(shù)組的下一元素( (而不是將而不是將p p值簡單地加值簡單地加1).1).似果似果p p的初值為的初值為&a0,&a0,那么那么: :(1 1)p+ip+i和和a+ia+i便是第便是第i i個元素的的地址個元素的的地址, ,即即&ai.&ai.aiai、* *(a+i) (a+i) pipi、* *(p+i)(p+i)這正是引用一維數(shù)組元素的四種方式這正是引用一維數(shù)組元素的四種方式

21、. .等價等價(2 2)* *(p+i)(p+i)或或* *(a+i)(a+i)是第是第i i個元素的內(nèi)容個元素的內(nèi)容, ,即即ai.ai.(3 3)指向數(shù)組的指針變量也能夠帶下標)指向數(shù)組的指針變量也能夠帶下標, ,似似pipi與與aiai等價等價. .即即&ai &ai a+ia+ip+ip+i等價等價 a0a1a2a9&a0pa+0p+1 或或 a+1p+9 或或 a+9內(nèi)容內(nèi)容地址地址 ai *(a+i) pi *(p+i)p+i或或a+i或或&ai 例例8.9 使用差別方式輸出整型數(shù)組使用差別方式輸出整型數(shù)組a各元素各元素. main() int a5

22、=1,3,5,7,9,i,*p=a; for (i=0;i5;i+) printf(%4d,ai); *方式方式1:下標法下標法* for (i=0;i5;i+) printf(%4d,*(a+i); *方式方式2:指針法之指針法之*(a+i)法法* for (i=0;i5;i+) printf(%4d,*(p+i); *方式方式3:指針法之指針法之*(p+i)法法* for (i=0;i5;i+) printf(%4d,pi); *方式方式4:指針下標法指針下標法* for ( ;pa+5;p+) printf(%4d,*p); *方式方式5:指針法之指針法之*p法法* 幾種方式的對比幾種方

23、式的對比: 用下標法對比直觀用下標法對比直觀,能直截了當明白是第幾個元素能直截了當明白是第幾個元素,似似a3是第個元素是第個元素,而指針法而指針法*p代表第幾個元素同代表第幾個元素同時不直觀時不直觀. 用指針法那么履行功效較高用指針法那么履行功效較高,能直截了當依照指針能直截了當依照指針變量的地址值去會見指向的數(shù)組元素變量的地址值去會見指向的數(shù)組元素,而下標法而下標法ai,是先變形成地址是先變形成地址a+i,每次都要履行變形運算每次都要履行變形運算:a+i元元素字節(jié)數(shù)素字節(jié)數(shù),再由地址會見對應的存儲單元即元素再由地址會見對應的存儲單元即元素.注重注重:(1)指針變量可實現(xiàn)使自已的值改變)指針變

24、量可實現(xiàn)使自已的值改變. p+合法;但合法;但a+不合法(不合法(a是數(shù)組名是數(shù)組名,代表數(shù)組首代表數(shù)組首地址地址,在程序運行中是固定不變的在程序運行中是固定不變的.)(2)要注重指針變量的當前值)要注重指針變量的當前值.main()int a10;int *p, i;for (p=a;pa+10;p+) scanf(%d,p); for ( ;pa+10;p+) printf(%d, *p ); 增加增加:p=a;例例8.10 從鍵盤上輸入從鍵盤上輸入10個整數(shù)到數(shù)組個整數(shù)到數(shù)組a中中,接著輸出接著輸出.上機題上機題:2. 輸入輸入10個整數(shù)個整數(shù),將其中最小的數(shù)與第一個數(shù)將其中最小的數(shù)與第

25、一個數(shù)對換對換,把最大的數(shù)與末了一個數(shù)對換把最大的數(shù)與末了一個數(shù)對換.寫寫4個函數(shù)個函數(shù):輸入輸入10個數(shù)個數(shù); input(int *p)履行操作履行操作; exchang(int *p)輸出輸出10個數(shù)個數(shù); output(int *p)main() 上機題(增補題)上機題(增補題):3. 有有n個整數(shù)個整數(shù),使前面各數(shù)次序向使前面各數(shù)次序向后移后移m個位置個位置,末了末了m個數(shù)變成最前面?zhèn)€數(shù)變成最前面m個數(shù)個數(shù),寫一函寫一函數(shù)數(shù)exchang(int *p)實現(xiàn)以上交流功能實現(xiàn)以上交流功能.要求輸出調(diào)整要求輸出調(diào)整之前和調(diào)整之后的之前和調(diào)整之后的n個數(shù)個數(shù).#define N 13#de

26、fine M 4exchang(int *p) int bN; * 過渡 * . main() int aN; 輸入 exchang(a); 輸出 提示:能夠使用rand()8.3.2 8.3.2 二維數(shù)組與多維數(shù)組的指針示意法二維數(shù)組與多維數(shù)組的指針示意法 1.二維數(shù)組的地址二維數(shù)組的地址設有設有 int a34;1917311195132171523 a a數(shù)組見諒三個元素數(shù)組見諒三個元素:a0,a1,a2.:a0,a1,a2.而每個元素而每個元素又是一個一維數(shù)組又是一個一維數(shù)組, ,它見諒它見諒4 4個元素個元素, ,似似:a0:a0又見諒又見諒: : a00,a01,a02,a03.a

27、00,a01,a02,a03. a0a1a2a=1917311195132171523 數(shù)組名數(shù)組名a: 代表整個二維數(shù)組的首地址代表整個二維數(shù)組的首地址,也便是第也便是第0行的首地址行的首地址. a+1: 代表第代表第1行的首地址行的首地址. a+i : 代表第代表第i行的首地址行的首地址. 一維數(shù)組名一維數(shù)組名ai: 代表第代表第i 行的首地址行的首地址,即第即第i行中第行中第0列元素列元素 的地址(既的地址(既&ai0). ai+j: 代表第代表第i行中的第行中的第j個元素的地址個元素的地址,即為即為&aij. 注重地址改變的單位數(shù)值在差別的場所的現(xiàn)實字節(jié)數(shù)是差別注重地址

28、改變的單位數(shù)值在差別的場所的現(xiàn)實字節(jié)數(shù)是差別的的: “a+1”中的中的“1” 代表數(shù)組中一行元素所占的總字節(jié)數(shù);代表數(shù)組中一行元素所占的總字節(jié)數(shù); “ai+1”中的中的“1” 代表數(shù)組中一個元素所占的字節(jié)數(shù)代表數(shù)組中一個元素所占的字節(jié)數(shù). a0a1a2a=1917311195132171523a+2 a數(shù)組a0a1a2aa+1(2000)(2021)(2021)a代表第代表第0行的首地址行的首地址,a+1代表第代表第1行的首地址行的首地址,a+2代表第代表第2行的首地址行的首地址. 這個地方這個地方+1的含義是的含義是: +4*2=+8個個字節(jié)字節(jié).2000120213202152021720

29、219202111202113202115202117202119202121202223aa+1a+2a0+1a0+2a0+3 元素內(nèi)容的示意法元素內(nèi)容的示意法:(1) ajk 數(shù)組下標示意法數(shù)組下標示意法(2) *(aj+k) 行用下標示意法行用下標示意法(3) *(*(a+j)+k) 指針示意法指針示意法(4) *(a+j)k 列用下標示意法列用下標示意法元素地址的示意法元素地址的示意法:(1) &ajk(2) aj+k(3) *(a+j)+k行地址行地址,元素地址的示意法元素地址的示意法:a0aj、*(a+j)指一整行元素指一整行元素.例例8.11 8.11 用指針示意法輸出二

30、維數(shù)組的各元素用指針示意法輸出二維數(shù)組的各元素. .main()int a23=0,1,2,3,4,5; int k,j,*p=a; for (j=0;j2;j+) for (k=0;k3;k+) printf(%5d, *(aj+k) ); printf(n); *(p+)*(*(a+j)+k) ajk(數(shù)組下標法)(數(shù)組下標法)或或2.指向二維數(shù)組的指針變量指向二維數(shù)組的指針變量有兩種情況有兩種情況:一是直截了當指向數(shù)組元素的指針變量;一是直截了當指向數(shù)組元素的指針變量; 二是指向一個含有二是指向一個含有m個元素的一維數(shù)組個元素的一維數(shù)組. 指向數(shù)組元素的指針變量指向數(shù)組元素的指針變量,即

31、簡單指針變量即簡單指針變量,似似: int *p,a34; p=&a12; 似例似例8.11.例例8.13 用指向數(shù)組元素的指針輸出二維數(shù)組用指向數(shù)組元素的指針輸出二維數(shù)組,同時將數(shù)組中的同時將數(shù)組中的最大元素及所在行列號輸出最大元素及所在行列號輸出.(略)(略) main() int i,j,m,n,max; int a34=1,2,3,4,5,6,7,8,9,10,11,12; int *p; p=&a00; 或p=a; max=*p; m=0;n=0; for(i=0;i3;i+) printf(n); for (j=0;jmax) max=*p;m=i;n=j; p+;

32、 printf(nmax is:a%d%d=%d,m,n,max); 輸出: 1 2 3 45 6 7 89 10 11 12 max is: a23=12 注重P148敘述的錯誤.(2)指向一維數(shù)組(二維數(shù)組的一行)的指針指向一維數(shù)組(二維數(shù)組的一行)的指針,亦稱行亦稱行指針指針.定義形式定義形式: 類型類型 (*指針變量)指針變量) 元素個數(shù)元素個數(shù); 似似: int a35; int (*p)5; p=a; p能夠指向一個有五個元素的一維數(shù)組(行數(shù)能夠指向一個有五個元素的一維數(shù)組(行數(shù)組);此刻組);此刻,如果如果p指向數(shù)組指向數(shù)組a的第的第0行行,即即p=a,那么那么p+1是指到下一行

33、是指到下一行a1,即即p+1相當于相當于a+1. main() int i,j,m,n,max; int a34=1,2,3,4,5,6,7,8,9,10,11,12; int (*p)4; p=a; *p指向第指向第0行行* max=*p; * *p相當于相當于 *(*(p+0)+0)或或p00 * m=0;n=0; for(i=0;i3;i+) printf(n); for(j=0;j4;j+) printf(%3d, *(*p+j) ); if( *(*p+j) max) max= *(*p+j) ;m=i;n=j; p+ ; printf(nmax is: a%d%d=%d,m,n,m

34、ax); 例例8.14 用指向一維數(shù)組的行指針輸出二維數(shù)組用指向一維數(shù)組的行指針輸出二維數(shù)組,同時將數(shù)組中同時將數(shù)組中的最大元素及所在行列號輸出的最大元素及所在行列號輸出.(摸索摸索:一樣數(shù)組下標法如何編?一樣數(shù)組下標法如何編?)摸摸索索:這這與與一一樣樣下下標標法法的的區(qū)區(qū)不不是是啥?啥? 摸索摸索:此處的此處的p+與例與例8.11中中p+的區(qū)不是啥?的區(qū)不是啥? main() int i,j,m,n,max; int a34=1,2,3,4,5,6,7,8,9,10,11,12; int (*p)4; p=a; *p指向第0行* max=p00; m=0;n=0; for(i=0;i3;i

35、+) printf(n); for(j=0;j4;j+) printf(%3d, pij ); 或*(*(p+i)+j) if(pijmax) max= pij ;m=i;n=j; p+; 去掉 printf(nmax is: a%d%d=%d,m,n,max); 隱藏8.4 8.4 指針與字符串指針與字符串8.4.1 字符串的指針示意法字符串的指針示意法回想回想:字符串能夠保留在字符數(shù)組中字符串能夠保留在字符數(shù)組中,似似. main( ) char str =I Love China!; printf(%sn,str); 運行時輸出運行時輸出:I Love China! 摸索摸索:字符指針變

36、量似何定義?字符指針變量似何定義?可用字符指針指向字符串可用字符指針指向字符串: 字符指針變量的定義字符指針變量的定義: 似似:char *p;操縱指針來對字符串操作有下面兩種情況操縱指針來對字符串操作有下面兩種情況: 在定義時初始化指針變量使指針指向一個字符串在定義時初始化指針變量使指針指向一個字符串. 用指針變量來實現(xiàn)對字符串的會見用指針變量來實現(xiàn)對字符串的會見.(1) 在定義時初始化指針變量使指針指向一個字符在定義時初始化指針變量使指針指向一個字符串串.main( )char *str=“I Love China!” ; (初始化初始化str) printf( %sn, str ); 運

37、行時也輸出運行時也輸出:I Love China!Difference: char str1 = Now is the time.; * an array * char *str2 = Now is the time.; * a pointer * str1:str1:str2:str2:Now is the time.0Now is the time.0Now is the time.0Now is the time.0 char *str2 =“I love china”; 等價于下列兩句:char *str2 ; str2=“I love china” ;摸索摸索:char str140

38、= “I love china”; 是否等價于是否等價于:char str140; str1=“I love china”; ?str1=“I love china”; 非法非法因為數(shù)組名因為數(shù)組名str1是一個常量指針是一個常量指針.(2)用指針變量來實現(xiàn)對字符串的會見)用指針變量來實現(xiàn)對字符串的會見.例例8.8 將一已知字符串第將一已知字符串第n個字符最先的剩余字符復制個字符最先的剩余字符復制到另一字符串中到另一字符串中. (摸索摸索:不用指針變量似何編程?不用指針變量似何編程?)main()int i,n; char a=computer; char b10,*p,*q; p=a; q=

39、b; scanf(%d,&n); for(p+=n-1;(*q=*p)!=0;p+,q+) ; printf(%sn,a); printf(%sn,b); 輸入輸入: 3 輸出輸出: computermputer摸索摸索:似何改進?似何改進?(2)用指針變量來實現(xiàn)對字符串的會見)用指針變量來實現(xiàn)對字符串的會見.例例8.8 將一已知字符串第將一已知字符串第n個字符最先的剩余字符復制個字符最先的剩余字符復制到另一字符串中到另一字符串中.main()int i,n; char a=computer,b10,*p=a,*q=b; scanf(%d,&n); p+=n-1; while(

40、*q+=*p+) ; printf(%sn%sn,a,b); 輸入輸入: 3 輸出輸出: computermputer摸索摸索:a,b如果改為如果改為 p,q 輸出結論是否一樣?輸出結論是否一樣?8.4.2 字符串數(shù)組字符串數(shù)組啥是字符串數(shù)組?啥是字符串數(shù)組?是一維仍是二維的?是一維仍是二維的?好不可?好不可?8.4.2 字符串數(shù)組字符串數(shù)組字符串數(shù)組字符串數(shù)組:是指數(shù)組中的每個元素根基上一個存放字符串是指數(shù)組中的每個元素根基上一個存放字符串的數(shù)組的數(shù)組.例似例似:char languge310;可賦初值可賦初值.例似例似:char languge310=“BASIC”,“C+”,“PASCA

41、L”;BASIC0C+0PASCAL0languge0languge1languge2 能夠操縱能夠操縱languageij來引用每一個字符來引用每一個字符,但操縱不方便但操縱不方便. 揮霍存儲空間揮霍存儲空間. 使用字符型指針數(shù)組能夠更方便地操作字符串數(shù)組使用字符型指針數(shù)組能夠更方便地操作字符串數(shù)組.上機題上機題:P16948.5.1 8.5.1 指針數(shù)組指針數(shù)組 指針數(shù)組指針數(shù)組: :是指針變量的集合是指針變量的集合. .即它的每一個元素根即它的每一個元素根基上指針變量基上指針變量, ,且都具有一樣的存儲類不和指向一且都具有一樣的存儲類不和指向一樣的信息類型樣的信息類型. .指針數(shù)組的定義

42、形式為指針數(shù)組的定義形式為: : 類型標識符類型標識符 * *數(shù)組名數(shù)組名 數(shù)組長度講明數(shù)組長度講明 ; 例似例似: int : int * *p10;p10; 比比* *的優(yōu)先級高的優(yōu)先級高, ,只是它們不是運算符只是它們不是運算符. .8.5 8.5 指針數(shù)組與號令行指標指針數(shù)組與號令行指標 指針數(shù)組廣泛應用于對字符串的操作指針數(shù)組廣泛應用于對字符串的操作. (1)可定義指針數(shù)組似下)可定義指針數(shù)組似下: char *p3; (2)可初始化指針數(shù)組似下)可初始化指針數(shù)組似下: char *p3= “BASIC”, “C+”, “PASCAL”; 0LACSAP0+C0CISABp0p1p2

43、100010061010(3)還可用指針數(shù)組對字符串履行更進一步的操作)還可用指針數(shù)組對字符串履行更進一步的操作 (似例(似例8.17).例例8.9 8.9 字符指針數(shù)組的賦值字符指針數(shù)組的賦值 #define NULL 0#define NULL 0 main( ) main( ) char a =“Fortran”; char a =“Fortran”; char b =“COBOL”; char b =“COBOL”; char c =“Pascal”; char c =“Pascal”; int i; int i; char char * *p4;p4; p0=a; p1=b; p2=

44、c; p0=a; p1=b; p2=c; p3=NULL;p3=NULL; for (i=0;pi!=NULL;i+) for (i=0;pi!=NULL;i+) printf(“Language %d is printf(“Language %d is %sn”,i+1,pi);%sn”,i+1,pi); 隱藏隱藏例例8.17 8.17 有如果干本書有如果干本書, ,將書名按字典次序排序且輸出將書名按字典次序排序且輸出. .#include main() char *bname=Programming in ANSI C,BASIC,Visual C+ 6.0 Programming ,TU

45、RBO C 2.0; int i,m; m=sizeof(bname)sizeof(char *); *字符串個數(shù)* sort(bname,m); for(i=0;im;i+) printf(n%s,bnamei);void sort(char *name, int n) *挑選法排序*char *t; int i,j,k; for (i=0;in-1;i+) k=i; for (j=i+1;jn;j+) if (strcmp(namej,namek)echo hello, worldargc為3argv0 指向 echoargv1 指向 hello, argv2 指向 world argc

46、3 main(int argc, char *argv) int i; for (i = 1; i echo hello, worldhello, world main(int argc, char *argv) while (-argc 0) printf(%s , *+argv); 2. 2.號令行指標的傳遞示例號令行指標的傳遞示例8.6 8.6 程序舉例程序舉例對比對比: :將十進制數(shù)將十進制數(shù)n n變形成變形成r r進制數(shù)的方式是進制數(shù)的方式是:n:n除以除以r r取余數(shù)做取余數(shù)做為變形后的數(shù)的最低位為變形后的數(shù)的最低位. .如果商不為如果商不為0,0,那么商接著那么商接著除以除以r,

47、 r,取余數(shù)做為次低位取余數(shù)做為次低位, ,以此類推以此類推, ,直到商為直到商為0 0為為止止. .十六進制數(shù)十六進制數(shù):09,A,B,C,D,E,F.:09,A,B,C,D,E,F.所得余數(shù)序列變形成字符保留在字符數(shù)組所得余數(shù)序列變形成字符保留在字符數(shù)組a a中中. . 09 +0 09 +0或或+48+48 1015 +55 1015 +55 (4)(4)反向輸出反向輸出. .例例8.12 8.12 輸入一個十進制正整數(shù)輸入一個十進制正整數(shù), ,將其變形成二進將其變形成二進制、八進制、十六進制數(shù)輸出制、八進制、十六進制數(shù)輸出. . main()int i,radix; long n; c

48、har a33; printf(nInput radix(2,8,16):); scanf(%d,&radix); printf(nInput a positive integer:); scanf(%ld,&n); trans10_2_8_16(n,a,radix); for (i=strlen(a)-1;i=0; i-) printf(%c, ai); void trans10_2_8_16(m, p, base)long m; char *p;int base;int r; while(m0) r=m%base; * 求余數(shù) * if (r10) *p=r+48; els

49、e *p=r+55; m=mbase; * 求商 * p+; *指針下移* *p=0; 輸入輸入:Input radix(2,8,16):16 Input a positive integer:435678輸出輸出:6A5DE運行情況運行情況增補例題增補例題. 100個人圍成一圈個人圍成一圈,從從1到到3報數(shù)報數(shù).從第從第1個人最先個人最先,每數(shù)到每數(shù)到3的人出圈的人出圈.咨詢末了一個出圈的人是哪一個?咨詢末了一個出圈的人是哪一個?main( )int a100,i,n=100,k,*p=a; * n為未出圈人數(shù) *for(i=0;i1) if(*(p+i)!=0) k+; * 未出圈的人報數(shù)

50、 * if (k=3) *(p+i)=0; * 退出人置為 * n-; k=0; i+; if(i=100) i=0; * 到末了一個人再恢復為第1個人 * while(*p=0) p+;printf(The last person is %d.n,*p);作業(yè)題作業(yè)題:P167 1,2,3(不用抄咨詢題)(不用抄咨詢題)上機題上機題:P1696,7,9講明講明:縱然末了只有縱然末了只有2人人,也可也可1,2,3報數(shù)報數(shù),退出一人后退出一人后,只剩末了一人只剩末了一人,為為91號號.上機題上機題:增補題增補題1:定義函數(shù)定義函數(shù)int f(char *x, char y)推斷推斷x所指的字符串

51、中所指的字符串中是否見諒字符是否見諒字符y,如果是那么函數(shù)返回如果是那么函數(shù)返回1,否那么返回否那么返回0.增補題增補題2:同上同上,檢驗檢驗y在在x中表現(xiàn)的次數(shù)中表現(xiàn)的次數(shù). 增補題增補題3:請用二級指針實現(xiàn)輸出指針數(shù)組所指向的各字符串請用二級指針實現(xiàn)輸出指針數(shù)組所指向的各字符串.main() char *a=Programming in ANSI C,BASIC,Visual C+ 6.0 Programming ,TURBO C 2.0; char *p; 上機題(增補題上機題(增補題4):從鍵盤輸入如果干個非零整數(shù)(正負數(shù)從鍵盤輸入如果干個非零整數(shù)(正負數(shù)均可)均可),將每個整數(shù)的列位

52、數(shù)字之積放入一數(shù)組中將每個整數(shù)的列位數(shù)字之積放入一數(shù)組中,接著輸出乘接著輸出乘積積.要求要求:用兩個自定義函數(shù)分不來求乘積、輸出乘積用兩個自定義函數(shù)分不來求乘積、輸出乘積,且用指且用指針做為函數(shù)指標針做為函數(shù)指標.提示提示:#define MAX 20main()int x,i;static int arrayMAX;scanf(%d,&x);for(i=0;i=0?x:-x); multiply(x,&arrayi); scanf(%d,&x); print(array,i);multiply(int x,int *p)*p=1; print(int *p,int n

53、)for(;n0;n-) printf(n);int strlen(char *s)int n=0; for(; *s!= 0; s+) n+; return n; int strlen(char s) int i = 0; while(si != 0 ) +i; return i; main() char str=abcd; printf(The length of string %s is %d., str, strlen(str); eg1int strlen(char *s)char *p = s; while (*p != 0) p+; return p - s; int strle

54、n(char s) int i = 0; while(si) +i; return i; 背面全是增補內(nèi)容背面全是增補內(nèi)容: strlen(hello, world);* string constant * strlen(array); * char array100; * strlen(ptr); * char *ptr; *int strlen(char s) int strlen(char *s) we prefer the latter because it says more explicitly that the variable is a pointer.are equivale

55、nt f(int daytab213) . f(int daytab 13) . f(int (*daytab)13) . are equivalent It says that the parameter is a pointer to an array of 13 integers. * pointer version * void strcpy(char *s, char *t) while (*s+ = *t+) ; The best one int strcmp(char *s, char *t) for ( ; *s = *t; s+, t+) if (*s = 0) return

56、 0; return *s - *t; eg2eg3eg4 * month_name: return name of n-th month 其他函數(shù)能夠會見以下的string,但不能會見數(shù)組名name * char *month_name(int n) static char *name = Illegal month, January, February, March, April, May, June, July, August, September, October, November, December ; return (n 12) ? name0 : namen; 8.1 8.1 指針與指針變量指針與指針變量8.2 8.2 指針與函數(shù)指針與函數(shù)8.3 8.3 指針與數(shù)組指針與數(shù)組8.4 8.4 指針與字符串指針與字符串8.5 8.5 指針數(shù)組與號令行指標指針數(shù)組與號令行指標8.6 8.6 程序舉例程序舉例 復習復習似似: int a=37,*p=&a;8.1.2 指針變量的定義與初始化指針變量的定義與初始化&:&:取地址運算符取地址運算符* *: :取內(nèi)容運算符取內(nèi)容運算符 似似: int a=1,: i

溫馨提示

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

評論

0/150

提交評論