《幻燈片C語言程序設計視頻教程第1章ppt課件》由會員分享,可在線閱讀,更多相關《幻燈片C語言程序設計視頻教程第1章ppt課件(40頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、C程序設計 講師:徐紅波 Email: 第 10章 指針 指針是 C語言中的一個重要概念 , 也是 C語言的一 個重要特色 。 正確而靈活地運用它 , 可以有效地表示 復雜的數(shù)據(jù)結構;能動態(tài)分配內存;方便地使用字符 串;有效而方便地使用數(shù)組;在調用函數(shù)時能獲得 1 個以上的結果;能直接處理內存單元地址等 , 這對設 計系統(tǒng)軟件是非常必要的 。 掌握指針的應用 , 可以使 程序簡潔 、 緊湊 、 高效 。 每一個學習和使用 C語言的 人 , 都應當深入地學習和掌握指針 。 可以說 , 不掌握 指針就是沒有掌握 C的精華 。 10.1 地址和指針的概念 變量的屬性:名、值
2、和地址 變量的訪問方式:直接訪問、間接訪問 變量的地址稱為該變量的“指針” 指針變量是存放地址的變量 10.2 變量的指針和指向變量的指針變量 變量的指針就是變量的地址。存放變量地址的變量 是指針變量,它用來指向另一個變量。為了表示指針變 量和它所指向的變量之間的聯(lián)系,在程序中用“ *”符 號表示“指向”。如果已定義 i_pointer為指針變量,則 (*i_pointer)是 i_pointer所指向的變量。 10.2.1 定義一個指針變量 C語言規(guī)定所有變量在使用前必須定義,指定其類 型,并按此分配內存單元。指針變量不同于整型變量和 其他類型的變量,它是用來專門存放地址的
3、,必須將它 定義為“指針類型”。 定義指針變量的一般形式為 基類型 * 指針變量名 ; 可以用賦值語句使一個指針變量得到另一個變量的 地址,從而使它指向一個該變量。 在定義指針變量時要注意兩點: (1)指針變量前面的“ *”表示該變量的類型為指針型變 量 (2)在定義指針變量時必須指定基類型 10.2.2 指針變量的引用 指針變量中只能存放地址 (指針 ),不要將一個整數(shù) (或其他非地址類型的數(shù)據(jù) )賦給一個指針變量。 有兩個有關的運算符: (1) int * pointer_1, * pointer_2; a=100; b=10; pointer_1= poin
4、ter_2= printf(“%d, %dn”, a, b); printf(“%d, %dn”, *pointer_1, *pointer_2); 對“ (1) scanf(“%d, %d”, p1= p2= if(a
5、的兩 個整數(shù)按大小順序輸出 #include void main() void s * p1, int * p2); int a, b; int * pointer_1, *pointer_2; scanf(“%d, %d”, pointer_1= pointer_2= if(a
6、d main() int a,b,c,*p1,*p2,*p3; scanf(“%d,%d,%d”, p1=p2=pe= exchange(p1,p2,p3); printf(“n%d,%d,%dn”,a,b,c); void exchange(int *q1,int *q2,int * q3) if(*q1<*q2) s); if(*q1<*q3) s); if(*q2<*q3) s); void s *pt1,int * pt2) int temp; temp=*pt1; *pt1=*pt2; *pt2=temp; 10.3 數(shù)組與指針 一個變量有地址,一個數(shù)組包含若干元素,
7、每個 數(shù)組元素都在內存中占用存儲單元,它們都有相應的 地址。指針變量既然可以指向變量,當然也可以指向 數(shù)組元素 (把某一元素的地址放到一個指針變量中 )。 所謂數(shù)組元素的指針就是數(shù)組元素的地址。 引用數(shù)組元素可以用下標法 (如 a3),也可以用指 針法,即通過指向數(shù)組元素的指針找到所需的元素。 使用指針法能使目標程序質量高 (占內存少,運行速度 快 )。 10.3.1 指向數(shù)組元素的指針 定義一個指向數(shù)組元素的指針變量的方法,與以前 介紹的指向變量的指針變量相同。 例如: int a10; int * p; p= p=a; 10.3.2 通過指針引用數(shù)組元素
8、假設 p已定義為一個指向整型數(shù)據(jù)的指針變量,并 已給它賦了一個整型數(shù)組元素的地址,使它指向某一 個數(shù)組元素。如果有以下賦值語句: *p=1; 表示將 1賦給 p當前所指向的數(shù)組元素。 如果 p的初值為 p=a; for(i=0; i<10; i++) scanf(“%d”, p++); printf(“n”); for(i=0; i<10; i++, p++) printf(“%d “, *p); printf(“n”); 10.3.3 用數(shù)組名作函數(shù)參數(shù) 如果一個實參數(shù)組,要想在函數(shù)中改變此數(shù)組中的元素的 值,實參與形參的對應關系有以下 4種情況 (1)形參和實參都用
9、數(shù)組名 (2)實參用數(shù)組名,形參用指針變量 (3)實參形參都用指針變量 (4)實參為指針變量,形參為數(shù)組名 例 10.7將數(shù)組 a中 n個整數(shù)按相反順序存放 例 10.8用實參指針改寫例 10.7 例 10.9用選擇法對 10個整數(shù)按由大到小順序排序 10.3.4 多維數(shù)組與指針 用指針變量可以指向一維數(shù)組中的元素,也可以指 向多維數(shù)組中的元素。但在概念上和使用上,多維數(shù) 組的指針比一維數(shù)組的指針要復雜一些。 1、多維數(shù)組元素的地址 int a34=1,3,5,7,9,11,13,15,17,19,21,23; a是一個數(shù)組名。 A數(shù)組包含三行,即 3個元素
10、: a0、 a1、 a2。而每一個元素又是一個一維數(shù)組,它包含 4 個元素 (即 4個列元素 )。例如, a0所代表的一維數(shù)組又 包含 4個元素: a00、 a01、 a02、 a03。可以 認為二維數(shù)組是“數(shù)組的數(shù)組”,即二維數(shù)組 a是由 3個 一維數(shù)組所組成的。 例 10.10輸出二維數(shù)組有關的值 2、指向多維數(shù)組元素的指針變量 (1)指向數(shù)組元素的指針變量 例 10.11用指針變量輸出二維數(shù)組元素的值 (2)指向由 m個元素組成的一維數(shù)組的指針變量 例 10.12輸出二維數(shù)組任一行任一列的值 3、用指向數(shù)組的指針作函數(shù)參數(shù) 一維數(shù)組名可以作為函數(shù)參數(shù)傳遞,多維數(shù)組名也可
11、作函數(shù) 參數(shù)傳遞。在用指針變量作形參以接受實參數(shù)組名傳遞來的地址 時,有兩種方法 : 1、用指向變量的指針變量 2、用指向一維數(shù)組的指針變量 例 10.13有一個班, 3個學生,各學 4門課,計算總平均分數(shù)以及 第 n個學生的成績 例 10.14在上題基礎上,查找有一門以上課程不及格的學生,輸 出他們的全部課程的成績 10.4 字符串與指針 10.4.1 字符串的表示形式 在 C程序中,可以用兩種方法訪問一個字符串 (1)用字符數(shù)組存放一個字符串,然后輸出該字符串。 例 10.15定義一個字符數(shù)組,對它初始化,然后輸出該字符 串 (2)用字符指針指向一個字符串 例 10
12、.16定義字符指針 例 10.17將字符串 a賦值為字符串 b 例 10.18用指針變量來處理例 10.17問題 10.4.2 字符指針作函數(shù)參數(shù) 將一個字符串從一個函數(shù)傳遞到另一個函數(shù),可以 用地址傳遞的方法,即用字符數(shù)組名作參數(shù),也可以用 指向字符的指針變量作參數(shù)。在被調用的函數(shù)中可以改 變字符串的內容,在主調函數(shù)中可以得到改變了的字符 串。 例 10.19用函數(shù)調用實現(xiàn)字符串的復制 (1)用字符數(shù)組作參數(shù) (2)形參用字符指針變量 10.4.3 對使用字符指針變量和字符數(shù)組的討論 雖然用字符數(shù)組和字符指針變量都能實現(xiàn)字符串的存儲和運算,但它們 兩者之間是有區(qū)別
13、的,不應混為一談,主要有以下幾點。 (1)字符數(shù)組由若干個元素組成,每個元素中放一個字符,而字符指針變量中 存放的是地址,決不是將字符串放到字符指針變量中。 (2)賦值方式。 (3)對字符指針變量賦初值。 (4)如果定義了一個字符數(shù)組,在編譯時為它分配內存單元,它有確定的地址。 而定義一個字符指針變量時,給指針變量分配內存單元,在其中可以放一個 字符變量的地址,也就是說,該指針變量可以指向一個字符型數(shù)據(jù),但如果 未對它賦予一個地址值,則它并未具體指向一個確定的字符數(shù)據(jù)。 (5)指針變量的值是可以改變的。 例 10.20改變指針變量的值 例 10.21用帶下標的字符指針變量引用字符
14、串中的字符 (6)用指針變量指向一個格式字符串,可以用它代替 printf函數(shù)中的格式字符串。 10.5 指向函數(shù)的指針 10.5.1 用函數(shù)指針變量調用函數(shù) 可以用指針變量指向整型變量、字符串、數(shù)組,也 可以指向一個函數(shù)。一個函數(shù)在編譯時被分配給一個入 口地址。這個函數(shù)的入口地址就稱為函數(shù)的指針??梢?用一個指針變量指向函數(shù),然后通過該指針變量調用此 函數(shù)。 例 10.22求 a和 b中的大者 說明: (1)指向函數(shù)的指針變量的一般定義形式為 數(shù)據(jù)類型 (*指針變量名 ) (函數(shù)參數(shù)表列 ); (2)函數(shù)的調用可以通過函數(shù)名調用,也可以通過函數(shù)指針調用 (即用指向函數(shù)
15、的指針表量調用 )。 (3)“int (*p)(int,int);”表示定義一個指向函數(shù)的指針變量 p,它不是 固定指向哪一個函數(shù)的,而是表示定義了這樣一個類型的變量, 它是專門用來存放函數(shù)的入口地址的。 (4)在給函數(shù)指針變量賦值時,只需給出函數(shù)名而不必給出參數(shù)。 (5)用函數(shù)指針變量調用函數(shù)時,只需將 (*p)代替函數(shù)名即可,在 (*p)之后的括號中根據(jù)需要寫上實參。 (6)對指向函數(shù)的指針變量,像 p+n、 p++等運算是無意義的。 10.5.2 用指向函數(shù)的指針作函數(shù)參數(shù) 函數(shù)指針變量通常的用途之一是把指針作為參數(shù)傳 遞到其他函數(shù)。函數(shù)的參數(shù)可以是變量、指向變量的指 針變
16、量、數(shù)組名、指向數(shù)組的指針變量等。函數(shù)的指針 也可以作為參數(shù),以實現(xiàn)函數(shù)地址的傳遞,這樣就能夠 在被調用的函數(shù)中使用實參函數(shù)。 例 10.23設一個函數(shù) process,在調用它的時候,每次實 現(xiàn)不同的功能。輸入 a和 b兩個數(shù),第一調用 process時找 出 a和 b中大者,第二次找出其中小者,第三次求 a與 b之 和 10.6 返回指針值的函數(shù) 一個函數(shù)可以返回一個整型值、字符值、實型值等,也可以 返回指針型的數(shù)據(jù),即地址。其概念與以前類似,只是返回的值 的類型是指針類型而已。 這種返回指針值的函數(shù),一般定義形式為 類型名 * 函數(shù)名 (參數(shù)表列 ); 例 10.24有
17、若干個學生的成績 (每個學生有 4門課程 ),要求在用戶 輸入學生序號后,能輸出該學生的全部成績。用指針函數(shù)來實現(xiàn) 例 10.25對上例中的學生,找出其中不及格課程的學生及其學生 號 10.7 指針數(shù)組和指向指針的指針 10.7.1 指針數(shù)組的概念 一個數(shù)組,若其元素均為指針類型數(shù)據(jù),稱為指針 數(shù)組,也就是說,指針數(shù)組中的每一個元素都相當于一 個指針變量。一維指針數(shù)組的定義形式為 類型名 * 數(shù)組名 數(shù)組長度 ; 例如: int * p4; 例 10.26將若干字符串按字母順序輸出 10.7.2 指向指針的指針 在掌握了指針數(shù)組的概念的基礎上,下面介紹指向 指針數(shù)據(jù)的指
18、針變量,簡稱為指向指針的指針。 例 10.27使用指向指針的指針 例 10.28指針數(shù)組的元素指向整型數(shù)據(jù) 10.7.3 指針數(shù)組作 main函數(shù)的形參 指針數(shù)組的一個重要應用是作為 main函數(shù)的形參。 在以往的程序中, main函數(shù)的第一行一般寫成以下形式: void main() 括號中是空的。實際上, main函數(shù)可以有參數(shù),例 如: void main(int argc, char * argv) 10.8 有關指針的數(shù)據(jù)類型和指針運算的小結 10.8.1 有關指針的數(shù)據(jù)類型的小結 定義 含義 int i; 定義整型變量 i int * p; p為指向
19、整型數(shù)據(jù)的指針變量 int an; 定義整型數(shù)組 a,它有 n個元素 int * pn; 定義指針數(shù)組 p,它由 n個指向整型數(shù)據(jù)的指針元素組成 int (*p)n; p為指向含 n個元素的一維數(shù)組的指針變量 int f(); f為返回整型函數(shù)值的函數(shù) int * p(); p為返回一個指針的函數(shù),該指針指向整型數(shù)據(jù) int (*p)(); p為指向函數(shù)的指針,該函數(shù)返回一個整型值 int ** p; p是一個指針變量,它指向一個指向整型數(shù)據(jù)的指針變量 10.8.2 指針運算小結 (1)指針變量加 (減 )一個整數(shù) (2)指針變量賦值 (3)指針變量可以有空值,即該指針
20、變量不指向任何變量 (4)兩個指針變量可以相減 (5)兩個指針變量比較 10.8.3 void指針類型 ANSI新標準增加了一個“ void”指針變量,即可定義 一個指針變量,但不指定它是指向哪一種類型數(shù)據(jù)的。 ANSI C標準規(guī)定用動態(tài)存儲分配函數(shù)時返回 void指針, 它可以用來指向一個抽象的類型的數(shù)據(jù),在將它的值賦 給另一指針變量時要進行強制類型轉換使之適合于被賦 值的變量的類型。 小結 在本章中介紹了指針的基本概念和初步應用。應該說明,指 針是 C語言中重要的概念,是 C的一個特色。使用指針的優(yōu)點 : (1) 提高程序效率; (2)在調用函數(shù)時變量改變了的值能夠為主調函
21、數(shù) 使用,即可以從函數(shù)調用得到多個可改變的值; (3)可以動態(tài)存儲 分配。 但是同時應該看到,指針使用實在太靈活,對熟練的程序員 來說,可以利用它編寫出頗有特色的、質量優(yōu)良的程序,實現(xiàn)許 多用其他高級語言難以實現(xiàn)的功能,但也十分容易出錯,而且這 種錯誤往往比較隱蔽。由于指針運用的錯誤可能會使整個程序遭 受破壞,比如由于未對指針變量 p賦值就向 *p賦值,就可能破壞 了有用的單元的內容。有人說指針是有利有弊的工具,如果使用 指針不當,會出現(xiàn)隱蔽的、難以發(fā)現(xiàn)和排除的故障。因此,使用 指針要十分小心謹慎,要多上機調試程序,以弄清一些細節(jié),并 積累經(jīng)驗。 此課件下載可自行編輯修改,供參考! 感謝您的支持,我們努力做得更好!