c語(yǔ)言程序設(shè)計(jì)第三版譚浩強(qiáng)第十章指針.ppt
《c語(yǔ)言程序設(shè)計(jì)第三版譚浩強(qiáng)第十章指針.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《c語(yǔ)言程序設(shè)計(jì)第三版譚浩強(qiáng)第十章指針.ppt(110頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、第十章,指針,10.1地址和指針的概念,為了說清楚什么是指針,必須弄清楚數(shù)據(jù)在內(nèi)存中是如何存儲(chǔ)的,又是如何讀取的。,內(nèi)存區(qū)的每一個(gè)字節(jié)有一個(gè)編號(hào),這就是“地址” 。如果在程序中定義了一個(gè)變量,在對(duì)程序進(jìn)行編譯時(shí),系統(tǒng)就會(huì)給這個(gè)變量分配內(nèi)存單元。,、按變量地址存取變量值的方式稱為“直接訪問”方式,另一種存取變量值的方式稱為“間接訪問”的方式。即,將變量的地址存放在另一個(gè)變量中。,在語(yǔ)言中,指針是一種特殊的變量,它是存放地址的。假設(shè)我們定義了一個(gè)指針變量i_pointer用來存放整型變量的地址,它被分配地址為(3010)、(3011)的兩個(gè)字節(jié)。可以通過語(yǔ)句:i_pointer ; 將的地址(20
2、00)存放到i_pointer中。這時(shí), i_pointer的值就是(2000) ,即變量所占用單元的起始地址。要存取變量的值,可以采用間接方式:先找到存放“的地址”的變量i_pointer ,從中取出的地址(2000),然后到2000 、 200字節(jié)取出的值()。,一個(gè)變量的地址稱為該變量的“指針”。 例如,地址2000是變量的指針。如果有一個(gè)變量專門用來存放另一變量的地址(即指針),則它稱為“指針變量”。上述的i_pointer就是一個(gè)指針變量。,指針和指針變量的定義:,指針變量的值(即指針變量中存放的值)是地址(即指針)。請(qǐng)區(qū)分“指針”和“指針變量”這兩個(gè)概念。,10.2 變量的指針和指
3、向變量的指針變量,10..1 定義一個(gè)指針變量,定義指針變量的一般形式為 基類型 *指針變量名;,下面都是合法的定義: float *pointer_; // pointer_是指向float型變量的指針變量 char *pointer_; //pointer_是指向字符型變量的指針變量 可以用賦值語(yǔ)句使一個(gè) 指針變量得到另一個(gè)變 量的地址,從而使它指 向一個(gè)該變量。如: pointer_; pointer_;,在定義指針變量時(shí)要注意兩點(diǎn):,10.. 指針變量的引用,請(qǐng)牢記,指針變量中只能存放地址(指針), 不要將一個(gè)整數(shù)(或任何其他非地址類型的數(shù)據(jù)) 賦給一個(gè)指針變量。,例10. 通過指針
4、變量訪問整型變量,#include voidmain ( ) int ,; int*pointer_, *pointer_; ;; pointer_; /*把變量的地址賦給 pointer_1 */,pointer_; /*把變量的地址賦給 pointer_ */ printf(%,%,,); printf(%,%,*pointer_, *pointer_); ,對(duì)“”和“*”運(yùn)算符說明: 如果已執(zhí)行了語(yǔ)句 pointer_; (1)* pointer_的含義是什么?“”和“*”兩個(gè)運(yùn)算符的優(yōu)先級(jí)別相同,但按自右而左方向結(jié)合,因此先進(jìn)行* poi
5、nter_的運(yùn)算,它就是變量,再執(zhí)行運(yùn)算。因此,* pointer_與相同,即變量a的地址。如果有pointer_2 * pointer_ ; 它的作用是將(的地址)賦給pointer_2 ,如果pointer_2原來指向,經(jīng)過重新賦值后它已不再指向了,而指向了。,(2) *的含義是什么?先進(jìn)行運(yùn)算,得的地址,再進(jìn)行*運(yùn)算。即所指向的變量,也就是變量a。*和*pointer_的作用是一樣的,它們都等價(jià)于變量。即*與等價(jià)。,(3) (*pointer_)相當(dāng)于。注意括號(hào)是必要的,如果沒有括號(hào),就成為了*pointer_,從附錄可知:++和*為同一優(yōu)先級(jí)別,而結(jié)合方向?yàn)樽杂叶?,因此它相?dāng)于*(p
6、ointer_)。由于++在pointer_1的右側(cè),是“后加”,因此先對(duì)pointer_的原值進(jìn)行*運(yùn)算,得到的值,然后使pointer_的值改變,這樣pointer_不再指向了。,例10 . 2 輸入和兩個(gè)整數(shù),按先大后小的順序輸出 和。,#include void main() int *1,*2,*,,; scanf(,,,); 1;; if() ;;; printf(=,=,,); printf(max=,min=,*1,*2); ,運(yùn)行情況如下: , , , 當(dāng)輸入,時(shí),由于,將和交換。交換前的情況見圖(),交換后見圖()。,10..3 指針變量作為函數(shù)參數(shù),例10 . 3
7、 對(duì)輸入的兩個(gè)整數(shù)按大小順序輸出,#include void main() void swap(int *,int *); int ,; int *pointer_,*pointer_; scanf(,,,); pointer_ ; pointer_2 ; if(swap( pointer_ , pointer_2 ); printf(,,,); ,void swap(int *,int *) int temp; temp*1; **; *temp; ,,,,例10. 輸入、、 3個(gè)整數(shù),按大小順序輸出,#include void main() void exchange(int *1
8、, int *2, int *3); int ,,,*,*,*; scanf(%,%,%, if(**) swap(,); if(**) swap(,); if(** swap(,); void swap(int *, int *) int temp; temp*; **; *temp; ,10.3 數(shù)組與指針,一個(gè)變量有地址,一個(gè)數(shù)組包含若干元素,每個(gè)數(shù)組元素都在內(nèi)存中占用存儲(chǔ)單元,它們都有相應(yīng)的地址。指針變量既然可以指向變量,當(dāng)然也可以指向數(shù)組元素(把某一元素的地址放到一個(gè)指針變量中)。所謂數(shù)組元素的指針就是數(shù)組元素的地址。,定義一個(gè)指向數(shù)組元素的指針變量的方法,與以前介紹的指
9、向變量的指針變量相同。例如: ; (定義為包含個(gè)整型數(shù)據(jù)的數(shù)組) *; (定義為指向整型變量的指針變量) 應(yīng)當(dāng)注意,如果數(shù)組為型,則指針變量的基類型亦應(yīng)為型。,10.3.1 指向數(shù)組元素的指針,對(duì)該指針變量賦值: ; 把元素的地址賦給指針變量。也就是使指向數(shù)組的第號(hào)元素,如圖:,10..通過指針引用數(shù)組元素,引用一個(gè)數(shù)組元素,可以用: () 下標(biāo)法,如形式; () 指針法,如*()或*()。其中是數(shù)組名,是指向數(shù)組元素的指針變量,其初值。,例10.5 輸出數(shù)組中的全部元素,假設(shè)有一個(gè)數(shù)組,整型,有個(gè)元素。要輸出各元素的值有三種方法:,(1)下標(biāo)法 #include void main() i
10、nt ; int; for(;;) scanf(,); printf(); for(;;) printf(,); ,(2) 通過數(shù)組名計(jì)算數(shù)組元素地址,找出元素的值。 #include voidmain() int ; int ; for(;; ) scanf(,); printf(); for(;;) printf(,*()); ,(3) 用指針變量指向數(shù)組元素。 #include void main() int ; int *,; for(;;) scanf(,); printf(); for(;();) printf( ,*); ,例10. 通過指針變量輸出數(shù)組的個(gè)元素。,有人
11、編寫出以下程序: #include void main() int*,,; ; for(;; ) scanf(,); printf(); for(;;, ) printf(,*); ,這個(gè)程序乍看起來好像沒有什么問題。有的人即使已被告知此程序有問題,還是找不出它有什么問題。我們先看一下運(yùn)行情況: 1 2 3 4 5 6 7 8 9 0 22153 234 0 0 30036 25202 11631 8259 8237 28483 顯然輸出的數(shù)值并不是數(shù)組中各元素的值,解決這個(gè)問題的辦法,只要在第二個(gè)循環(huán)之前加一個(gè)賦值語(yǔ)句: ;,#include void main() int*,,; ; f
12、or(;;) scanf(,); printg(); p=a; for(;;, ) printf(,*); ,10..3 用數(shù)組名作函數(shù)參數(shù),在第8章8.7節(jié)中介紹過可以用數(shù)組名作函數(shù)的參數(shù) 如: void main() i(int ,int ); int ; (,); void (int ,int ) ,f (int arr , int n) 但在編譯時(shí)是將arr按指針變量處理的,相當(dāng)于將函數(shù)f的首部寫成 f (int *arr, int n) 以上兩種寫法是等價(jià)的。,需要說明的是:C語(yǔ)言調(diào)用函數(shù)時(shí)虛實(shí)結(jié)合的方法都是采用“值傳遞”方
13、式,當(dāng)用變量名作為函數(shù)參數(shù)時(shí)傳遞的是變量的值,當(dāng)用數(shù)組名作為函數(shù)參數(shù)時(shí),由于數(shù)組名代表的是數(shù)組首元素地址,因此傳遞的值是地址,所以要求形參為指針變量。,例10 將數(shù)組中個(gè)整數(shù)按相反順序存放,#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 (,,); print
14、f (); ,void inv(int ,int ) /*形參x是數(shù)組名*/ int temp,,,(); for(;;) ; temp; ; temp; return; ,運(yùn)行情況如下: The original array: ,,,,,,,,,, The array has been inverted: ,,,,,,,,,,,#include void main() void inv(int *,int ); int ,,,,,, ,,,,; printf( The original array: ); for(;;) prin
15、tf (,,); printf (); inv(,); printf ( The array has been in verted: ); for(;;) printf (,,); printf ();,對(duì)這個(gè)程序可以作一些改動(dòng)。將函數(shù)inv中的形參改成指針變量。,void inv(int *,int ) /*形參x為指針變量*/ int,temp,*,*,(); ;;; for(;;,) emp*;**;*temp; return; ,歸納起來,如果有一個(gè)實(shí)參數(shù)組,想在函數(shù)中改變此數(shù)組中的元素的值,實(shí)參與形參的對(duì)應(yīng)關(guān)系有以下種情況:,(1) 形參和實(shí)參都用數(shù)組名,如: void main()
16、 void (int ,int ) int ; (,); ,(2) 實(shí)參用數(shù)組名,形參用指針變量。如: void () void (int *,int ) int ; (,); ,(3)實(shí)參形參都用指針變量。例如: void main() void (int *,int ) int , *p=a; (p,); ,(4) 實(shí)參為指針變量,形參為數(shù)組名。如: void main() void (int x ,int ) ,*p=
17、a; (p,); ,,#include void main() void inv(int *,int ); int ,,*; printf(The original array:n ); for(;;,) scanf(,); printf(); ; inv(,); /* 實(shí)參為指針變量 */ printf(The array has been inverted :); for(;; ) printf(,*); printf(); ,void inv(int *,int ) int,,temp,*,*; (); ;;; for(;;,)
18、 emp*;**;*temp; return; ,例109 用選擇法對(duì)個(gè)整數(shù)按由大到小順序排序,#include void main() void sort(int ,int ); int*,,10; ; for(;;) scanf(,); ; sort(,); for(,;;) (,*);; ,void sort(int ,int ) int ,,,; for(;;) ; for(;;) () ; (?。?; ; ; ,10.. 多維數(shù)組與指針,用指針變量可以指向一維數(shù)組中的元素,也可以指向多維數(shù)組中的元素。但在概念上和使用上,多維數(shù)組的指針比一維數(shù)組的指針要
19、復(fù)雜一些。,1. 多維數(shù)組元素的地址,先回顧一下多維數(shù)組的性質(zhì),可以認(rèn)為二維數(shù)組是“數(shù)組的數(shù)組”,例 : 定義int a34=1,3,5,7,,,,,,,,; 則二維數(shù)組a是由3個(gè)一維數(shù)組所組成的。設(shè)二維數(shù)組的首行的首地址為 ,則,例10.0 輸出二維數(shù)組有關(guān)的值,#include define FROMAT, void main() int 341,3,5,7,9,,, ,,,,; printf(,,*); printf(,0 , *()); printf(,0,00); printf(,1,); printf(,10,*(+)+); printf(,,*()); prin
20、tf(,,); printf(,,*(*( ))); ,某一次運(yùn)行結(jié)果如下: , (0行首地址和0行0列元素地址) , (0行0列元素地址) , (0行0首地址和0行0列元素地址) , (1行0列元素地址和1行首地址) , (1行0列元素地址) , (2行0列元素地址) , (2行首地址) , (1行0列元素的值),2 . 指向多維數(shù)組元素的指針變量,在了解上面的概念后,可以用指針變量指向多維數(shù)組的元素。 (1) 指向數(shù)組元素的指針變量,例10.11 用指針變量輸出二維數(shù)組元素的值,#include void main() i
21、nt 341,3,5,7,9,11,13,15,17,19,21,23; int*; for(;;) (()) printf(); printf(,*); ,運(yùn)行結(jié)果如下: 1 3 5 7 9 11 13 15 19 21 23,可將程序最后兩個(gè)語(yǔ)句改為 printf(addr, value2,,*); 在TC++環(huán)境下某一次運(yùn)行時(shí)輸出如下: , , , , , , , , , , , ,,(2) 指向由個(gè)元素組成的一維數(shù)組的指針變量,例10.13 出二維數(shù)組任一行任一列元素的值,#include void main ( ) int 1,3,5,7,9,11, 13,15,,,,;
22、 int (*),,; ; scanf( ,,,); printf(,,, ,*(*())); ,運(yùn)行情況如下: , (本行為鍵盤輸入) ,,運(yùn)行情況如下: ,(本行為鍵盤輸入) ,,3. 用指向數(shù)組的指針作函數(shù)參數(shù),例10.13 有一個(gè)班,個(gè)學(xué)生,各學(xué)門課,計(jì)算總平均分?jǐn)?shù)以及第個(gè)學(xué)生的成績(jī)。這個(gè)題目是很簡(jiǎn)單的。只是為了說明用指向數(shù)組的指針作函數(shù)參數(shù)而舉的例子。用函數(shù)求總平均成績(jī),用函數(shù)找出并輸出第個(gè)學(xué)生的成績(jī)。,#include void main() void average(float *p,int n); void search(float (*p)4,int n)
23、; float score34=65,67,70,60,80, 87,90,81,90,99,100,98; average(*score,12);*求12個(gè)分?jǐn)?shù)的平均分* search(score,);*求序號(hào)為的學(xué)生的成績(jī)* ,void average(float *,int ) float*_; float ,; _; (;_;) (*); ; printf(average,aver); ,void search(float (*)4,int ) / * p是指向具有4個(gè)元素的一維數(shù)組的指針 */int ; printf(the score of No. % ar
24、e:,); for(;;) printf(5.2,*(*())); 程序運(yùn)行結(jié)果如下: : ....,例10.4 在上題基礎(chǔ)上,查找有一門以上課程不及格的學(xué)生,打印出他們的全部課程的成績(jī)。,#include void 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,); ,void search(float (*p)4,int ) int ,,; for(;;) flag; for(;
25、;) if(*(*()))flag; if() printf(No.%d fails,his scores are:n,j+1); for(;;) printf(%.,*(*())); printf(); ,程序運(yùn)行結(jié)果如下: s, : . . . . s, . . . .,10. 字符串與指針,10字符串的表示形式,例 10.5 定義一個(gè)字符數(shù)組,對(duì)它初始化, 然后輸出該字符串,#include void main() char string ?。? printf(,); ,(1) 用字符數(shù)組存放一個(gè)字符串,然后輸出該字符串。,(2) 用字符指針指
26、向一個(gè)字符串,可以不定義字符數(shù)組,而定義一個(gè)字符指針。用字符指針指向字符串中的字符。 例106 定義字符指針 #include void main() charstring !; printf(,); ,例10.7 將字符串復(fù)制為字符串,對(duì)字符串中字符的存取,可以用下標(biāo)方法,也可以用指針方法,#include void () char am a boy,20; int ; for(;*()?。唬? *()*(); *(); printf(string a is :,); printf( :); for(;??;) printf(,); printf(); ,也可以設(shè)指針變量,用它
27、的值的改變來指向字符串中的不同的字符。,例10.8 用指針變量來處理例107問題。,#include void main() char =I am a boy. ,20,*p1,*p2; int ; ;; for(;*!;p1,p2),**; *; printf(string is:,); printf( :); for(;??;) printf(,); printf(); ,程序必須保證使和同步移動(dòng)。,10.. 字符指針作函數(shù)參數(shù),例1019 用函數(shù)調(diào)用實(shí)現(xiàn)字符串的復(fù)制,#include void main() void copy_string(char from , char to )
28、; 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); ,(1) 用字符數(shù)組作參數(shù),void copy_string(char from , char to ) int ; while(?。?;; ; ,程序運(yùn)行結(jié)果如下: copy string a to string b: ,
29、() 形參用字符指針變量,#include void main() void copy_string(char *, char *); char * am a teacher .; char *you are a student ; printf(string a= ,,); printf(copy string a to string b:n ); _(,); printf(nstring a=%snstring b=%sn,a,b); ,void copy_string(char *,char *) for(;*from??;from,to) *; *; ,() 對(duì) copy_
30、string 函數(shù)還可作簡(jiǎn)化,1、將copy_string函數(shù)改寫為 void copy_string (char *,char *) while((**)!) ;; ,2、 copy_string函數(shù)的函數(shù)體還可改為 while((*to*from)!); ,3、copy_string函數(shù)的函數(shù)體還可寫成 while(*?。?**; *; ,4、上面的while語(yǔ)句還可以進(jìn)一步簡(jiǎn)化為下面的while語(yǔ)句: while(**); 它與下面語(yǔ)句等價(jià): while((*to*from)?。?將*賦給*,如果賦值后的*值等于,則循環(huán)終止(已賦給*),5、函數(shù)體中語(yǔ)句也可以改用語(yǔ)句: for
31、(;(*to*from)??;); 或 for(;*to*from;);,6、也可用指針變量,函數(shù)copy_string可寫為 void copy_string (char from ,char ) *,*; ;; while((*p2*p1)?。?,10.. 對(duì)使用字符指針變量和字符數(shù)組的討論,雖然用字符數(shù)組和字符指針變量都能實(shí)現(xiàn)字符串的存儲(chǔ)和運(yùn)算,但它們二者之間是有區(qū)別的,不應(yīng)混為一談,主要有以下幾點(diǎn):,(1) 字符數(shù)組由若干個(gè)元素組成,每個(gè)元素中放一個(gè)字符,而字符指針變量中存放的是地址(字符串第1個(gè)字符的地址),決不是將字符串放到字符指針變量中。 (2)賦值方式。對(duì)字符數(shù)組只能對(duì)各個(gè)元
32、素賦值,不 能用以下辦法對(duì)字符數(shù)組賦值。 char str; str ??; 而對(duì)字符指針變量,可以采用下面方法賦值: char*; ??; 但注意賦給的不是字符,而是字符串第一個(gè)元素 的地址。,(3)對(duì)字符指針變量賦初值: char * love China??;等價(jià)于 char*; ?。? 而對(duì)數(shù)組的初始化: char str love China!; 不能等價(jià)于 char str; str ??;,(4) 如果定義了一個(gè)字符數(shù)組,在編譯時(shí)為它分配內(nèi)存單元,它有確定的地址。而定義一個(gè)字符指針變量時(shí),給指針變量分配內(nèi)存單元,在其中可以放一個(gè)字符變量的地址也就是說,
33、該指針變量可以指向一個(gè)字符型數(shù)據(jù),但如果未對(duì)它賦予一個(gè)地址值,則它并未具體指向一個(gè)確定的字符數(shù)據(jù)。,如: char str; scanf(,str);是可以的。 而常有人用下面的方法,目的是想輸入一個(gè)字符串,雖然一般也能運(yùn)行,但這種方法是危險(xiǎn)的 : char*; scanf(,);,應(yīng)當(dāng)這樣: *,; ; (,);,(5) 指針變量的值是可以改變的,如:,例10.0改變指針變量的值,#include void () char*I love China??; ; printf(,); ,需要說明,若定義了一個(gè)指針變量,并使它指向一個(gè)字符串,就可以用下標(biāo)形式引用指針變量所指的字符串中的
34、字符。例101 #include voidmain() char* love hina!; int ; printf ( “ The sixth character is %cn,a5); for(;??;) printf(,); ,10. 指向函數(shù)的指針,10.. 用函數(shù)指針變量調(diào)用函數(shù),可以用指針變量指向整型變量、字符串、數(shù)組,也可以指向一個(gè)函數(shù)。一個(gè)函數(shù)在編譯時(shí)被分配給一個(gè)入口地址。這個(gè)函數(shù)的入口地址就稱為函數(shù)的指針。,例10.2 求和中的大者。先列出按一般 方法的程序。,#include voidmain() int max(int,int); int ,,; scan
35、f(,,,); (,); printf(,, ,,,); int max(int ,int ) int ; if(); else ; return(); ,將 main 函數(shù)改寫為 #include voidmain() int (int,int); int (*)(); int ,,; ; scanf(,,,); (*)(,); printf(,, ,,,); ,10.. 用指向函數(shù)的指針作函數(shù)參數(shù),函數(shù)指針變量常用的用途之一是把指針作為參數(shù)傳遞到其他函數(shù)。前面介紹過,函數(shù)的參數(shù)可以是變量、指向變量的指針變量、數(shù)組名、指向數(shù)組的指針變量等?,F(xiàn)在介紹指向函數(shù)的
36、指針也可以作為參數(shù),以實(shí)現(xiàn)函數(shù)地址的傳遞,這樣就能夠在被調(diào)用的函數(shù)中使用實(shí)參函數(shù)。它的原理可以簡(jiǎn)述如下:有一個(gè)函數(shù)(假設(shè)函數(shù)名為sub),它有兩個(gè)形參(x1和x2),定義x1和x2為指向函數(shù)的指針變量。在調(diào)用函數(shù)sub時(shí),實(shí)參為兩個(gè)函數(shù)名和,給形參傳遞的是函數(shù)和的地址。這樣在函數(shù)中就可以調(diào)用和函數(shù)了。,實(shí)參函數(shù)名 f1 void (int (*x1)(int),int (*x2)(int,int)) int ,,,; (*)(); *調(diào)用函數(shù)* (*)(,);*調(diào)用函數(shù)* ,例10.3 設(shè)一個(gè)函數(shù)process,在調(diào)用它的時(shí)候,每次實(shí)現(xiàn)不同的功能。輸入和兩個(gè)數(shù),第
37、一次調(diào)用process時(shí)找出和中大者,第二次找出其中小者,第三次求與之和。,#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( :); scanf(,,,);,(); (,,); (); (,,); (); (,,); ,int (int ,int ) /* 函數(shù)定義 */ ; (
38、); ; (); int (int ,int ) /* 函數(shù)定義 */ ; (); ; (); ,int (int ,int ) /* 函數(shù)定義 */ ; ; (); void process(int ,int ,int (*fun)(int,int)) ; (*)(,); (,); ,10. 返回指針值的函數(shù),一個(gè)函數(shù)可以帶回一個(gè)整型值、字符值、實(shí)型值等,也可以帶回指針型的數(shù)據(jù),即地址。其概念與以前類似,只是帶回的值的類型是指針類型而已。 這種帶回指針值的函數(shù),一般定義形式為 類型名 *函數(shù)名(參數(shù)表列); 例如: *(int ,int );,例104 有若干個(gè)學(xué)生的成績(jī)
39、(每個(gè)學(xué)生有門課程),要求在用戶輸入學(xué)生序號(hào)以后,能輸出該學(xué)生的全部成績(jī)。用指針函數(shù)來實(shí)現(xiàn)。,#include void main() 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:,);,search(,); for(;; printf(,*()); ,float
40、* search(float (*)4,int ) float *; *(); return(); 運(yùn)行情況如下: enter the number of student: The scores of No. are: 56.00 89.00 67.00 88.00,例105 對(duì)上例中的學(xué)生,找出其中有不及格課程的學(xué)生及其學(xué)生號(hào)。,#include void main() float score 4=60,70,80,90,56, 89,67,88,34,78,90,66; float search(float (*pointer)4); float*; i ,;,f
41、(;;) (); (*()) printf(scores:,); for(;;) printf(,*()); printf(); ,10.指針數(shù)組和指向指針的指針,10.. 指針數(shù)組的概念,一個(gè)數(shù)組,若其元素均為指針類型數(shù)據(jù),稱為指針數(shù)組,也就是說,指針數(shù)組中的每一個(gè)元素都相當(dāng)于一個(gè)指針變量。一維指針數(shù)組的定義形式為 類型名數(shù)組名數(shù)組長(zhǎng)度; 例如: *;,例106 將若干字符串按字母順序(由小到大)輸出。,#include #include void main() void sort(char *name ,int n); void printf(char *name ,int
42、 n); char *name =Follow me,BASIC,Great Wall,F(xiàn)ORTRAN,Computer design; int ; sort(,); print(,); ,void sort(char * ,int ) char *; int ,,; for(;; ; for(;; if(strcmp(name,name)0)=; if(!) temp=namei; namei=namek; namek=temp; ,void print(char * ,int ) ; (;;) printf(,); ,運(yùn)行結(jié)果為: ,10 指向指針的指針,
43、怎樣定義一個(gè)指向指針數(shù)據(jù)的指針變量呢?如下: **; 的前面有兩個(gè)*號(hào)。*運(yùn)算符的結(jié)合性是從右到左,因此**相當(dāng)于*(*),顯然*是指針變量的定義形式。如果沒有最前面的*,那就是定義了一個(gè)指向字符數(shù)據(jù)的指針變量?,F(xiàn)在它前面又有一個(gè)*號(hào),表示指針變量是指向一個(gè)字符指針變量的。*就是所指向的另一個(gè)指針變量。,例107 使用指向指針的指針,#include void main() char *name=Follow me,BASIC,Great Wall,F(xiàn)ORTRAN,Computer design; char **; int ; for(;;) ; printf(,*); ,例1
44、0.28 一個(gè)指針數(shù)組的元素指向整型數(shù)據(jù)的簡(jiǎn)單例子,#include void main() int ,,,,; int *num5=&a0,&a1, &a2,&a3,&a4; int **,; ; for(;; printf( ,**); ; ,10.. 指針數(shù)組作函數(shù)的形參,指針數(shù)組的一個(gè)重要應(yīng)用是作為main函數(shù)的形參。在以往的程序中,函數(shù)的第一行一般寫成以下形式:void main() 括弧中是空的。實(shí)際上,main函數(shù)可以有參數(shù),例如:void main(int argc,char *argv ) argc和argv就是main函數(shù)的形參。main函數(shù)是由
45、操作系統(tǒng)調(diào)用的。那么,main函數(shù)的形參的值從何處得到呢?顯然不可能在程序中得到。實(shí)際上實(shí)參是和命令一起給出的。也就是在一個(gè)命令行中包括命令名和需要傳給main函數(shù)的參數(shù)。命令行的一般形式為命令名 參數(shù) 參數(shù)參數(shù),如果有一個(gè)名為的文件,它包含以下的函數(shù): void main(int ,char * ) () ; (,); ; 在DOS命令狀態(tài)下輸入的命令行為 則執(zhí)行以上命令行將會(huì)輸出以下信息: ,10.有關(guān)指針的數(shù)據(jù)類型和指針運(yùn)算的小結(jié),10.8.1有關(guān)指針的數(shù)據(jù)類型的小結(jié),10.8.2 指針運(yùn)算小結(jié),(1) 指針變量加(減)一個(gè)整數(shù) 例如:、、、、、等。,(2) 指針變量賦值
46、 將一個(gè)變量地址賦給一個(gè)指針變量。如: ; (將變量的地址賦給) array; (將數(shù)組首元素地址賦給) array;(將數(shù)組第個(gè)元素 的地址賦給) max;(為已定義的函數(shù),將的入口 地址賦給) ;(和都是指針變量,將的 值賦給),(3) 指針變量可以有空值,即該指針變量不指向任何變量,可以這樣表示:;,(4) 兩個(gè)指針變量可以相減 如果兩個(gè)指針變量都指向同一個(gè)數(shù)組中的元素,則兩個(gè)指針變量值之差是兩個(gè)指針之間的元素個(gè)數(shù),(5) 兩個(gè)指針變量比較 若兩個(gè)指針指向同一個(gè)數(shù)組的元素,則可以進(jìn)行比較。指向前面的元素的指針變量“小于”指向后面元素的指針變量。
47、,10.8.3 void指針類型,ANSIC新標(biāo)準(zhǔn)增加了一種“void”指針類型,即可定義一個(gè)指針變量,但不指定它是指向哪一種類型數(shù)據(jù)的。ANSIC標(biāo)準(zhǔn)規(guī)定用動(dòng)態(tài)存儲(chǔ)分配函數(shù)時(shí)返回void指針,它可以用來指向一個(gè)抽象的類型的數(shù)據(jù),在將它的值賦給另一指針變量時(shí)要進(jìn)行強(qiáng)制類型轉(zhuǎn)換使之適合于被賦值的變量的類型。例如: *; *; ( *);,同樣可以用( *)將的值轉(zhuǎn)換成 *類型。如: ( *); 也可以將一個(gè)函數(shù)定義為 *類型,如: *(char ch1,char ch2) 表示函數(shù)返回的是一個(gè)地址,它指向“空類型”,如需要引用此地址,也需要根據(jù)情況對(duì)之進(jìn)行類型轉(zhuǎn)換,如對(duì)該函數(shù)調(diào)用得到的地址要進(jìn)行以下轉(zhuǎn)換: ( *)(h,h);,
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 川渝旅游日記成都重慶城市介紹推薦景點(diǎn)美食推薦
- XX國(guó)有企業(yè)黨委書記個(gè)人述責(zé)述廉報(bào)告及2025年重點(diǎn)工作計(jì)劃
- 世界濕地日濕地的含義及價(jià)值
- 20XX年春節(jié)節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)人到場(chǎng)心到崗
- 大唐女子圖鑒唐朝服飾之美器物之美繪畫之美生活之美
- 節(jié)后開工第一課輕松掌握各要點(diǎn)節(jié)后常見的八大危險(xiǎn)
- 廈門城市旅游介紹廈門景點(diǎn)介紹廈門美食展示
- 節(jié)后開工第一課復(fù)工復(fù)產(chǎn)十注意節(jié)后復(fù)工十檢查
- 傳統(tǒng)文化百善孝為先孝道培訓(xùn)
- 深圳城市旅游介紹景點(diǎn)推薦美食探索
- 節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)勿忘安全本心人人講安全個(gè)個(gè)會(huì)應(yīng)急
- 預(yù)防性維修管理
- 常見閥門類型及特點(diǎn)
- 設(shè)備預(yù)防性維修
- 2.乳化液泵工理論考試試題含答案