C語言程序設計(第三版)_第1頁
C語言程序設計(第三版)_第2頁
C語言程序設計(第三版)_第3頁
C語言程序設計(第三版)_第4頁
C語言程序設計(第三版)_第5頁
已閱讀5頁,還剩293頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

1、語言程序設計(第三版)(第十-十四章)整理課件第十章整理課件地址和指針的概念為了說清楚什么是指針,必須弄清楚數據在內存中是如何存儲的,又是如何讀取的。 內存區的每一個字節有一個編號,這就是“地址地址” 。如果在程序中定義了一個變量,在對程序進行編譯時,系統就會給這個變量分配內存單元。 、按變量地址存取變量值的方式稱為“直接訪問直接訪問”方式 (,);(,);例如:例如:整理課件整理課件另一種存取變量值的方式稱為“間接訪問間接訪問”的方式。即,將變量的地址存放在另一個變量中。在語言中,指針是一種特殊的變量,它是存放地址的。在語言中,指針是一種特殊的變量,它是存放地址的。假設我們定義了一個指針變量

2、i_pointer用來存放整型變量的地址,它被分配地址為(3010)、(3011)的兩個字節??梢酝ㄟ^語句:i_pointer ;將的地址(2000)存放到i_pointer中。這時, i_pointer的值就是(2000) ,即變量所占用單元的起始地址。要存取變量的值,可以采用間接方式:先找到存放“的地址”的變量i_pointer ,從中取出的地址(2000),然后到2000 、 200字節取出的值()。整理課件整理課件一個變量的地址稱為該變量的“指針指針”。例如,地址2000是變量的指針。如果有一個變量專門用來存放另一變量的地址(即指針),則它稱為“指針變量指針變量”。上述的i_point

3、er就是一個指針變量。指針和指針變量的定義:指針和指針變量的定義:指針變量的值(即指針變量中存放的值)是地址(即指針)。請區分“指針”和“指針變量”這兩個概念。整理課件10.2 變量的指針和指向變量的指針變量10.1 定義一個指針變量定義一個指針變量定義指針變量的一般形式為基類型基類型 *指針變量名;指針變量名;整理課件下面都是合法的定義:float *pointer_; / pointer_是指向float型變量的指針變量char *pointer_; /pointer_是指向字符型變量的指針變量可以用賦值語句使一個可以用賦值語句使一個指針變量得到另一個變指針變量得到另一個變量的地址,從而使

4、它指量的地址,從而使它指向一個該變量。如:向一個該變量。如:pointer_;pointer_;整理課件在定義指針變量時要注意兩點:在定義指針變量時要注意兩點:(1)指針變量前面的“*”,表示該變量的類型為指針型變量。例: float *pointer_1;指針變量名是pointer_1 ,而不是* pointer_1 。 (2) 在定義指針變量時必須指定基類型。需要特別注意的是,只有整型變量的地址才能放到指向整型變量的指針變量中。下面的賦值是錯誤的 float a; int * pointer_1; pointer_1=&a; /* 將float型變量的地址放到指向整型變量的指針變量中,錯誤

5、 */整理課件10. 指針變量的引用指針變量的引用 請牢記,指針變量中只能存放地址(指針),不要將一個整數(或任何其他非地址類型的數據)賦給一個指針變量。 例例10. 通過指針變量訪問整型變量通過指針變量訪問整型變量#include voidmain ( ) int ,; int*pointer_, *pointer_; ; pointer_; /*把變量的地址賦給 pointer_1 */ 整理課件pointer_; /*把變量的地址賦給 pointer_ */printf(%,%,);printf(%,%,*pointer_, *pointer_); 整理課件對“”和“*”運算符說明:如果

6、已執行了語句 pointer_;(1)* pointer_的含義是什么?“”和“*”兩個運算符的優先級別相同,但按自右而左方向結合,因此先進行* pointer_的運算,它就是變量,再執行運算。因此,* pointer_與相同,即變量a的地址。如果有pointer_2 * pointer_ ;它的作用是將(的地址)賦給pointer_2 ,如果pointer_2原來指向,經過重新賦值后它已不再指向了,而指向了。整理課件整理課件(2) *的含義是什么?先進行運算,得的地址,再進行*運算。即所指向的變量,也就是變量a。*和*pointer_的作用是一樣的,它們都等價于變量。即*與等價。(3) (*

7、pointer_)相當于。注意括號是必要的,如果沒有括號,就成為了*pointer_,從附錄可知:+和*為同一優先級別,而結合方向為自右而左,因此它相當于*(pointer_)。由于+在pointer_1的右側,是“后加”,因此先對pointer_的原值進行*運算,得到的值,然后使pointer_的值改變,這樣pointer_不再指向了。整理課件例例10 . 2 輸入和兩個整數,按先大后小的順序輸出輸入和兩個整數,按先大后小的順序輸出 和。和。#include void main() int *1,*2,*,; scanf(,);1; if();printf(=,=,); printf(max

8、=,min=,*1,*2); 整理課件運行情況如下:運行情況如下:,當輸入,時,由于,當輸入,時,由于,將和交換。交換前的情況見圖將和交換。交換前的情況見圖(),交換后見圖()。(),交換后見圖()。整理課件整理課件10.3 指針變量作為函數參數指針變量作為函數參數例例10 . 3 對輸入的兩個整數按大小順序輸出對輸入的兩個整數按大小順序輸出 #include void main()void swap(int *,int *);int ,;int *pointer_,*pointer_; scanf(,);pointer_ ; pointer_2 ; if(swap( pointer_ , p

9、ointer_2 );printf(,); 整理課件void swap(int *,int *) int temp; temp*1; *; *temp; 整理課件整理課件例例10. 輸入、輸入、 3個整數,按大小順序輸出個整數,按大小順序輸出#include void main() void exchange(int *1, int *2, int *3); int ,*,*,*; scanf(%,%,%,&, &, &); exchange (,); printf(,); 整理課件void exchange(int *, int *, int *) void swap(int *, int

10、*); if(*) swap(,); if(*) swap(,); if(* swap(,); void swap(int *, int *) int temp; temp*; *; *temp; 整理課件一個變量有地址,一個數組包含若干元素,每個數組元素都在內存中占用存儲單元,它們都有相應的地址。指針變量既然可以指向變量,當然也可以指向數組元素(把某一元素的地址放到一個指針變量中)。所謂數組元素的指針就是數組元數組元素的指針就是數組元素的地址素的地址。 整理課件定義一個指向數組元素的指針變量的方法,與以前介紹的指向變量的指針變量相同。例如: ; (定義為包含個整型數據的數組)*; (定義為指

11、向整型變量的指針變量)應當注意,如果數組為型,則指針變量的基類型亦應為型。 10.3.1 10.3.1 指向數組元素的指針指向數組元素的指針整理課件對該指針變量賦值:對該指針變量賦值:;把元素的地址賦給指針變量。也就是使指向數組的第號元素,如圖:整理課件10.通過指針引用數組元素通過指針引用數組元素引用一個數組元素,可以用:()() 下標法,如形式;下標法,如形式;()() 指針法,如指針法,如*()或()或*()()。其中是數組名,是指向數組元素的指針變量,其初值。例例10.5 輸出數組中的全部元素輸出數組中的全部元素 假設有一個數組,整型,有個元素。要輸出各元素的值有三種方法: 整理課件(

12、1)下標法下標法#include void main() int ; int;for(;)scanf(,); printf();for(;)printf(,); 整理課件(2) 通過數組名計算數組元素地址,找出元素的值。#include voidmain() int ; int ;for(; )scanf(,);printf(); for(;) printf(,*(); 整理課件(3) 用指針變量指向數組元素。#include void main() int ; int *,; for(;) scanf(,); printf(); for(;();) printf( ,*); 整理課件例例10

13、. 通過指針變量輸出數組的個元素。通過指針變量輸出數組的個元素。 有人編寫出以下程序:有人編寫出以下程序:#include void main() int*,;for(; )scanf(,); printf(); for(;, ) printf(,*);整理課件這個程序乍看起來好像沒有什么問題。有的人即使已被告知此程序有問題,還是找不出它有什么問題。我們先看一下運行情況:1 2 3 4 5 6 7 8 9 022153 234 0 0 30036 25202 11631 8259 8237 28483顯然輸出的數值并不是數組中各元素的值顯然輸出的數值并不是數組中各元素的值 整理課件解決這個問題

14、的辦法,只要在第二個循環之前解決這個問題的辦法,只要在第二個循環之前加一個賦值語句:加一個賦值語句:;#include void main() int*,;for(;)scanf(,); printg(); p=a; for(;, ) printf(,*);整理課件10.3 用數組名作函數參數用數組名作函數參數在第在第8章章節中介紹過可以用數組名作函數的參數節中介紹過可以用數組名作函數的參數如: void main() i(int ,int ); int ; (,); void (int ,int ) 整理課件f (int arr , int n)但在編譯時是將arr按指針變量處理的,相當于將

15、函數f的首部寫成f (int *arr, int n)以上兩種寫法是等價的。 需要說明的是:C語言調用函數時虛實結合的方法都是采用“值傳遞”方式,當用變量名作為函數參數時傳遞的是變量的值,當用數組名作為函數參數時,由于數組名代表的是數組首元素地址,因此傳遞的值是地址,所以要求形參為指針變量。整理課件例例10 將數組中個整數按相反順序存放將數組中個整數按相反順序存放整理課件#include void main() void inv(int ,int ); int , ,;printf(The original array:);for(;)printf (,);printf(); inv (,);

16、 printf(The array has been in verted:); for(;) printf (,); printf ();整理課件void inv(int ,int ) int temp,();for(;) ;temp; ; temp; return; 整理課件運行情況如下:The original array:,The array has been inverted:,整理課件整理課件#include void main()void inv(int *,int ); int , ,; printf( The original array: ); for(;) printf (

17、,); printf (); inv(,); printf ( The array has been in verted: ); for(;)printf (,);printf ();對這個程序可以作一些改動。將函對這個程序可以作一些改動。將函數數inv中的形參改成指針變量。中的形參改成指針變量。 整理課件void inv(int *,int ) int,temp,*,*,(); ; for(;,) emp*;*;*temp;return;整理課件 歸納起來,如果有一個實參數組,想在函歸納起來,如果有一個實參數組,想在函數中改變此數組中的元素的值,實參與形參數中改變此數組中的元素的值,實參與形

18、參的對應關系有以下種情況:的對應關系有以下種情況: (1) 形參和實參都用數組名,如:形參和實參都用數組名,如:void main() void (int ,int ) int ; (,); 整理課件整理課件(2) 實參用數組名,形參用指針變量。如:實參用數組名,形參用指針變量。如:void () void (int *,int )int ; (,); (3)實參形參都用指針變量。例如:實參形參都用指針變量。例如:void main() void (int *,int )int , *p=a; (p,); 整理課件整理課件(4) 實參為指針變量,形參為數組名。如:實參為指針變量,形參為數組名。

19、如: void main() void (int x ,int ) ,*p=a; (p,); 整理課件#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(); 整理課件void inv(int *,int )int,temp,*,*;();

20、;for(;,)emp*;*;*temp;return; 整理課件例例109 用選擇法對個整數按由大到小順序排序用選擇法對個整數按由大到小順序排序 #include void main() void sort(int ,int ); int*,10; ; for(;) scanf(,); ; sort(,); for(,;)(,*);整理課件void sort(int ,int ) int ,; for(;);for(;)() ; (?。?; ; ; 整理課件10. 多維數組與指針多維數組與指針 用指針變量可以指向一維數組中的元素,也可以指向多維數組中的元素。但在概念上和使用上,多維數組的指針比

21、一維數組的指針要復雜一些。 1. 多維數組元素的地址多維數組元素的地址先回顧一下多維數組的性質,可以認為二維數組是“數組的數組”,例 :定義定義int a34=1,3,5,7,;則二維數組a是由3個一維數組所組成的。設二維數組的首行的首地址為 ,則表表 示示 形形 式式含義含義地地 址址a 二維數組名,指向一維數組a0,即0行首地址2000a0,*(a+0),*a0行0列元素地址2000a+1,&a11行首地址2008a1,*(a+1) 1行0列元素a10的地址2008A1+2,*(a+1)+2,&a121行2列元素a12 的地址2012*(a1+2),*(*(a+1)+2),a121行2列元

22、素a12的值元素值為13例例10.0 輸出二維數組有關的值輸出二維數組有關的值 #include define FROMAT,void main() int 341,3,5,7,9, ,; printf(,*); printf(,0 , *();printf(,0,00);printf(,1,);printf(,10,*(+)+);printf(,*();printf(,); printf(,*(*( ); 整理課件某一次運行結果如下:, (0行首地址和0行0列元素地址), (0行0列元素地址), (0行0首地址和0行0列元素地址), (1行0列元素地址和1行首地址), (1行0列元素地址),

23、 (2行0列元素地址), (2行首地址), (1行0列元素的值)整理課件2 . 指向多維數組元素的指針變量指向多維數組元素的指針變量在了解上面的概念后,可以用指針變量指向多維數組的元素。(1) 指向數組元素的指針變量指向數組元素的指針變量例例10.11 10.11 用指針變量輸出二維數組元素的值用指針變量輸出二維數組元素的值 #include void main() int 341,3,5,7,9,11,13,15,17,19,21,23; int*; for(;) () printf(); printf(,*); 運行結果如下:1 3 5 7 9 11 13 1519 21 23 整理課件可

24、將程序最后兩個語句改為可將程序最后兩個語句改為printf(addr, value2,*);在TC+環境下某一次運行時輸出如下:,整理課件 (2) 指向由個元素組成的一維數組的指針變量指向由個元素組成的一維數組的指針變量例例10.13 10.13 出二維數組任一行任一列元素的值出二維數組任一行任一列元素的值#include void main ( ) int 1,3,5,7,9,11, 13,15,;int (*),; ;scanf( ,); printf(, ,*(*(); 運行情況如下:, (本行為鍵盤輸入),運行情況如下:,(本行為鍵盤輸入),整理課件3. 用指向數組的指針作函數參數用指

25、向數組的指針作函數參數例例10.13 有一個班,個學生,各學門課,計算總有一個班,個學生,各學門課,計算總平均分數以及第個學生的成績。這個題目是很簡單平均分數以及第個學生的成績。這個題目是很簡單的。只是為了說明用指向數組的指針作函數參數而舉的。只是為了說明用指向數組的指針作函數參數而舉的例子。用函數求總平均成績,用函的例子。用函數求總平均成績,用函數找出并輸出第個學生的成績。數找出并輸出第個學生的成績。整理課件#include void main() void average(float *p,int n); void search(float (*p)4,int n); float scor

26、e34=65,67,70,60,80, 87,90,81,90,99,100,98; average(*score,12);*求12個分數的平均分*search(score,);*求序號為的學生的成績*整理課件void average(float *,int ) float*_; float ,; _; (;_;) (*); ; printf(average,aver);整理課件void search(float (*)4,int ) / * p是指向具有4個元素的一維數組的指針 */int ; printf(the score of No. % are:,); for(;) printf(,

27、*(*(); 程序運行結果如下: :.整理課件例例10.4 在上題基礎上,查找有一門以上課程不及格的在上題基礎上,查找有一門以上課程不及格的學生,打印出他們的全部課程的成績。學生,打印出他們的全部課程的成績。 #include void main()void search(float (*p)4,int n);/*函數聲明*/ 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(;) if(*(*(

28、))flag; if() printf(No.%d fails,his scores are:n,j+1); for(;) printf(%.,*(*(); printf(); 程序運行結果如下: s, :. . . . s, . . . .整理課件10字符串的表示形式字符串的表示形式 例例 10.5 定義一個字符數組,對它初始化,定義一個字符數組,對它初始化, 然后輸出該字符串然后輸出該字符串 #include void main()char string !; printf(,); (1) 用字符數組存放一個字符串,然后輸出該字符串。用字符數組存放一個字符串,然后輸出該字符串。整理課件(2

29、) 用字符指針指向一個字符串用字符指針指向一個字符串 可以不定義字符數組,而定義一個字符指針。用字符指針指向字符串中的字符。例106 定義字符指針#include void main()charstring !;printf(,);整理課件例例10.10.7 7 將字符串復制為字符串將字符串復制為字符串 對字符串中字符的存取,可以用下標方法,也可以用指針方法 #include void ()char am a boy,20; int ; for(;*()??;) *()*(); *(); printf(string a is :,); printf( :); for(;!;) printf(,)

30、; printf(); 整理課件也可以設指針變量,用它的值的改變來指向字符串中的不同的字符。 例例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();程序必須保證使和同步移動。 整理課件整理課件10. 字符指針作函數參數字符指針作函數參數例例1019 用函數調用實現字符串的復制用函數調用實現字符串的復

31、制 #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); (1) 用字符數組作參數用字符數組作參數整理課件void copy_string(char from , char to ) i

32、nt ; while(?。?; 程序運行結果如下: copy string a to string b: 整理課件()() 形參用字符指針變量形參用字符指針變量 #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 cop

33、y_string(char *,char *) for(;*from?。籪rom,to)*;*; ()() 對對 copy_string 函數還可作簡化函數還可作簡化 1、將copy_string函數改寫為void copy_string (char *,char *) while(*)!) ; 整理課件2、 copy_string函數的函數體還可改為 while(*to*from)?。?; 3、copy_string函數的函數體還可寫成 while(*?。?; *; 整理課件4、上面的while語句還可以進一步簡化為下面的while語句:while(*);它與下面語句等價:while(*to*

34、from)?。粚?賦給*,如果賦值后的*值等于,則循環終止(已賦給*) 5、函數體中語句也可以改用語句:for(;(*to*from)?。唬?;或for(;*to*from;);整理課件6、也可用指針變量,函數copy_string可寫為void copy_string (char from ,char )*,*; ;while(*p2*p1)?。?;10. 對使用字符指針變量和字符數組的討論對使用字符指針變量和字符數組的討論雖然用字符數組和字符指針變量都能實現字符串的存儲和運算,但它們二者之間是有區別的,不應混為一談,主要有以下幾點:整理課件(1) 字符數組由若干個元素組成,每個元素中放一個字

35、符,而字符指針變量中存放的是地址(字符串第1個字符的地址),決不是將字符串放到字符指針變量中。(2)賦值方式。對字符數組只能對各個元素賦值,不 能用以下辦法對字符數組賦值。 char str; str ??; 而對字符指針變量,可以采用下面方法賦值: char*; !; 但注意賦給的不是字符,而是字符串第一個元素 的地址。整理課件(3)對字符指針變量賦初值: char * love China??;等價于 char*; ??; 而對數組的初始化: char str love China!; 不能等價于 char str; str ??;整理課件(4) 如果定義了一個字符數組,在編譯時為它分配內存單元,

36、它有確定的地址。而定義一個字符指針變量時,給指針變量分配內存單元,在其中可以放一個字符變量的地址也就是說,該指針變量可以指向一個字符型數據,但如果未對它賦予一個地址值,則它并未具體指向一個確定的字符數據。 如: char str; scanf(,str););是可以的。而常有人用下面的方法,目的是想輸入一個字符串,雖然一般也能運行,但這種方法是危險的 : char*; scanf(,);,);整理課件應當這樣:應當這樣:*,;(,);(5) 指針變量的值是可以改變的,如:例例10.0改變指針變量的值改變指針變量的值#include void ()char*I love China?。?; pr

37、intf(,); 整理課件需要說明,若定義了一個指針變量,并使它指向一個字符串,就可以用下標形式引用指針變量所指的字符串中的字符。例101 #include voidmain()char* love hina!; int ; printf ( “ The sixth character is %cn,a5); for(;!;) printf(,); 整理課件10.10. 指向函數的指針指向函數的指針10. 用函數指針變量調用函數用函數指針變量調用函數可以用指針變量指向整型變量、字符串、數組,也可以指向一個函數。一個函數在編譯時被分配給一個入口地址。這個函數的入口地址就稱為函函數的入口地址就稱為

38、函數的指針數的指針。 例例10.2 求和中的大者。先列出按一般求和中的大者。先列出按一般 方法的程序。方法的程序。整理課件#include voidmain() int max(int,int); int ,;scanf(,); (,);printf(, ,); int max(int ,int ) int ; if();else ; return(); 整理課件將 main 函數改寫為#include voidmain() int (int,int); int (*)(); int ,; ; scanf(,); (*)(,); printf(, ,); 整理課件10. 用指向函數的指針作函數

39、參數用指向函數的指針作函數參數函數指針變量常用的用途之一是把指針作為參數傳遞到其他函數。前面介紹過,函數的參數可以是變量、指向變量的指針變量、數組名、指向數組的指針變量等?,F在介紹指向函數的指針也可以作為參數,以實現函數地址的傳遞,這樣就能夠在被調用的函數中使用實參函數。它的原理可以簡述如下:有一個函數(假設函數名為sub),它有兩個形參(x1和x2),定義x1和x2為指向函數的指針變量。在調用函數sub時,實參為兩個函數名和,給形參傳遞的是函數和的地址。這樣在函數中就可以調用和函數了。整理課件 實參函數名 f1 void (int (*x1)(int),int (*x2)(int,int))

40、 int ,; (*)(); *調用函數* (*)(,);*調用函數* 整理課件例例10.10.3 3 設一個函數設一個函數processprocess,在調用它的時候,每次,在調用它的時候,每次實現不同的功能。輸入和兩個數,第一次調用實現不同的功能。輸入和兩個數,第一次調用processprocess時找出和中大者,第二次找出其中小者,時找出和中大者,第二次找出其中小者,第三次求與之和。第三次求與之和。 #include void main() int max(int,int); /* 函數聲明 */ int min(int,int); /* 函數聲明 */ int add(int,int)

41、; /* 函數聲明 */ void process (int,int,int(*fun)(); /* 函數聲明 */ int ,; printf( :); scanf(,);整理課件(); (,);();(,);();(,);整理課件int (int ,int ) /* 函數定義 */ ; (); ; ();int (int ,int ) /* 函數定義 */ ; (); ;(); 整理課件int (int ,int ) /* 函數定義 */ ; ; ();void process(int ,int ,int (*fun)(int,int) ; (*)(,); (,);整理課件10.10. 返

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

43、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 * search(float (*)4,int ) float *; *(); return(); 運行情況如下:運行情況如下:enter the number of student:

44、The scores of No. are:整理課件例例105 對上例中的學生,找出其中有不及格課對上例中的學生,找出其中有不及格課程的學生及其學生號。程的學生及其學生號。#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(;)();(*()printf(scores:,); for(;) printf(,*(); printf(); 整理課件10.10.指針數組和指向指針的指針指針數組和指向指針的指

45、針10. 指針數組的概念指針數組的概念一個數組,若其元素均為指針類型數據,稱為指針指針數組數組,也就是說,指針數組中的每一個元素都相當于一個指針變量。一維指針數組的定義形式為類型名數組名數組長度;類型名數組名數組長度;例如:*;整理課件整理課件例例106 將若干字符串按字母順序(由小到大)輸出。將若干字符串按字母順序(由小到大)輸出。#include #include void main()void sort(char *name ,int n); void printf(char *name ,int n); char *name =Follow me,BASIC,Great Wall,FO

46、RTRAN,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(,); 運行結果為: 整理課件10 指向指針的指針指向指針的指針怎樣定義一個指向指針數據的指針變量呢?怎樣定義一個指向指針數據的指針變量呢?如下:*;的前面有兩個*號。*運算符的結

47、合性是從右到左,因此*相當于*(*),顯然*是指針變量的定義形式。如果沒有最前面的*,那就是定義了一個指向字符數據的指針變量?,F在它前面又有一個*號,表示指針變量是指向一個字符指針變量的。*就是所指向的另一個指針變量。整理課件例例107 使用指向指針的指針使用指向指針的指針 #include void main()char *name=Follow me,BASIC,Great Wall,FORTRAN,Computer design; char *; int ; for(;); printf(,*); 整理課件例例10.28 一個指針數組的元素指向整型數據的簡單例子一個指針數組的元素指向整型

48、數據的簡單例子 #include void main()int ,; int *num5=&a0,&a1, &a2,&a3,&a4; int *,; ;for(; printf( ,*); ; 整理課件10. 指針數組作函數的形參指針數組作函數的形參指針數組的一個重要應用是作為main函數的形參。在以往的程序中,函數的第一行一般寫成以下形式:void main()括弧中是空的。實際上,main函數可以有參數,例如:void main(int argc,char *argv )argc和argv就是main函數的形參。main函數是由操作系統調用的。那么,main函數的形參的值從何處得到呢?顯然

49、不可能在程序中得到。實際上實參是和命令一起給出的。也就是在一個命令行中包括命令名和需要傳給main函數的參數。命令行的一般形式為命令名命令名 參數參數 參數參數參數參數整理課件如果有一個名為的文件,它包含以下的函數:void main(int ,char * ) () ; (,); ; 在DOS命令狀態下輸入的命令行為則執行以上命令行將會輸出以下信息:整理課件10.10.有關指針的數據類型和指針運算的小結有關指針的數據類型和指針運算的小結有關指針的數據類型的小結有關指針的數據類型的小結定義定義含義含義 ;定義整型變量定義整型變量* *;為指向整型數據的指針變量為指向整型數據的指針變量int a

50、int an n; ;定義整型數組,它有個元素定義整型數組,它有個元素 * *;定義指針數組,它由個指向整型數據的指定義指針數組,它由個指向整型數據的指針元素組成針元素組成 (* *););為指向含個元素的一維數組的指針變量為指向含個元素的一維數組的指針變量 ();();為帶回整型函數值的函數為帶回整型函數值的函數 * *();();為帶回一個指針的函數,該指針指向整型數為帶回一個指針的函數,該指針指向整型數據據 (* *)();)();為指向函數的指針,該函數返回一個整型值為指向函數的指針,該函數返回一個整型值 * * *;是一個指針變量,它指向一個指向整型數據是一個指針變量,它指向一個指向

51、整型數據的指針變量的指針變量10.8.2 指針運算小結指針運算小結(1) 指針變量加(減)一個整數指針變量加(減)一個整數例如:、等。(2) 指針變量賦值指針變量賦值將一個變量地址賦給一個指針變量。如:; (將變量的地址賦給)array; (將數組首元素地址賦給)array;(將數組第個元素 的地址賦給)max;(為已定義的函數,將的入口 地址賦給);(和都是指針變量,將的 值賦給) 整理課件(3) 指針變量可以有空值,即該指針變量不指向任何變量指針變量可以有空值,即該指針變量不指向任何變量,可以這樣表示:;(4) 兩個指針變量可以相減兩個指針變量可以相減如果兩個指針變量都指向同一個數組中的元

52、素,則兩個指針變量值之差是兩個指針之間的元素個數 整理課件(5) 兩個指針變量比較兩個指針變量比較若兩個指針指向同一個數組的元素,則可以進行比較。指向前面的元素的指針變量“小于”指向后面元素的指針變量。 10.8.3 void指針類型指針類型ANSIC新標準增加了一種“void”指針類型,即可定義一個指針變量,但不指定它是指向哪一種類型數據的。ANSIC標準規定用動態存儲分配函數時返回void指針,它可以用來指向一個抽象的類型的數據,在將它的值賦給另一指針變量時要進行強制類型轉換使之適合于被賦值的變量的類型。例如:*;*;( *);整理課件同樣可以用( *)將的值轉換成 *類型。如:( *);

53、也可以將一個函數定義為 *類型,如: *(char ch1,char ch2)表示函數返回的是一個地址,它指向“空類型”,如需要引用此地址,也需要根據情況對之進行類型轉換,如對該函數調用得到的地址要進行以下轉換:( *)(h,h);整理課件第十一章整理課件l 本章要點結構體的概念結構體的概念結構體的定義和引用結構體的定義和引用結構體數組結構體數組 整理課件l 主要內容11.1 11.1 概述概述11.2 11.2 定義結構體類型變量的方法定義結構體類型變量的方法11.3 11.3 結構體變量的引用結構體變量的引用11.4 11.4 結構體變量的初始化結構體變量的初始化11.5 11.5 結構體

54、數組結構體數組 11.11.指向結構體類型數據的指針指向結構體類型數據的指針 11.7 11.7 用指針處理鏈表用指針處理鏈表11.8 11.8 共用體共用體 11.9 11.9 枚舉類型枚舉類型 11.10 11.10 用用typedeftypedef定義類型定義類型整理課件n問題定義:問題定義: 有時需要將不同類型的數據組合成一個有機的整體,以便于引用。如:如:一個學生有學號/姓名/性別/年齡/地址等屬性 int num; char name20; char sex; int age; int char addr30; 應當把它們組織成一個組合項,在一個組合項中包含若干個類型不同(當然也可

55、以相同)的數據項。 圖11-1100101 Li Fun M 18 87.5 Beijing Num name sex age score addr整理課件n 聲明一個結構體類型的一般形式為:聲明一個結構體類型的一般形式為: struct 結構體名 成員表列;如:如:struct student int num;char name20;char sex; int age;float score;char addr30; 結構體名類型名成員名整理課件n可以采取以下可以采取以下3 3種方法定義結構體類型變種方法定義結構體類型變量:量:(1)(1)先聲明結構體類型再定義變量名先聲明結構體類型再定義變

56、量名例如:例如:struct student student1, student2; | | | 結構體類型名 結構體變量名 定義了student1和student2為struct student類型的變量,即它們具有struct student類型的結構. 圖11-2student1100101 ZhangXin M 19 90.5 Shanghai100102 WangLi F 20 98 Beijingstudent2整理課件 在定義了結構體變量后,系統會為之分配內存單元。 例如例如: :student1和student2在內存中各占59個字節(2+20+1+2+4+30=59)。 將一

57、個變量定義為標準類型(基本數據類型)與定義為結構體類型不同之處在于后者不僅要求指定變量為結構體類型,而且要求指定為某一特定的結構體類型,因為可以定義出許許多多種具體的結構體類型。整理課件(2)(2)在聲明類型的同時定義變量在聲明類型的同時定義變量 這種形式的定義的一般形式為: structstruct結構體名 成員表列 變量名表列; 整理課件例如:例如:struct student int num; char name20; char sex; int age; float score; char addr30; student1,student2; 它的作用與第一它的作用與第一種方法相同,即

58、種方法相同,即定義了兩個定義了兩個struct student 類型的變類型的變量量student1,student2 整理課件(3)(3) 直接定義結構體類型變量直接定義結構體類型變量其一般形式為: structstruct 成員表列 變量名表列;變量名表列;即不出現結構體名。 (1) 類型與變量是不同的概念,不要混同。只能對變量賦值、存取或運算,而不能對一個類型賦值、存取或運算。在編譯時,對類型是不分配空間的,只對變量分配空間。(2)對結構體中的成員(即“域”),可以單獨使用,它的作用與地位相當于普通變量。(3)成員也可以是一個結構體變量。(4) 成員名可以與程序中的變量名相同,二者不代表

59、同一對象。整理課件例如:例如:structstruct date date / /* *聲明一個結構體類型聲明一個結構體類型* */ / intint numnum; charchar name20name20; charchar sexsex; intint ageage; floatfloat scorescore; structstruct datedate birthdaybirthday; / /* *birthdaybirthday是是struct datestruct date類型類型* */ / char char addr30addr30; student1,student2

60、;student1,student2;先聲明一個先聲明一個struct date類型,它代表類型,它代表“日期日期”,包括,包括3個成員:個成員:month(月)、(月)、day(日)、日)、year(年)。(年)。然后在聲明然后在聲明struct student類型時,將成類型時,將成員員birthday指定為指定為struct date類型。類型。 圖11-3 birthday addrNum name sex age Month day year整理課件n 在定義了結構體變量以后,當然可以引用這個變量。但應遵守以下規則: (1)不能將一個結構體變量作為一個整體進行輸入和輸出。例如例如:

溫馨提示

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

評論

0/150

提交評論