清華大學(xué)C語言-第十章 指針_700308220_第1頁
清華大學(xué)C語言-第十章 指針_700308220_第2頁
清華大學(xué)C語言-第十章 指針_700308220_第3頁
清華大學(xué)C語言-第十章 指針_700308220_第4頁
清華大學(xué)C語言-第十章 指針_700308220_第5頁
已閱讀5頁,還剩116頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第十章第十章 指指 針針清華大學(xué) 自動化系劉連臣2012年12月5日計算機(jī)語言與程序設(shè)計基礎(chǔ)計算機(jī)語言與程序設(shè)計基礎(chǔ) 1o 指針是指針是C語言的一個重要概念;語言的一個重要概念;o 指針是指針是C語言的一個重要特色。語言的一個重要特色。o 有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu);有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu);o 動態(tài)地分配內(nèi)存;動態(tài)地分配內(nèi)存;o 有效方便地使用數(shù)組;方便地使用字符串;有效方便地使用數(shù)組;方便地使用字符串;o 在調(diào)用函數(shù)時能獲得在調(diào)用函數(shù)時能獲得1個以上的結(jié)果;個以上的結(jié)果;o 能直接處理內(nèi)存單元地址等。能直接處理內(nèi)存單元地址等。o 不掌握指針就沒有掌握不掌握指針就沒有掌握C的精華。的精華。2主

2、要內(nèi)容o 目標(biāo):提綱提綱 10.1 10.1 地址和指針的概念地址和指針的概念 10.10.變量的指針和指向變量的變量的指針和指向變量的 指針變量指針變量 10.10.數(shù)組與指針數(shù)組與指針 10.10.字符串與指針字符串與指針 10.5 10.5 指向函數(shù)的指針指向函數(shù)的指針 10.6 10.6 返回指針值的函數(shù)返回指針值的函數(shù) 10.7 10.7 指針數(shù)組和指向指針的指針指針數(shù)組和指向指針的指針 10.8 10.8 有關(guān)指針的數(shù)據(jù)類型和指針運算的小結(jié)有關(guān)指針的數(shù)據(jù)類型和指針運算的小結(jié)3 10.1 地址和指針的概念內(nèi)存區(qū)的每一個字節(jié)有一個編號,這就是“地址地址” 。如果在程序中定義了一個變量,

3、在對程序進(jìn)行編譯時,系統(tǒng)就會給這個變量分配內(nèi)存單元。 .按變量地址存取變量值的方式稱為“直接訪問直接訪問”方式 (,); (,); ; 4 10.1 地址和指針的概念2. 另一種存取變量值的方式稱為“間接訪問間接訪問”的方式。即,將變量的地址存放在另一個變量中。在語言中,指針是一種在語言中,指針是一種特殊的變量,它是存放地特殊的變量,它是存放地址的。址的。5 10.1 地址和指針的概念u一個變量的地址稱為該變量的一個變量的地址稱為該變量的“指針指針”。u例如,地址例如,地址2000是變量的指針。是變量的指針。u如果有一個變量專門用來存放另一變量的地址如果有一個變量專門用來存放另一變量的地址(即

4、指針),則它稱為(即指針),則它稱為“指針變量指針變量”。u上述的上述的i_pointer就是一個指針變量。就是一個指針變量。指針和指針變量的定義:指針和指針變量的定義:610.2 變量的指針和指向變量的指針變量o 變量的指針?o 指針變量?o 被指向變量?2000;2000;3;&i;i-point;* i-point;710.2 變量的指針和指向變量的指針變量10.2.1 定義一個指針變量定義一個指針變量定義指針變量的一般形式為基類型基類型 *指針變量名;指針變量名;下面都是合法的定義下面都是合法的定義:float *pointer_; char *pointer_; 可以用賦值語

5、句使一個指針變量得到另一個變量的地址,從而使它指向一個該變量。例如:例如:pointer_;pointer_;810.2 變量的指針和指向變量的指針變量o在定義指針變量時要注意兩點:在定義指針變量時要注意兩點:1.指針變量前面的“*”,表示該變量的類型為指針型變量。n例: float *pointer_1;n指針變量名是pointer_1 ,而不是* pointer_1 。n 2.在定義指針變量時必須指定基類型。n需要特別注意的是,只有同類型變量的地址才能放到指向該類型變量的指針變量中。下面的賦值是錯誤的n float a; n int * pointer_1; n pointer_1=&am

6、p;a; 910.2 變量的指針和指向變量的指針變量10.2.2 指針變量的引用指針變量的引用o 注意注意:指針變量中只能存放地址(指針),不要將一個整數(shù)(或任何其他非地址類型的數(shù)據(jù))賦給一個指針變量。例例10. 通過指針變量訪問整型變量通過指針變量訪問整型變量#include voidmain ( ) int ,; int *pointer_, *pointer_; ; pointer_; /*把變量的地址賦給pointer_1 */ 1010.2 變量的指針和指向變量的指針變量pointer_; /*把變量的地址賦給 pointer_ */printf(%,%,);printf(%,%,*

7、pointer_, *pointer_); 1110.2 變量的指針和指向變量的指針變量對對“”和和“* *”運算符說明:運算符說明:如果已執(zhí)行了語句 pointer_;(1)* pointer_的含義是什么?的含義是什么? “”和“*”兩個運算符的優(yōu)先級別相同,但按自右而左方向結(jié)合。因此,* pointer_與相同,即變量a的地址。 如果有pointer_2 * pointer_ ;它的作用是將(的地址)賦給pointer_2 ,如果pointer_2原來指向,經(jīng)過重新賦值后它已不再指向了,而指向了。1210.2 變量的指針和指向變量的指針變量(2) *的含義是什么?的含義是什么? 先進(jìn)行運

8、算,得的地址,再進(jìn)行*運算。*和*pointer_的作用是一樣的,它們都等價于變量。即*與等價。(3) (*pointer_)相當(dāng)于。)相當(dāng)于。pointer_+ ?13例例10 . 2 輸入和兩個整數(shù),按先大后小的順序輸出輸入和兩個整數(shù),按先大后小的順序輸出 和。和。#include void main() int *1,*2,*,; scanf(,);1; if();printf(=,=,); printf(max=,min=,*1,*2); 1410.2 變量的指針和指向變量的指針變量;&a&a&b運行情況如下:運行情況如下:,當(dāng)輸入,時,由于,將當(dāng)輸入,時,由于

9、,將和交換。交換前的情況見圖(),交換后和交換。交換前的情況見圖(),交換后見圖()。見圖()。1510.2 變量的指針和指向變量的指針變量10.2.3 指針變量作為函數(shù)參數(shù)指針變量作為函數(shù)參數(shù)o 函數(shù)的參數(shù)還可以為指針類型,它的作用是將一個變量的地函數(shù)的參數(shù)還可以為指針類型,它的作用是將一個變量的地址傳遞到另一個函數(shù)。址傳遞到另一個函數(shù)。例例10 . 3 對輸入的兩個整數(shù)按大小順序輸出對輸入的兩個整數(shù)按大小順序輸出 #include void main()void swap(int *,int *);int ,;int *pointer_,*pointer_; scanf(,);pointe

10、r_ ; pointer_2 ; if(swap( pointer_ , pointer_2 );printf(,); 1610.2 變量的指針和指向變量的指針變量void swap(int *,int *) int temp; temp *1; *; * temp; 1710.2 變量的指針和指向變量的指針變量void swap(int *,int *) int * temp; * temp*1; *; * temp; void swap(int x,int y) int temp; tempx; xy; ytemp; void swap(int *,int *) int * p; p1;

11、; p; 18例例10. 輸入、輸入、 3個整數(shù),按大小順序輸出。個整數(shù),按大小順序輸出。#include void main() void exchange(int *1, int *2, int *3); int ,*,*,*; scanf(%,%,%,&, &, &); exchange (,); printf(,); 19void exchange(int *, int *, int *) void swap(int *, int *); if(*) swap(,); if(*) swap(,); if(* swap(,); void swap(int *, i

12、nt *) int temp; temp*; *; *temp; 2010.3 數(shù)組與指針數(shù)組與指針n 變量有地址,一個數(shù)組包含若干元素,每個數(shù)組元變量有地址,一個數(shù)組包含若干元素,每個數(shù)組元素都在內(nèi)存中占用存儲單元,它們都有相應(yīng)的地址。素都在內(nèi)存中占用存儲單元,它們都有相應(yīng)的地址。n 指針變量既然可以指向變量,當(dāng)然也可以指向數(shù)組指針變量既然可以指向變量,當(dāng)然也可以指向數(shù)組元素(把某一元素的地址放到一個指針變量中)元素(把某一元素的地址放到一個指針變量中)n 所謂所謂數(shù)組元素的指針就是數(shù)組元素的地址數(shù)組元素的指針就是數(shù)組元素的地址。 2110.3 數(shù)組與指針數(shù)組與指針10.3.1 指向數(shù)組元素

13、的指針指向數(shù)組元素的指針o 定義一個指向數(shù)組元素的指針變量的方法,與以前介紹的指向變量的指針變量相同。n 例如:例如: ;n (定義為包含個整型數(shù)據(jù)的數(shù)組)n *; n (定義為指向整型變量的指針變量)o 應(yīng)當(dāng)注意,如果數(shù)組為型,則指針變量的基類型亦應(yīng)為型。2210.3 數(shù)組與指針數(shù)組與指針對該指針變量賦值:對該指針變量賦值:; 把元素的地址賦給指針變量。也就是使指向數(shù)組的第號元素,如圖:;是否可以?;是否可以?#include main()int a10=0,1,2,3,4,5,6,7,8,9;int *p;p=&a0;p+;printf(n%d,*p);p=&a;p+;pr

14、intf(n%d,*p);2310.3 數(shù)組與指針數(shù)組與指針10.3.2 通過指針引用數(shù)組元素通過指針引用數(shù)組元素引用一個數(shù)組元素,可以用:()() 下標(biāo)法,如形式;下標(biāo)法,如形式;()() 指針法,如指針法,如*()或()或*()()。其中是數(shù)組名,是指向數(shù)組元素的指針變量,其初值。例例10.5 輸出數(shù)組中的全部元素。輸出數(shù)組中的全部元素。 假設(shè)有一個數(shù)組,整型,有個元素。要輸出各元素的值有三種方法: 2410.3 數(shù)組與指針數(shù)組與指針o 如果指針變量P已經(jīng)指向數(shù)組中的一個元素n P+1的含義?o 如果指針P的初值是 &a0n P+i 和 a+i 的含義?n *(P+i) 和 *(a

15、+i) 的含義?n Pi與*(P+i)的含義?25(1)下標(biāo)法。下標(biāo)法。#include void main() int ; int;for(;)scanf(,); printf();for(;)printf(,); (2) 通過數(shù)組名計算數(shù)組元素地址,找出元素的值。通過數(shù)組名計算數(shù)組元素地址,找出元素的值。#include voidmain() int ; int ;for(; )scanf(,);printf(); for(;) printf(,*(); (3) 用指針變量指向數(shù)組元素。用指針變量指向數(shù)組元素。#include void main() int ; int *,; for(;

16、) scanf(,); printf(); for(;();) printf( ,*); 2610.3 數(shù)組與指針數(shù)組與指針o 上述三種方法效率,以及優(yōu)缺點的分析。o 在使用指針變量指向數(shù)組時的注意事項:1. 可以通過改變指針變量的值指向不同的數(shù)組元素,改變數(shù)組名的值是不行的(P+與a+的區(qū)別)。2. 要注意指針變量的當(dāng)前值。例例10. 通過指針變量輸出數(shù)組的個元素。通過指針變量輸出數(shù)組的個元素。 2710.3 數(shù)組與指針數(shù)組與指針#include void main() int *,;for(; )scanf(,); printf(); for(;, ) printf(,*);程序運行情況:

17、程序運行情況:1 2 3 4 5 6 7 8 9 0輸出?2810.3 數(shù)組與指針數(shù)組與指針3. 指針越界的問題(數(shù)組下標(biāo)溢出,系統(tǒng)非法操作。)4. 注意指針變量的運算n 當(dāng)P=a時o P+的含義,P+=1的含義o *P+的含義, *(P+)的含義o *(P+)的含義,*(+P)的含義o +(*P)的含義n 當(dāng)P=&ai時。 2910.3 數(shù)組與指針數(shù)組與指針10.3.3 用數(shù)組名作函數(shù)參數(shù)用數(shù)組名作函數(shù)參數(shù)在第在第8章章8.7節(jié)中介紹過可以用數(shù)組名作函數(shù)的參數(shù)節(jié)中介紹過可以用數(shù)組名作函數(shù)的參數(shù)如: void main() void(int arr,int ); int array;

18、(array,); void (int arr,int ) 3010.3 數(shù)組與指針數(shù)組與指針o 常用這種方法調(diào)用函數(shù),來改變實參數(shù)組的值常用這種方法調(diào)用函數(shù),來改變實參數(shù)組的值實參類型實參類型變量名數(shù)組名數(shù)組名要求形參的類型要求形參的類型變量名數(shù)組名或指針變量數(shù)組名或指針變量傳遞的信息傳遞的信息變量的值實參數(shù)組的首地址實參數(shù)組的首地址通過函數(shù)調(diào)用能否改變通過函數(shù)調(diào)用能否改變實參的值?實參的值?不能能能注,注,其實質(zhì)都是其實質(zhì)都是“值傳遞值傳遞”,一個是變量的值,一個是指針的值(即地址)。,一個是變量的值,一個是指針的值(即地址)。 實參數(shù)組名代表一個固定地址,是個指針常量。形參數(shù)組名并不是固

19、定地址,實參數(shù)組名代表一個固定地址,是個指針常量。形參數(shù)組名并不是固定地址, 其實質(zhì)為一個指針變量,可以被賦值的。其實質(zhì)為一個指針變量,可以被賦值的。3110.3 數(shù)組與指針數(shù)組與指針例例10.7 將數(shù)組中個整數(shù)按相反順序存放。將數(shù)組中個整數(shù)按相反順序存放。32#include void main() void inv(int ,int ); int , ,;printf(The original array:);for(;)printf (,);printf(); inv (,); printf(The array has been in verted:); for(;) printf (,

20、); printf ();3310.3 數(shù)組與指針數(shù)組與指針void inv(int ,int ) /*形參x是數(shù)組名*/ int temp,();for(;) ;temp; ; temp; return; 運行情況如下:運行情況如下:The original array:,The array has been inverted:,34改改造造一一下下35#include void main()void inv(int *,int ); int , ,; printf( The original array: ); for(;) printf (,); printf (); inv(,);(,

21、); printf ( The array has been in verted: ); for(;)printf (,);printf ();3610.3 數(shù)組與指針數(shù)組與指針void inv(int *,int ) /*形參x為指針變量*/int *,temp,*,*,(); ; for(;,) temp*;*;*temp;return;3710.3 數(shù)組與指針數(shù)組與指針o 如果有一個實參數(shù)組,想在函數(shù)中改變此數(shù)如果有一個實參數(shù)組,想在函數(shù)中改變此數(shù)組中的元素的值,實參與形參的對應(yīng)關(guān)系有組中的元素的值,實參與形參的對應(yīng)關(guān)系有以下種情況以下種情況(1) 形參和實參都用數(shù)組名,如:形參和實參都

22、用數(shù)組名,如:void main() void (int ,int ) int ; (,); 3810.3 數(shù)組與指針數(shù)組與指針(2) 實參用數(shù)組名,形參用指針變量。如:實參用數(shù)組名,形參用指針變量。如:void () void (int *,int )int ; (,); 3910.3 數(shù)組與指針數(shù)組與指針(3)實參形參都用指針變量。例如:實參形參都用指針變量。例如:void main() void (int *,int )int , *p=a; (p,); 4010.3 數(shù)組與指針數(shù)組與指針(4) 實參為指針變量,形參為數(shù)組名。如:實參為指針變量,形參為數(shù)組名。如: void main()

23、 void (int x ,int ) ,*p=a; (p,); 41#include void main() void inv(int *,int ); int ,*; printf(The original array:n ); for(;,)scanf(,);printf(); ; inv(,); /* 實參為指針變量實參為指針變量 */ printf(The array has been inverted :); for(; ) printf(,*); printf(); 千千 萬萬 注注 意意42例例109 用選擇法對個整數(shù)按由大到小順序排序。用選擇法對個整數(shù)按由大到小順序排序。 #

24、include void main() void sort(int ,int ); int *,10; ; for(;) scanf(,); ; sort(,); for(,;)(,*);43void sort(int ,int ) int ,; for(;);for(;)() ; (?。?; ; 4410.3 數(shù)組與指針數(shù)組與指針10.3.4 多維數(shù)組與指針多維數(shù)組與指針用指針變量可以指向一維數(shù)組中的元素,也可以指向多維數(shù)組中的元素。用指針變量可以指向一維數(shù)組中的元素,也可以指向多維數(shù)組中的元素。但在概念上和使用上,多維數(shù)組的指針比一維數(shù)組的指針要復(fù)雜一些。但在概念上和使用上,多維數(shù)組的指

25、針比一維數(shù)組的指針要復(fù)雜一些。 1. 1. 多維數(shù)組元素的地址多維數(shù)組元素的地址先回顧一下多維數(shù)組的性質(zhì)先回顧一下多維數(shù)組的性質(zhì),可以認(rèn)為二維數(shù)組是可以認(rèn)為二維數(shù)組是“數(shù)組的數(shù)組數(shù)組的數(shù)組”,例,例 :定義定義 int a34=1,3,5,7,9,11,13,15,17,19,21,23;則二維數(shù)組則二維數(shù)組a是由是由3個一維數(shù)組所組成的。設(shè)二維數(shù)組的首行的首地址為個一維數(shù)組所組成的。設(shè)二維數(shù)組的首行的首地址為 ,則,則45表表 示示 形形 式式含義含義地地 址址a 二維數(shù)組名,指向一維數(shù)組a0,即0行首地址2000a0,*(a+0),*a0行0列元素地址2000a+1+1,&a11行

26、首地址 (2016)a1,*(a+1)1行0列元素a10的地址(2016)a1+2+2,*(a+1)+2,&a121行2列元素a12 的地址(2024)*(a1+2),*(*(a+1)+2),a121行2列元素a12的值元素值為13?a+1和*(a+1)的含義是什么?46例例10.0 輸出二維數(shù)組有關(guān)的值輸出二維數(shù)組有關(guān)的值 #include define FROMATx,xvoid main() int 341,3,5,7,9, ,; printf(,*); printf(,0 , *();printf(,0,00);printf(,1,);printf(,10,*(+)+);pri

27、ntf(,*();printf(,); printf(,*(*( ); 47某一次運行結(jié)果如下:某一次運行結(jié)果如下:1244952,? (0行首地址和0行0列元素地址) ?,? (0行0列元素地址) ?,? (0行0首地址和0行0列元素地址) ?,? (1行0列元素地址和1行首地址) ?,? (1行0列元素地址) ?,? (2行0列元素地址) ?,? (2行首地址) ?,? (1行0列元素的值)4810.3 數(shù)組與指針數(shù)組與指針2 . 2 . 指向多維數(shù)組元素的指針變量指向多維數(shù)組元素的指針變量(1) 指向數(shù)組元素的指針變量指向數(shù)組元素的指針變量例例10.11 10.11 用指針變量輸出二維數(shù)

28、組元素的值用指針變量輸出二維數(shù)組元素的值 #include void main() int 341,3,5,7,9,11,13,15,17,19,21,23; int *; for(;) () printf(); printf(,*); 運行結(jié)果如下:運行結(jié)果如下:1 3 5 7 9 11 13 1519 21 23 4910.3 數(shù)組與指針數(shù)組與指針 (2) 指向由個元素組成的一維數(shù)組的指針變量指向由個元素組成的一維數(shù)組的指針變量例例10.13 10.13 出二維數(shù)組任一行任一列元素的值出二維數(shù)組任一行任一列元素的值#include void main ( ) int 1,3,5,7,9,1

29、1, 13,15,;int (*),),; ;scanf( ,); printf(, ,*(*()(); 運行情況如下:, (本行為鍵盤輸入),5010.3 數(shù)組與指針數(shù)組與指針o int (*)的含義)的含義是什么?是什么?n指向一個指向一個4個元素組成的個元素組成的一維數(shù)組的指針一維數(shù)組的指針nint a4 (表示(表示a有有4個個元素,每個元素為整型)元素,每個元素為整型)nint (*)(表)(表示示*p有有4個元素,每個個元素,每個元素為整型元素為整型)nint * 的含義?的含義?指針數(shù)組指針數(shù)組,表示表示p有有4個元個元素,每個元素是素,每個元素是 int *5110.3 數(shù)組與

30、指針數(shù)組與指針3. 用指向數(shù)組的指針作函數(shù)參數(shù)用指向數(shù)組的指針作函數(shù)參數(shù)o 一維數(shù)組名可以作為函數(shù)參數(shù)傳遞,多維一維數(shù)組名可以作為函數(shù)參數(shù)傳遞,多維數(shù)組也可以作為函數(shù)參數(shù)傳遞。數(shù)組也可以作為函數(shù)參數(shù)傳遞。n 用指向變量的指針;用指向變量的指針;n 用指向一維數(shù)組的的指針變量用指向一維數(shù)組的的指針變量5210.3 數(shù)組與指針數(shù)組與指針例10.13 有一個班,個學(xué)生,各學(xué)門課,計算總平均分?jǐn)?shù)以及第個學(xué)生的成績。u 這個題目是很簡單的。只是為了說明用指向數(shù)組的指針作函數(shù)參數(shù)而舉的例子。用函數(shù)average求總平均成績,用函數(shù)search找出并輸出第個學(xué)生的成績。5310.3 數(shù)組與指針數(shù)組與指針#i

31、nclude void main() void average(float *p,int n); void search(float (*p)4,int n); float score34=65,67,70,60,80, 87,90,81,90,99,100,98; average(*score,12);*求12個分?jǐn)?shù)的平均分* search(score,);*求序號為的學(xué)生的成績*54void average(float *,int ) float *_; float sum,aver; p_end; for(;_;) sumsum(*); aversum; printf(average,a

32、ver);5510.3 數(shù)組與指針數(shù)組與指針void search(float (*)4,int ) / * p是指向具有4個元素的一維數(shù)組的指針 */int ; printf(the score of No. % are:,); for(;) printf(5.2,*(*(); 程序運行結(jié)果如下:程序運行結(jié)果如下:averageThe score of No.2 are:.5610.3 數(shù)組與指針數(shù)組與指針例例10.4 在上題基礎(chǔ)上,查找有一門以上課程不及格的學(xué)生,在上題基礎(chǔ)上,查找有一門以上課程不及格的學(xué)生,打印出他們的全部課程的成績。打印出他們的全部課程的成績。 #include voi

33、d main()void search(float (*p)4,int n);/*函數(shù)聲明*/ float score34=65,57,70,60,58,87, 90,81,90,99,100,98; search(score,);57void search(float (*p)4,int )int ,; for(;) flag; for(;) if(*(*())flag; if() printf(No.%d fails,his scores are:n,j+1); for(;) printf(%.,*(*(); printf(); 程序運行結(jié)果如下:No.1 fails, his score

34、s are:. . . .No.2 fails, his scores are:. . . .10.3 數(shù)組與指針數(shù)組與指針o 課后思考題課后思考題o int a345 的含義是什么?o a111、 a11、 a1、a的含義?o a+1含義? o *a的含義? *(a+1)含義? *a+1含義?o *a的含義? *(a+1)含義?* (*a+1)含義? *( *a+1)+1)含義?10.3 數(shù)組與指針數(shù)組與指針o 接上頁的思考,如果需要定義指針o 與a同級的指針p1如何定義? p1+ 含義o 與*a同級的指針p2如何定義? p2+ 含義o 與*a同級的指針p3如何定義? p3+ 含義o p1、

35、p2、p3的換算關(guān)系是什么?6210.4 字符串與指針字符串與指針o 字符數(shù)組字符數(shù)組 char str; strI love China??;o 字符串指針字符串指針char * str;strI love China?。?? char str=I love China??;6310.4 字符串與指針字符串與指針10.4.字符串的表示形式字符串的表示形式(1) 用字符數(shù)組存放一個字符串,然后輸出該字符串。用字符數(shù)組存放一個字符串,然后輸出該字符串。例例 10.5 定義一個字符數(shù)組,對它初始化,定義一個字符數(shù)組,對它初始化, 然后輸出該字符串然后輸出該字符串 #include void main(

36、)char stringI love China?。?printf(,string); 6410.4 字符串與指針字符串與指針(2) 用字符指針指向一個字符串。用字符指針指向一個字符串。o 可以不定義字符數(shù)組,而定義一個字符指針。用字符指針指向字符串中的字符。例例106 定義字符指針定義字符指針#include void main()char * string I love China??;printf(,);例例10.16B 說明小例子(注意)說明小例子(注意) 65#include void main() char *string=I love China!; *string = U; /a

37、dded by LLC printf(%sn,string);#include void main() char Astring=I love China!; char *string; string=Astring; *string = U; /added by LLC printf(%sn,string);#include void main() char Astring=I love China!; *Astring = U; /added by LLC printf(%sn,string);66例例10.10.7 7 將字符串復(fù)制為字符串。將字符串復(fù)制為字符串。 #include vo

38、id ()char am a boy,20; int ; for(;(;*()?。ǎ?;);) *()()*();(); *()(); printf(string a is :,); printf(string b is:); for(;!;) printf(,); printf(); 6710.4 字符串與指針字符串與指針u 也可以設(shè)指針變量,用它的值的改變來指向字符串中的不同的字符。 例例10.8 用指針變量來處理例用指針變量來處理例107問題。問題。#include void main() char =I am a boy. ,20,*p1,*p2; int ; ; 6810.4 字符串

39、與指針字符串與指針for(;(;*!;p1,p2)*;*;printf(string is:,); printf( :);for(;?。唬?printf(,); printf();程序必須保證使和同步移動程序必須保證使和同步移動 69o 如何將一個字符串如何將一個字符串從一個函數(shù)傳遞到另一個函數(shù)?從一個函數(shù)傳遞到另一個函數(shù)?n 做法有幾種呢?做法有幾種呢?1、用字符數(shù)組作形參,傳遞字符數(shù)組名、用字符數(shù)組作形參,傳遞字符數(shù)組名2、用字符指針作形參,傳遞字符串首地址、用字符指針作形參,傳遞字符串首地址7010.4 字符串與指針字符串與指針10.4.2 字符指針作函數(shù)參數(shù)字符指針作函數(shù)參數(shù)(1) 用

40、字符數(shù)組作參數(shù)用字符數(shù)組作參數(shù)例例10.19 用函數(shù)調(diào)用實現(xiàn)字符串的復(fù)制用函數(shù)調(diào)用實現(xiàn)字符串的復(fù)制 #include void main() void copy_string(char from , char to ); char a = am a teacher; char =you are a student; printf(“string a= string , ,); printf(“copy string a to string b:n ”); copy_string (,); printf(nstring a=%snstring b=%sn,a,b); 7110.4 字符串與指針字

41、符串與指針void copy_string(char from , char to ) int ; while(from?。﹖ofrom;to; 程序運行結(jié)果如下程序運行結(jié)果如下: string aI am a teacher string b you are a student copy string a to string b:string a I am a teacherstringI am a teacher7210.4 字符串與指針字符串與指針(2) 形參用字符指針變量形參用字符指針變量#include void main() void copy_string(char * from

42、, char *); char * am a teacher .; char *you are a student ; printf(string a=string ,); printf(copy string a to string b:n ); _(,);(,); printf(nstring a=%snstring b=%sn,a,b); 例例10.19B 用函數(shù)調(diào)用實現(xiàn)字符串的復(fù)制用函數(shù)調(diào)用實現(xiàn)字符串的復(fù)制 常量區(qū)域常量區(qū)域, 錯錯 誤誤 了了!73void copy_string(char *from,char * to) for(;*from!;from,to)*to *from;

43、*to; (3) (3) 對對copy string 函數(shù)還可作簡化函數(shù)還可作簡化 1、將、將copy_string函數(shù)改寫為函數(shù)改寫為void copy_string (char *from,char *) while(*from)!) to;from; 74 copy_string函數(shù)的函數(shù)體還可改為函數(shù)的函數(shù)體還可改為 while(*to*from)?。?; copy_string函數(shù)的函數(shù)體還可寫成函數(shù)的函數(shù)體還可寫成 while(*from?。?to*from; *to; 75上面的上面的while語句還可以進(jìn)一步簡化為下面的語句還可以進(jìn)一步簡化為下面的while語語句:句:while

44、(*to*from);它與下面語句等價:while(*to*from)!);將*from賦給*to,如果賦值后的*to值等于則循環(huán)終止(已賦給*to) 函數(shù)體中函數(shù)體中while語句也可以改用語句也可以改用for語句:語句:for(;(*to*from)?。唬?;或for(;*to*from;);7610.4 字符串與指針字符串與指針也可用指針變量,函數(shù)也可用指針變量,函數(shù)copy_string可寫為可寫為void copy_string (char from ,char to )char *,*; from; to ;while(*p2*p1)?。?710.4 字符串與指針字符串與指針10.

45、4.3 對使用字符指針變量和字符數(shù)組的討論對使用字符指針變量和字符數(shù)組的討論(1) 含義不同:含義不同:字符數(shù)組由若干個元素組成,每個元素中放一個字符,而字符指針變量中存放的是地址(字符串第1個字符的地址),決不是將字符串放到字符指針變量中。(2) 賦值方式不同:賦值方式不同:對字符數(shù)組只能對各個元素賦值,不能用以下辦法對字符數(shù)組賦值。 char str; strI love China??; 而對字符指針變量,可以采用下面方法賦值: char *; I love China?。?字符數(shù)組和字符指針變量二者之間的區(qū)別:字符數(shù)組和字符指針變量二者之間的區(qū)別:7810.4 字符串與指針字符串與指針(

46、3)對字符指針變量賦初值含義賦初值含義: char * love China??;等價于 char *; I love China??; 而對數(shù)組的初始化: char str love China!; 不能等價于 char str; str I love China??;7910.4 字符串與指針字符串與指針(4) 定義了一個字符數(shù)組,在編譯時為它分配內(nèi)存單元,它有確定的地址。而定義一個字符指針變量時,給指針變量分配內(nèi)存單元,在其中可以放一個字符變量的地址。 例如例如: : char str; scanf(,str););例如例如: : char *a ; scanf(,a););8010.4 字符

47、串與指針字符串與指針(5) 指針變量的值是可以改變的,例如:例例10.0改變指針變量的值改變指針變量的值#include void ()char *I love China??; ; printf(,); 8110.4 字符串與指針字符串與指針#include voidmain()char * love hina!; int ; printf ( “ The sixth character is %cn,a5); for(;?。唬?printf(,); 若定義了一個指針變量,并使它指向一個字符串,就可以用下標(biāo)形式引用指針變量所指的字符串中的字符。例例10.21 : 8210.5 指向函數(shù)的指針指

48、向函數(shù)的指針10.5.1 用函數(shù)指針變量調(diào)用函數(shù)用函數(shù)指針變量調(diào)用函數(shù)o 用指針變量可以指向一個函數(shù)。o 函數(shù)在編譯時被分配給一個入口地址。這個函數(shù)的入口地址就稱為函數(shù)的指針函數(shù)的指針。o 一般調(diào)用方法 例子8310.5 指向函數(shù)的指針指向函數(shù)的指針#include voidmain() int max(int,int); int ,;scanf(,); (,);(,);printf(, ,); int max(int ,int ) int ; if();else ; return(); 8410.5 指向函數(shù)的指針指向函數(shù)的指針將 main 函數(shù)改寫為#include voidmain()

49、int (int,int); int (*)()( int,int );); /定義函數(shù)指針定義函數(shù)指針 int ,; ; /獲取程序入口地址獲取程序入口地址 scanf(,); (*)(,);)(,);/通過指針調(diào)用通過指針調(diào)用 printf(, ,); 8510.5 指向函數(shù)的指針指向函數(shù)的指針10.5.2 用指向函數(shù)的指針作函數(shù)參數(shù)用指向函數(shù)的指針作函數(shù)參數(shù)n函數(shù)指針變量常用的用途之一是把指針作為參數(shù)傳遞到其他函數(shù)。指向函數(shù)的指針也可以作為參數(shù),以實現(xiàn)函數(shù)地址的傳遞,這樣就能夠在被調(diào)用的函數(shù)中使用實參函數(shù)。8610.5 指向函數(shù)的指針指向函數(shù)的指針 實參函數(shù)名 f1 void (int

50、(*x1)(int),int (*x2)(int,int)) int ,; (*)(); *調(diào)用函數(shù)* (*)(,);*調(diào)用函數(shù)* int f1(int);int f2(int,int)void sub(int (*x1)(int),int (*x2)(int,int))8710.5 指向函數(shù)的指針指向函數(shù)的指針例例10.10.3 3 設(shè)一個函數(shù)設(shè)一個函數(shù)processprocess,在調(diào)用它的時候,每次,在調(diào)用它的時候,每次實現(xiàn)不同的功能。輸入和兩個數(shù),第一次調(diào)用實現(xiàn)不同的功能。輸入和兩個數(shù),第一次調(diào)用processprocess時找出和中大者,第二次找出其中小者,時找出和中大者,第二次找出

51、其中小者,第三次求與之和。第三次求與之和。 #include void main() int max(int,int); /* 函數(shù)聲明 */ int min(int,int); /* 函數(shù)聲明 */ int add(int,int); /* 函數(shù)聲明 */ void process (int , int , int(*fun)(); /* 函數(shù)聲明 */ int ,; printf(enter a and b:); scanf(,);8810.5 指向函數(shù)的指針指向函數(shù)的指針printf(max); process(,);printf(min);process(,);printf(sum);

52、process(,);8910.5 指向函數(shù)的指針指向函數(shù)的指針int max(int ,int ) /* 函數(shù)定義 */int ; if(); else ; return();int min(int ,int ) /* 函數(shù)定義 */ int ; if();else ;return(); int (int ,int ) /* 函數(shù)定義 */ int; ; return();void process(int ,int ,int (*fun)(int,int) int result; result(*fun)(,); printf(, result);9010.6 返回指針值的函數(shù)返回指針值的函

53、數(shù)o 一個函數(shù)可以帶回一個整型值、字符值、實型值等,也可以帶回指針型的數(shù)據(jù),即地址。其概念與以前類似,只是帶回的值的類型是指針類型而已。o 這種帶回指針值的函數(shù),一般定義形式為n 類型名類型名 * 函數(shù)名(參數(shù)表列)函數(shù)名(參數(shù)表列);n 例如:int *(int ,int );9110.6 返回指針值的函數(shù)返回指針值的函數(shù)例例10104 4 有若干個學(xué)生的成績(每個學(xué)生有門課有若干個學(xué)生的成績(每個學(xué)生有門課程),要求在用戶輸入學(xué)生序號以后,能輸出該學(xué)生程),要求在用戶輸入學(xué)生序號以后,能輸出該學(xué)生的全部成績。用指針函數(shù)來實現(xiàn)。的全部成績。用指針函數(shù)來實現(xiàn)。 #include void ma

54、in()float score 4=60,70,80,90, 56,89,67,88,34,78,90,66; float * search(float (*pointer)4,int n); float *; int ,; printf(enter the number of student:); scanf(,); printf(The scores of No are:,); 9210.6 返回指針值的函數(shù)返回指針值的函數(shù) search(,);for(;printf(,*(); float * search(float (*)4,int ) float * pt; pt *(); ret

55、urn(pt); 運行情況如下:運行情況如下:enter the number of student:The scores of No. are:56.00 89.00 67.00 88.00思考思考: p,pointer,pt區(qū)別區(qū)別9310.6 返回指針值的函數(shù)返回指針值的函數(shù)例例10.5 對上例中的學(xué)生,找出其中有不及格課對上例中的學(xué)生,找出其中有不及格課程的學(xué)生及其學(xué)生號。程的學(xué)生及其學(xué)生號。#include void main()float score 4=60,70,80,90,56, 89,67,88,34,78,90,66; float search(float (*point

56、er)4); float *; i ,; 9410.6 返回指針值的函數(shù)返回指針值的函數(shù)for(;)search(score );(*(score)printf(scores:,); for(;) printf(5.2,*(); printf(); 9510.6 返回指針值的函數(shù)返回指針值的函數(shù)float *search (float (*pointer)4) int i;float *pt;pt=*(pointer+1);for(i=0;i4;i+) if(*(*pointer+i)60) pt=*pointer; return(pt); 思考思考: p,pointer,pt區(qū)別區(qū)別9610

57、.7 指針數(shù)組和指向指針的指針指針數(shù)組和指向指針的指針10.7.1 指針數(shù)組的概念指針數(shù)組的概念一個數(shù)組,若其元素均為指針類型數(shù)據(jù),稱為指針數(shù)組指針數(shù)組,也就是說,指針數(shù)組中的每一個元素都相當(dāng)于一個指針變量。一維指針數(shù)組的定義形式為一維指針數(shù)組的定義形式為: :類型名類型名 * 數(shù)組名數(shù)組長度;數(shù)組名數(shù)組長度;例如:例如: *;數(shù)組指針什么樣子呢?數(shù)組指針什么樣子呢?指針數(shù)組什么樣子呢?指針數(shù)組什么樣子呢?例如:例如: (*) ;979810.7 指針數(shù)組和指向指針的指針指針數(shù)組和指向指針的指針例例10.6 將若干字符串按字母順序(由小到大)輸出。將若干字符串按字母順序(由小到大)輸出。#in

58、clude #include void main()void sort(char *name ,int n); void printf(char *name ,int n); char *name =Follow me,BASIC,Great Wall,F(xiàn)ORTRAN,Computer design; int ;sort(,); print(,);9910010.7 指針數(shù)組和指向指針的指針指針數(shù)組和指向指針的指針void sort(char * ,int )char *; int ,; for(;); for(;) if(strcmp(name,name)0)=; if(!) temp=na

59、mei; namei=namek; namek=temp; 10110.7 指針數(shù)組和指向指針的指針指針數(shù)組和指向指針的指針void print(char * ,int ) ; (;) printf(,); 運行結(jié)果為:運行結(jié)果為:Computer designFORTRANFollow meGreat Wall10210.7 指針數(shù)組和指向指針的指針指針數(shù)組和指向指針的指針o 10.7.2 指向指針的指針指向指針的指針定義一個指向指針數(shù)據(jù)的指針變量定義一個指向指針數(shù)據(jù)的指針變量:char * * p;的前面有兩個*號。*運算符的結(jié)合性是從右到左,因此*相當(dāng)于*(*),顯然*是指針變量的定義形

60、式。如果沒有最前面的*,那就是定義了一個指向字符數(shù)據(jù)的指針變量。現(xiàn)在它前面又有一個*號,表示指針變量是指向一個字符指針變量的。*就是所指向的另一個指針變量。10310.7 指針數(shù)組和指向指針的指針指針數(shù)組和指向指針的指針例例10.7 使用指向指針的指針。使用指向指針的指針。 #include void main()char *name=Follow me,BASIC,Great Wall,F(xiàn)ORTRAN,Computer design; char *; int ; for(;); printf(,*); 10410.7 指針數(shù)組和指向指針的指針指針數(shù)組和指向指針的指針例例10.28 一個指針數(shù)組的元素指向整型數(shù)據(jù)的簡單例子一個指針數(shù)組的元素指向整型數(shù)據(jù)的簡單例子。#include void main()int ,; int *

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論