




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、再論指針和數(shù)組,附錄一,預(yù)習(xí)檢查,鏈表單元有哪幾個(gè)部分組成 如何申請(qǐng)鏈表單元,及釋放鏈表單元 實(shí)現(xiàn)單鏈表插入的基本語(yǔ)法 簡(jiǎn)述一下快速排序基本理論要點(diǎn),課程目標(biāo),本章概述 指針與數(shù)組什么時(shí)候相同 C語(yǔ)言為什么把數(shù)組參數(shù)當(dāng)作指針 C語(yǔ)言的多維數(shù)組,及如何創(chuàng)建動(dòng)態(tài)數(shù)組。 本章目標(biāo) 掌握指針什么時(shí)候和數(shù)組相同,以為容易混淆的原因 掌握多維數(shù)組的內(nèi)存布局。 使用指針向函數(shù)傳遞多維數(shù)組參數(shù) 使用指針返回多維數(shù)組 使用指針創(chuàng)建和使用動(dòng)態(tài)數(shù)組 重點(diǎn) 指針和數(shù)組混淆的原因 指針傳遞多維數(shù)組參數(shù) 難點(diǎn) 指針和數(shù)組混淆的原因 創(chuàng)建和使用動(dòng)態(tài)數(shù)組,本章結(jié)構(gòu),指針與數(shù)組不相同,再論指針和數(shù)組,指針數(shù)組和數(shù)組指針,指針與
2、數(shù)組相同,函數(shù)指針和指針函數(shù),怎樣使用數(shù)組,指針運(yùn)算,1 再論指針和數(shù)組,指針與數(shù)組的不相同 指針與數(shù)組的相同 怎樣使用指針 指針運(yùn)算 函數(shù)指針和指針函數(shù) 指針數(shù)組和數(shù)組指針,1.1 指針與數(shù)組的不相同,數(shù)組和指針是如何訪問的 數(shù)組訪問指針數(shù)據(jù) 使聲明與定義相匹配 數(shù)組和指針的其他區(qū)別,1.1.1數(shù)組和指針是如何訪問的,申明區(qū)別 extern int *x; 聲明x是個(gè)int型的指針 extern int y y是個(gè)int型數(shù)組,長(zhǎng)度尚未確定 地址和內(nèi)容的區(qū)別,1.1.1數(shù)組和指針是如何訪問的,數(shù)組下標(biāo)引用特點(diǎn) 地址在編譯時(shí)可知 直接進(jìn)行操作 例: 數(shù)組:char a9“abedefgh”;
3、. 取值:c=ai,編譯器符號(hào)表具有一個(gè)地址9980,運(yùn)行步驟: 取i的值,將它與9980相加 取地址(9980i)的內(nèi)容。,圖A,1.1.2 數(shù)組訪問指針數(shù)據(jù),指針訪問特點(diǎn) 必須首先在運(yùn)行時(shí)取得它的當(dāng)前值 間接進(jìn)行操作 例: 指針:char *p 取值:c=*p,編譯器符號(hào)表有一個(gè)符號(hào)p,它的地址為4624,運(yùn)行步驟: 取地址4624的內(nèi)容,就是5081 取地址5081的內(nèi)容 。,5081,4642,圖B,1.1.2 數(shù)組訪問指針數(shù)據(jù),數(shù)組訪問指針特點(diǎn) 對(duì)內(nèi)存進(jìn)行直接的引用轉(zhuǎn)化為間接引用 例: 數(shù)組:char a9“abedefgh”; . 取值:c=ai,編譯器符號(hào)表有一個(gè)符號(hào)p,它的地址
4、為4624,運(yùn)行步驟: 1. 取地址4624的內(nèi)容,即5081。 2. 取得i的值,并將它與5081相加。 3. 取地址508l+i的內(nèi)容。,5081,4642,5081+i,圖C,1.1.2 數(shù)組訪問指針數(shù)據(jù),指針訪問特點(diǎn) char *p=“abcdefgh”;p3 d char a=”abcdefgh”; a3 d 訪問特點(diǎn) 取得符號(hào)表中P的地址,提取存儲(chǔ)于此處的指針。 把下標(biāo)所表示的偏移量與指針的值相加,產(chǎn)生一個(gè)地址。 訪問上面這個(gè)地址,取得字符。,1.1.3 數(shù)組和指針的其他區(qū)別,1.2 指針與數(shù)組的相同,什么時(shí)候指針與數(shù)組相同 混淆的原因 數(shù)組和指針規(guī)則 為什么C語(yǔ)言把數(shù)組形參當(dāng)作指
5、針 數(shù)組與指針歸納總結(jié),1.2.1 什么時(shí)候指針與數(shù)組相同,數(shù)組運(yùn)用特性 數(shù)組聲明 外部數(shù)組(external array)的聲明 數(shù)組的定義 函數(shù)參數(shù)的聲明 運(yùn)用特性 作為函數(shù)參數(shù)的數(shù)組名可以通過編譯器轉(zhuǎn)換為指針 使用數(shù)組時(shí),數(shù)組可以寫成指針 ,可以互換,1.2.1 什么時(shí)候指針與數(shù)組相同,數(shù)組與指針 編譯器處理時(shí)是不同的 一個(gè)數(shù)組就是一個(gè)地址 一個(gè)指針就是一個(gè)地址的地址 在運(yùn)行時(shí)的表示形式也是不一樣的 可能產(chǎn)生不同的代碼,1.2.2 數(shù)組和指針混淆的原因,分析:,char my _array10 char* my_ptr ; . j = strlen(my_array); J = strl
6、en(my_ptr); printf(”s s”,my_ptr,my_array);,1.2.2 數(shù)組和指針混淆的原因,數(shù)組和指針是相同的規(guī)則 表達(dá)式中的數(shù)組名(與聲明不同)被編譯器當(dāng)作一個(gè)指向該數(shù)組第一個(gè)元素的指針1。 下標(biāo)總是與指針的偏移量相同 在函數(shù)參數(shù)的聲明中,數(shù)組名被編譯器當(dāng)作指向該數(shù)組第一個(gè)元素的指針,1.2.3 數(shù)組和指針規(guī)則,“表達(dá)式中的數(shù)組名”就是指針 C語(yǔ)言把數(shù)組下標(biāo)作為指針的偏移量 “作為函數(shù)參數(shù)的數(shù)組名”等同于指針,1.2.3.1 “表達(dá)式中的數(shù)組名”就是指針,數(shù)組下標(biāo)的引用 一個(gè)指向數(shù)組的起始地址的指針加上偏移量” 下標(biāo)值的步長(zhǎng)調(diào)整到數(shù)組元素的大小 整型數(shù)的長(zhǎng)度是4個(gè)
7、字節(jié),那么ai+1和ai在內(nèi)存中的距離就是4(而不是1) 例:訪問ai: int a10; int*p; Int i=2 ;,p = a; pi;,p = a; *(p+i);,p = a+i; *p;,訪問數(shù)組第i個(gè)元素的三張方式,1.2.3.1 “表達(dá)式中的數(shù)組名”就是指針,數(shù)組的引用不能用指向該數(shù)組第一個(gè)元素的指針規(guī)則 數(shù)組作為sizeof()的操作數(shù)一顯然此時(shí)需要的是整個(gè)數(shù)組的大小,而不是指針?biāo)赶虻牡谝粋€(gè)元素的大小。 使用 c=pi Func(char *p); c=pi 編譯器符號(hào)表顯示p可以取址,從堆棧指針sp偏移14個(gè)位置運(yùn)行時(shí) 步驟1:從sp偏移14個(gè)位置找到函數(shù)的活動(dòng)記錄,
8、取出實(shí)參。 步驟2:取i的值,并與5081相加。 步驟3:取出地址(508i)的內(nèi)容。,1.2.4 為什么C語(yǔ)言把數(shù)組形參當(dāng)作指針,數(shù)組,指針實(shí)參的一般用法,1.2.5 數(shù)組與指針歸納總結(jié),用ai這樣的形式對(duì)數(shù)組進(jìn)行訪問總是被編譯器“改寫”或解釋為像*(a+1)這樣的指針訪問。 指針始終就是指針。它絕不可以改寫成數(shù)組。 在特定的上下文中,也就是它作為函數(shù)的參數(shù)(也只有這種情況),一個(gè)數(shù)組的聲明可以看作是一個(gè)指針。作為函數(shù)參數(shù)的數(shù)組(就是在一個(gè)函數(shù)調(diào)用中)始終會(huì)被編譯器修改成為指向數(shù)組第一個(gè)元素的指針。 當(dāng)把一個(gè)數(shù)組定義為函數(shù)的參數(shù)時(shí),可以選擇把它定義為數(shù)組,也可以定義指針。不管選擇哪種方法,在
9、函數(shù)內(nèi)部事實(shí)上獲得的都是一個(gè)指針。 定義和聲明必須匹配,1.3 怎樣使用數(shù)組,多維數(shù)組 向函數(shù)傳遞一個(gè)多維數(shù)組 從函數(shù)返回一個(gè)數(shù)組,1.3.1 多維數(shù)組,多維數(shù)組特性 多維數(shù)組內(nèi)存布局 如何分解多維數(shù)組 如何對(duì)數(shù)組進(jìn)行初始化,1.3.1.1 多維數(shù)組特性,定義和引用多維數(shù)組惟一的方法就是使用數(shù)組的數(shù)組 注意:ijk 與I,j,k 多維數(shù)組看作是一種向量 多維數(shù)組的定義 聲明一個(gè)1020的多維字符數(shù)組 char carrot1020; 或者聲明一種看上去更像“數(shù)組的數(shù)組”形式: typedef char vegetable20; vegetable carrot10; 不論哪種情況,訪問單個(gè)字符
10、都是通過carrotij的形式, 編譯器在編譯時(shí)會(huì)把它解析為*(*(carrot+i)+j)的形式,1.3.1.2 多維數(shù)組的內(nèi)存布局,多維數(shù)組內(nèi)存布局 pea12的內(nèi)存表示:線性存儲(chǔ) 表達(dá)式為:*(*(pea+i)+j),Pea0,Pea1,Pea1,Pea1,Pea0 1 2 3,Pea12,1.3.1.3 如何分解多維數(shù)組,分解特點(diǎn): 多維數(shù)組是如何分解為幾個(gè)單獨(dú)的數(shù)組的 多維數(shù)組每一個(gè)單獨(dú)的數(shù)組都可以看作是一個(gè)指針 不能把一個(gè)數(shù)組賦值給另一個(gè)數(shù)組 多維數(shù)組分解 int apricot235 sizeof(apricot) 區(qū)域 sizeof(apricoti) sizeof(apric
11、otij) sizeof(apricotijk),1.3.1.4 如何對(duì)數(shù)組進(jìn)行初始化,嵌套的花括號(hào)進(jìn)行初始化多維數(shù)組 如 short cantaloupe25= 10,12,3,4,一5, 31,22,6,0,-5, ; 如 int rhubarb3=0,0,0,1,1,1,;,1.3.1.4 如何對(duì)數(shù)組進(jìn)行初始化,建立指針數(shù)組進(jìn)行初始化多維數(shù)組 如 如,只有字符串常量才可以初始化指針數(shù)組 指針數(shù)組不能由非字符串的類型直接初始化 int *weights= 1,2,3,4,5, 6,7, 8,9,10 ;,char vegetables 9 = “carrot”, “celery”, “co
12、rn”, “cilantro”, “crispy fried patatoes”,char *vegetables= “carrot”, “celery”, “corn”, “cilantro”, “crispy fried patatoes” ,1.3.1.4 如何對(duì)數(shù)組進(jìn)行初始化,建立數(shù)組進(jìn)行初始化多維數(shù)組 如:,int row_1=1,2,3,4,5,-1; *一1是行結(jié)束標(biāo)志* int row_2=6,7,-1; int row_3=8,9,10,-1; int *weight= row_1, row_2, row_3 ;,1.3.2 向函數(shù)傳遞一個(gè)多維數(shù)組,方法1 模式:my_fun
13、ction(int my_array1020); 特點(diǎn): 最簡(jiǎn)單的方法 作用最小的 例子,int a33 = 1, 1, 1, 2, 2, 2, 3, 3, 3 ; / 函數(shù)定義 void Func(int array33); ,Main() / 函數(shù)調(diào)用 Func(a33); ,1.3.2 向函數(shù)傳遞一個(gè)多維數(shù)組,方法2 模式:my_function(int my_array20) ; 例: 方法3 (指針傳遞模式) 模式:my_function(char *my_array),int a33 = 1, 1, 1, 2, 2, 2, 3, 3, 3 ; / 函數(shù)定義 void Func(in
14、t *array); ,Main() / 函數(shù)調(diào)用 Func(a); ,1.3.3 從函數(shù)返回一個(gè)數(shù)組,怎樣返回一個(gè)數(shù)組 一個(gè)指向任何數(shù)據(jù)結(jié)構(gòu)的指針 一個(gè)指向數(shù)組的指針 例:,int(*pal()20; int(*pal()20 /*聲明一個(gè)指向包含20個(gè)int元素的數(shù)組的指針*/ int(*pear)20; pear=calloc(20,sizeof(int); if(!pear)longjmp(error,1); return pear; ,階段小節(jié),數(shù)組在什么時(shí)候和指針相同 數(shù)組與指針混淆原因是什么 數(shù)組當(dāng)作函數(shù)傳遞的好處是什么 如何向一個(gè)函數(shù)傳遞一維數(shù)組,1.4 指針運(yùn)算,什么是間接引
15、用 最多可以使用幾層指針 void指針與空指針 指針運(yùn)算,1.4.1 什么是間接引用,間接引用: 指向變量或內(nèi)存中的對(duì)象的指針 指針就是對(duì)對(duì)象值的間接引用 一個(gè)間接引用的例子,#include Int main() int i; int * p ; i = 5; p = / * see FAQ XVI. 4 * / ,1.4.2 最多可以使用幾層指針,一個(gè)指針時(shí)最多可以包含幾層間接引用 至少可以有12層 如: 最多可以使用多少層指針而不會(huì)使程序變得難讀 不要使用兩層以上的指針 程序運(yùn)行時(shí)最多可以有幾層指針 無限層,int i = 0; int * ip0l = ,1.4.2 最多可以使用幾層指
16、針,例:一個(gè)有無限層間接引用的循環(huán)鏈表,/*Would run forever if you didnt limit it to MAX */ # include struct circ_list char value 3 ; struct circ_list * next; ; struct circ_list suffixes = th , ,# define MAX 20 main() int i = 0; struct circ_list *p = suffixes; while (i value); + +i; p = p-next; ,1.4.3 void指針與空指針,什么是空指針
17、 什么是void指針 NULL總是被定義為0嗎,1.4.3.1 什么是空指針,空指針 并不指向任何對(duì)象指針 值是NULL , NULL可能是0,0L或(void*)0 絕對(duì)不能間接引用一個(gè)空指針,1.4.3.1 什么是空指針,空指針的用法 用空指針終止對(duì)遞歸數(shù)據(jù)結(jié)構(gòu)的間接引用 用空指針作函數(shù)調(diào)用失敗時(shí)的返回值 用空指針作警戒值,1.4.3.2 什么是void指針,void指針 通用指針或泛指針 不屬于任何類型 常常用作函數(shù)指針 內(nèi)存操作 內(nèi)存操作 例子 char *strepy(charstrl,const char *str2); char *strncpy(char *strl,const
18、 char *str2,size_t n); void *memcpy(void *addrl,void *addr2,size_t n);,1.4.3.3 NULL總是被定義為0嗎,NULL 與 NULL不是被定義為0,就是被定義為(void *)0,if(/* */) pNULL; else p/* something else */; /* */ if(p0),1.4.4 指針運(yùn)算,兩個(gè)指針可以相減嗎 把一個(gè)值加到一個(gè)指針上意味著什么 兩個(gè)指針可以相加嗎,1.4.4.1 兩個(gè)指針可以相減嗎,如果兩個(gè)指針向同一個(gè)數(shù)組,它們就可以相減,其為結(jié)果為兩個(gè)指針之間的元素?cái)?shù)目 如果兩個(gè)指針不是指向一
19、個(gè)數(shù)組,它們相減就沒有意義 指針相減的結(jié)果是某種整類型的值 ptrdiff_t,1.4.4.1 兩個(gè)指針可以相減嗎,指針的相減運(yùn)算,# include # include struct stuff char namel6; ; struct stuff array = The , quick , brown , fox , jumped , over , the , lazy , dog. , ;,main ( ) struct stuff * p0 = / * see FAQ XVI. 4 * / ,1.4.4.2 把一個(gè)值加到一個(gè)指針上意味著什么,當(dāng)把一個(gè)整型值加到一個(gè)指針上后,該指針指向
20、的位置就向前移動(dòng)了一段距離 這段距離對(duì)應(yīng)的字節(jié)數(shù)等于該值和該指針?biāo)赶虻膶?duì)象的大小的乘積,1.4.4.3 兩個(gè)指針可以相加嗎,兩個(gè)指針是不能相加的 如: p=(p+p2)-p1; 正確的語(yǔ)句應(yīng)該是: pp+(p2-p1); 對(duì)此例來說,使用下述語(yǔ)句更好: p+p2-p1;,1.5 函數(shù)指針和指針函數(shù),指針函數(shù) 函數(shù)指針 函數(shù)指針的用法,1.5.1 指針函數(shù),定義: 指帶指針的函數(shù),即本質(zhì)是一個(gè)函數(shù) 語(yǔ)法: 返回類型標(biāo)識(shí)符 * 返回名稱(形式參數(shù)表) 函數(shù)體 特點(diǎn): 返回類型可以是任何基本類型和復(fù)合類型 返回一個(gè)指針變量的值 可以把整個(gè)函數(shù)看成一個(gè)變量,1.5.1 指針函數(shù),例子:,函數(shù)定義:,
21、#include “stdio.h” float *find(); main() static float score4=60,70,80,90, 56,89,34,45, 34,23,56,45; float *p; int i,m; printf(Enter the number to be found:); scanf(%d, ,/*定義指針函數(shù)*/ float * find(float(*pionter)4,int n) float *pt; pt=*(pionter+n); return(pt); ,1.5.2 函數(shù)指針,定義: 指向函數(shù)的指針變量 語(yǔ)法: 數(shù)據(jù)類型標(biāo)志符 (*指針變
22、量名)(參數(shù)) 特點(diǎn): 是指針變量 指向類型為函數(shù) 可用該指針變量調(diào)用函數(shù),1.5.2 函數(shù)指針,例子:,函數(shù)定義:,void main() int (*ptr)(); int a,b,c; ptr=max; scanf(%d,%d, ,/*定義函數(shù)*/ int max(int x,int y) return(xy?x:y); ,1.6 函數(shù)指針的用法,定義函數(shù)指針類型 / 定義一個(gè)原型為int Fun( int a );的函數(shù)指針 typedef int (*PTRFUN) ( int aPara );,函數(shù)指針變量的定義 PTRFUN pFun; / pFun 為函數(shù)指針變量名 int (*pFun2) ( int a ); / pFun2也是函數(shù)指針變量名,1.6 函數(shù)指針的用法,函數(shù)指
溫馨提示
- 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. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中介服務(wù)在創(chuàng)新創(chuàng)業(yè)企業(yè)戰(zhàn)略規(guī)劃中的作用考核試卷
- 醫(yī)療器械生產(chǎn)中信息化學(xué)品的質(zhì)量控制與數(shù)據(jù)分析應(yīng)用考核試卷
- 倉(cāng)儲(chǔ)安全操作人員健康管理考核試卷
- 記賬實(shí)操-事業(yè)單位的會(huì)計(jì)賬務(wù)處理分錄
- 機(jī)械維修自動(dòng)化與機(jī)器人技術(shù)
- 二手房買賣協(xié)議書14篇
- 永州支隊(duì)團(tuán)日活動(dòng)方案
- 漢語(yǔ)團(tuán)隊(duì)教研活動(dòng)方案
- 歡迎國(guó)慶活動(dòng)方案
- 殘聯(lián)宣傳年活動(dòng)方案
- 生產(chǎn)用零部件不合格品管理辦法
- LY/T 2773-2016綠地月季栽培養(yǎng)護(hù)技術(shù)規(guī)程
- GB/T 29409-2012木材儲(chǔ)存保管技術(shù)規(guī)范
- GB/T 15909-2017電子工業(yè)用氣體硅烷
- 第一章有理數(shù)單元測(cè)試 人教版七年級(jí)數(shù)學(xué)上冊(cè)
- GB 2707-2016食品安全國(guó)家標(biāo)準(zhǔn)鮮(凍)畜、禽產(chǎn)品
- 建設(shè)工程施工合同司法解釋課件
- NB∕T 10731-2021 煤礦井下防水密閉墻設(shè)計(jì)施工及驗(yàn)收規(guī)范
- 《干部履歷表》(1999版電子版)
- 大學(xué)生創(chuàng)新創(chuàng)業(yè)訓(xùn)練計(jì)劃項(xiàng)目(模板)
- 巨量引擎O-5A人群資產(chǎn)經(jīng)營(yíng)方法論
評(píng)論
0/150
提交評(píng)論