C語言程序設計課件:第5章 指針2_第1頁
C語言程序設計課件:第5章 指針2_第2頁
C語言程序設計課件:第5章 指針2_第3頁
C語言程序設計課件:第5章 指針2_第4頁
C語言程序設計課件:第5章 指針2_第5頁
已閱讀5頁,還剩31頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、5.2 指針與數組的關系指針與數組的關系在在C C語言中,指針與數組有著十分密切的關系。語言中,指針與數組有著十分密切的關系。訪問數組元素有兩種方法:即訪問數組元素有兩種方法:即下標法下標法和和指針法指針法。 指向數組的指針指向數組的指針指向數組的指向數組的起始地址起始地址,指向數指向數組元素的指針組元素的指針是數組是數組元素的地址元素的地址。60006001600260036004600560066007a0a1a2a3aa+1a+260006001600260036004600560066007a0a1a2a3app+p+ 數組元素表示方法數組元素表示方法a0a1a2a3a9.aa+9a+

2、1a+2地址地址元素元素下標法下標法a0a1a2a9a0a1a2a3a9.pp+9p+1p+2地址地址元素元素指針法指針法*p*(p+1)*(p+2)*(p+9)ai *(a+i)ai pi *(p+i) *(a+i)*a*(a+1)*(a+2)*(a+9)p0p1p2p9.12341. p+1與與p+的異同:的異同:p+1與與p+都指向當前指針所指單元的下一個元素都指向當前指針所指單元的下一個元素p+1并不改變當前指針的指向,即并不改變當前指針的指向,即p的值并未改變,的值并未改變, 而而p+相當于相當于p=p+1,即使指針即使指針p向下移動一個元素向下移動一個元素位置位置2. 在對指針進行

3、加、減運算中,數字在對指針進行加、減運算中,數字1 1不再代表十進不再代表十進制中的整數制中的整數1 1,即,即 p+1p+1p +1*sizeof(基類型)基類型)pp+12的高位字節的高位字節2的低位字節的低位字節2的高位字節的高位字節2的低位字節的低位字節10001002100410061008a0a1a2a3a4pshort a5= 2,4, 23,6,78 ;short *p;p=a;若是若是 :p+1若是若是 :p基類型是基類型是 short , p+1相相當于加上當于加上2個字節個字節例例 int a =1,2,3,4,5,6,7,8,9,10, *p=a, i; 數組元素數組元

4、素地址的正確表示:地址的正確表示:(A)&(a+1) (B)a+ (C)&p (D)&pi數組名是數組名是地址常量地址常量p+,p- ( )a+,a- ( )a+1, *(a+2) ( )不能對表達式不能對表達式求地址求地址求的是指針求的是指針p的地址的地址#include main() int i,*p,a7; p=a; for(i=0;i7;i+) scanf(%d,p+); printf(n); for(i=0;i7;i+,p+) printf(%dt,*p);例例 注意指針的當前值注意指針的當前值p=a;pp5876273 0 1 2 3 4 5 6appppp

5、p指針變量可以指到指針變量可以指到數組后數組后的內存單元的內存單元 am-10 am-11 am-1n-1 a00 a01 . a0n-1 a10 a11 . a1n-1 .amn= am-1n-1 . am-11 am-10 . a1n-1 . a11 a10 a0n-1 . a01 a00a0a1am-1a00a01a02a10a11a12a0+1a0+2&a11a1+1&a12&a01&a02 a00 a0a01a02a10 a1 a11a12 a a1+2 a23;a00a01a02a10a11a12 a00 a0a01a02a10 a1 a11a12

6、a a23;a 代表代表二二維數組的首地址,維數組的首地址,第第0 0行行的地址的地址a + i 代表代表第第i i行行的地址的地址a00a01a02a10a11a12 a00 a0a01a02a10 a1 a11a12 a a23;*(a + i) 即即 ai 代表代表第第i行行的地址的地址*(a+i) + j 即即 ai + j代表代表第第i行行的地址的地址&aij &a12a1+2a00a01a02a10a11a12 a00 a0a01a02a10 a1 a11a12 a a23;&a12a1+2( *(a+i) + j ) 即即 aij 代表代表第第i行第行第j

7、列列的的*(a + i) 即即 ai 代表代表第第i行行的地址的地址,*(a+i) + j 即即 ai + j代表代表第第i行行的地址的地址&aij short a34=1,2,3,4,5,6,7,8,9,10,11,12; int *p = &a00;a1a0a21234567891011 12行地址行地址a+2a+1a第第i行的地址為:行的地址為:a+i、*(a+i) 、ai、&ai 或或&ai0任一元素任一元素aij的地址為:的地址為:&aij、ai+j 、 *(a+i)+j 或或 p+i*4+j元素元素aij也可表示為:也可表示為: aij 、

8、*(ai+j) 、 *(*(a+i)+j) 或或*(p+i*4+j)*(a+i)a+iai&ai當一個指針變量所指向的元素為數組時,這種類型當一個指針變量所指向的元素為數組時,這種類型的指針稱為的指針稱為指向數組的指針指向數組的指針,其定義格式為:,其定義格式為: (* )數組的大小數組的大小; 如:如: int a34=1,2,3,4,5,6,7,8,9,10,11,12; int (* p)4; (* p)指明指明p是一個指針變量,再與是一個指針變量,再與4結合,表示該結合,表示該指針變量指向一個有四個元素的一維數組。指針變量指向一個有四個元素的一維數組。p= &a0; p

9、=a0;p指向的行的元素可以表示為指向的行的元素可以表示為(*p)0, (*p)3p= a,二維數組二維數組a中任一元素可表示為中任一元素可表示為pij( )( )不能少不能少int (*p)4與與int *p4不同不同p的值是一維數組的的值是一維數組的首地址,首地址,p p是是行指針行指針int a34;a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2pp+1p+2p0+1或 *p+1p1+2或 *(p+1)+2*(*p+1)或 (*p)1 *(*(p+1)+2)一維數組指針變量維數和一維數組指針變量維數和二維數組二維數組列數列數必須相同必須相同第第i

10、行、第行、第j 列元素列元素aij 的表示方法的表示方法是:是:*(*(p+i)+j)(*p)0(*p)1(*p)2(*p)3P#include main() int a34=1,3,5,7,9,11,13,15,17,19,21,23; int i, j, (*p)4; for(p=a, i=0;i3;i+,p+) for(j=0;j4;j+) printf(%4d ,*(*p+j); printf(n); 例例 一維數組指針變量舉例:一維數組指針變量舉例: 輸出二維數組每行每列元素的值輸出二維數組每行每列元素的值int a34;a00a01a10a11a20a21a02a03a12a13a

11、22a23ppp p0j p1j p2j運行結果:1 3 5 7 9 11 13 15 17 19 21 23 5.3 指針數組指針數組指針數組中每個元素都是一個指針,且這指針數組中每個元素都是一個指針,且這些指針指向相同數據類型的變量些指針指向相同數據類型的變量定義格式:定義格式: 類型說明符類型說明符 *數組名數組名常量常量N 如如 : char *p5;如果一個數組中的每個元素都是同類型的指針,則該數組稱如果一個數組中的每個元素都是同類型的指針,則該數組稱為指針數組。格式如下:為指針數組。格式如下: * ; 如如: int *p14; float *p216; 對指針數組初始化時其每個元

12、素的值都為地址。對指針數組初始化時其每個元素的值都為地址。當定義了一個指針變量時,如:當定義了一個指針變量時,如: char c, *p=&c; 系統會為指針變量系統會為指針變量p分配內存單元。我們可以定義分配內存單元。我們可以定義另一個指針,使得該指針指向另一個指針,使得該指針指向p的內存單元,如:的內存單元,如: char *pp=&p; pp稱為指向指針稱為指向指針p的指針,又稱為二級指針。的指針,又稱為二級指針。 定義二級指針的一般格式為:定義二級指針的一般格式為: *; pppcp2p1i# include void main(void)int i=10;int *p

13、1,*p2;p1=&i;p2=&p1;printf(i= %d %d %d n, i, *p1, *p2);printf(p1= %x %x %x n, &i, p1, *p2);printf(p2= %x %x n, &p1, p2);系統找到一塊未占用的內存,將其標記為已占系統找到一塊未占用的內存,將其標記為已占用,然后把地址返回,并標記此程序占用此塊用,然后把地址返回,并標記此程序占用此塊內存,其它程序不能再用它內存,其它程序不能再用它向系統申請大小為向系統申請大小為的內存塊的內存塊把首地址返回把首地址返回如果申請不成功,返回如果申請不成功,返回int *

14、pp = (int *) malloc(n * sizeof (int);if (p = NULL) printf(No enough memory!n); exit(0); 釋放由釋放由malloc()申請的內存塊申請的內存塊p是指向此塊內存的指針是指向此塊內存的指針free時系統標記此塊內存為未占用,可被重新分配時系統標記此塊內存為未占用,可被重新分配int *pp = (int *) malloc(n * sizeof (int);for (i=0;in;i+)pi = i;free(p);確保指針使用前是非空指針確保指針使用前是非空指針釋放向系統申請的存儲空間釋放向系統申請的存儲空間int *pp = (int *) malloc(n * sizeof (int);for (i=0;in;i+)pi = i;free(p);定義定義含義int i;int *p;int aN;int *pN;int (*p)N;int f();int *p();int (*

溫馨提示

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

評論

0/150

提交評論