版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第十章 指針指針變量指針與數(shù)組的關系指針與字符串指針數(shù)組及指向指針的指針指針的基本概念指針的基本概念直接訪問與間接訪問v直接訪問:按變量地址存取變量值v間接訪問:通過存放變量地址的變量去訪問變量.2000200420062005整型變量i3200120022003main() int i; i=3; printf(“%d”,i); 這種訪問變量的方式稱為直接訪問 與直接訪問相對應,對變量訪問的另一種方式是間接訪問.20002004200620053200120022003ip2000如上圖所示,當要訪問 i 時,先訪問變量 p 所在的存儲單元,從中得到變量i所在的存儲單元2000,然后通過這個
2、地址訪問變量 i 。在上述描述中,有兩個基本的操作要完成:怎樣把變量 i i 的地址賦給變量 p 。怎樣通過變量 p p 來訪問(操作)變量 i i 。為此,C中有兩個專門的運算符來完成上述兩個操作&:取地址運算符* :指針運算符(間接訪問運算符),該運算符將其后的操作數(shù)當成地址對待,并訪問該地址。例如,在上圖中,對于變量 p ,若欲使其中的值為變量 i 的地址,則可用操作 p=&i ;經(jīng)此操作后,*p即相當于變量i。對于變量p,因為其特殊性,因此被稱為指針變量,簡稱指針。其實所謂指針就是地址,而指針變量則是專門存放地址值的一種變量。指針、指針變量指針:一個變量的地址指針變量:
3、專門存放變量地址的變量定義: 數(shù)據(jù)類型 *指針名; 如 :int *p;說明:類型標識符說明了指針變量所指向的變量類型。一個指針變量只能指向規(guī)定類型的變量,如定義:int * p;則指針p只能指向整型變量。 定義指針變量時“ * ”不能少,但真正的指針變量是*號后面的指針變量名p ,不是*p指針變量定義后,變量值不確定,應用前必須先賦值例 main( ) int i=10; int *p; *p=i; printf(“%d”,*p); 危險!例 main( ) int i=10,k; int *p; p=&k; *p=i; printf(“%d”,*p); .2000200420062
4、005整型變量i10指針變量p200120022003隨機指針變量中只能存放變量的地址,向其中進行直接賦值是不對的。如,若有定義:int * p,i; 則以下正確的操作是:則以下正確的操作是:p=100;p=&100;p=i;p=&i;對指針變量的操作 ,應使用運算符:&和*。讀下程序:指針變量的使用指針變量的使用main()() int a,b,t , * p1,* p2; a=3;b=5; p1=&a; p2=&b; printf(“a=%d,b=%dn”,a,b); printf(“*p1=%d,*p2=%dn”,”,*p1,*p2); *p1=7
5、; *p2=9; printf(“%a=%d,b=%dn”,a,b);); 通過這個程序可以看到:通過這個程序可以看到:指針變量定義后,若要指針變量定義后,若要其和某個變量建立聯(lián)系(指向該變量),可以通其和某個變量建立聯(lián)系(指向該變量),可以通過過p1=&a的操作達到目的,的操作達到目的,如果有如果有p=&a,則,則*p1即指向變量即指向變量a ,*p即是變量即是變量a。例 輸入兩個數(shù),并使其從大到小輸出main() int *p1,*p2,*p,a,b; scanf(%d,%d,&a,&b); p1=&a; p2=&b; if(ab) p=p1
6、; p1=p2; p2=p; printf(a=%d,b=%dn,a,b); printf(max=%d,min=%dn,*p1,*p2);運行結果:a=5,b=9 max=9,min=5.指針變量p1 指針變量p20002008200220042006 指針變量p2 整型變量b 整型變量a5200692008200620082006l指針變量作為函數(shù)參數(shù)地址傳遞特點:共享內存,“雙向”傳遞swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d
7、,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab)swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);.20002008200A200220042006200C200E2010.59整型變量a 整型變量b(main)指針pointer_1指針pointer_220002002(swap)指針p1指針p2整型p5920002002COPY5例 將數(shù)從大到小輸出swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int
8、 a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab)swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);.20002008200A200220042006200C200E2010.59整型變量a 整型變量b(main)指針pointer_1指針pointer_22000200259例 將數(shù)從大到小輸出運行結果:9,5地址傳遞指針與一維數(shù)組指向數(shù)組元素的指針變量如前所述,數(shù)組中的每一個元素都相當于一個單
9、獨的變量。因此,同樣可以用一個指針變量來指向數(shù)組中的元素。對于數(shù)組指針,從字面上理解,即是“數(shù)組的指針”,或說是“指向數(shù)組的指針”。而“變量x的指針中存放的其實是變量x的地址”,因此,“數(shù)組指針中存放的是數(shù)組的地址”,或者說“數(shù)組指針中存放的是數(shù)組的首地址,即數(shù)組中第一個元素的地址”。定義數(shù)組指針的方法與定義指針變量的方法相同,如: int a10int a10,* *p p;當p=p=&a0&a0時,我們稱p為數(shù)組a的指針。由于在C中,數(shù)組名即代表數(shù)組的起始地址,因此,對數(shù)組指針p有另一種賦值方式:p=a;其意義與p=&a0;相同。 即然數(shù)組指針p中的值為a0的地址,
10、那么,*p即代表數(shù)組元素a0。如果有*p=5,則a0=5。 可是用數(shù)組指針p如何引用數(shù)組a中其它元素的值呢?一個概念:一個概念:在C中,指針類型的變量可以進行加減法,如可以有p=p+1,p=p+i,p+等;但是,指針指針變量進行的不是一般的加減法!變量進行的不是一般的加減法!如:若指針變量p中的值為2000,則執(zhí)行p=p+1后,p中的值并不一定是2001。相加后的值是多少要根據(jù)指針p所指向的數(shù)據(jù)類型來確定。如:若定義int * p;即p指向整型,則執(zhí)行p=p+1后,p中的值為2002;若定義float * p;則執(zhí)行p=p+1后,p的值為2004;結論:結論:p=p+1p=p+1的操作是使指針
11、的操作是使指針p p指向數(shù)組中的下一指向數(shù)組中的下一個元素。個元素。例 p指向float數(shù),則 p+1 p+1 4例 p指向int型數(shù)組,且p=&a0; 則p+1 指向a1例 int a10; int *p=&a2; p+; *p=1;例 int a10; int *p1=&a2; int *p2=&a5; 則:p2-p1=3;a0a1a2a3a4a5a6a7a8a9a數(shù)組pp+1,a+1p+i,a+ip+9,a+91例:用數(shù)組指針輸出數(shù)組a中的元素mainmain()() int a10=1 int a10=1,3 3,2 2,5 5,4 4,7 7,9 9,
12、8 8,10;10; int int * * p p; forfor(p=ap=a;p &a10p &a10;p+)p+) printf printf(“%d”%d”,* *p p);); 數(shù)組元素表示方法a0a1a2a3a9.aa+9a+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)p0p1p2p9a0a1a2a3a4例 數(shù)組元素的引用方法main() int a5,*pa,i; f
13、or(i=0;i5;i+) ai=i+1; pa=a; for(i=0;i5;i+) printf(*(pa+%d):%dn,i,*(pa+i); for(i=0;i5;i+) printf(*(a+%d):%dn,i,*(a+i); for(i=0;i5;i+) printf(pa%d:%dn,i,pai); for(i=0;i5;i+) printf(a%d:%dn,i,ai);12345pamain() int i,*p,a7; p=a; for(i=0;i7;i+) scanf(%d,p+); printf(n); for(i=0;i7;i+,p+) printf(%d,*p);例 注
14、意指針的當前值p=a;pp58762730123456apppppp指針變量可以指到數(shù)組后的內存單元數(shù)組名作函數(shù)參數(shù)v數(shù)組名作函數(shù)參數(shù),是地址傳遞在C語言中,對于數(shù)組名,處理為數(shù)組的起始地址,因此,當用數(shù)組名作為函數(shù)參數(shù)時,傳遞的實際上是地址?;蛘哒f,傳遞的實際上是指針。例:用數(shù)組形式和指針形式分別編寫strlen函數(shù)int strlen(char str ) int i; for(i=0;stri!=0;i+) ; return i; int strlen(char * str ) int i; for( ;*str!=0;str+) i+ ; return i; 指針與二維數(shù)組用指針指向多
15、維數(shù)組時,在概念和使用上比指向一維數(shù)組的指針要復雜一些。先看下面的例子:main()() int i,j,a34; for(i=0;i3;i+) for(j=0;j4;j+) aij=15; printf(“%dn”,a0);); printf(“%dn”,*a);); - 13- 13為什么會這樣?因為在二維數(shù)組a34中,并不存在a0這個元素,而我們使用了a0,系統(tǒng)對它如何看待呢?如下圖所示:l對二維數(shù)組 int a34,有ua-二維數(shù)組的首地址,即第0行的首地址u對于對于一維數(shù)組a10,*a代表第0個元素的值;而對于二維數(shù)組a34,*a不是第0個元素的值,而是第0行元素的起始地址u*(ai
16、+j) *(*(a+i)+j) aij第i行第j列的元素地址int a34;a0a1a2200020082016200020022008201020162018a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2例:輸出二維數(shù)組中的全部元素。例:輸出二維數(shù)組中的全部元素。 main()int a34=1,3,5,7,9,; int i,j; for(i=0;i3;i+) for(j=0;j4;j+) printf(“%4d”,aij); printf(“n”); 若改成數(shù)組名的指針形式,應如何修改?若改成數(shù)組名的指針形式,應如何修改? 用數(shù)組名的指針形式用數(shù)組
17、名的指針形式輸出二維數(shù)組中的元素。輸出二維數(shù)組中的元素。 main()int a34=1,3,5,7,9,; int i,j; for(i=0;i3;i+) for(j=0;j4;j+) printf(“%4d”, *(*(a+i)+j) ); printf(“n”); 關鍵關鍵: :當用數(shù)組名的指針形式引用當用數(shù)組名的指針形式引用二維數(shù)組中的元素時二維數(shù)組中的元素時, ,是兩個是兩個 * * 號而非號而非1 1個個 指針與字符串最容易接受的字符串指針應該是下面這種:main() static char a20=“how do you do?”; char * p; int i; p=&
18、;a0; for(i=0;i10;i+) printf(“%c”,*p+);v用字符指針實現(xiàn)但這里要講的字符串指針是另外一種??吹@里要講的字符串指針是另外一種??聪旅娴睦樱合旅娴睦樱?) main()2) char * p;3) p=“How do you do?”;4) printf(“%s”,p);5) 注意: 程序第二、三行!程序的第二行定義了一個字符指針變量p ,第三行的作用是會么呢?是把字符串“How do you do?”賦值給指針p嗎?當然不是!在C中,字符串與數(shù)組名一樣,代表的數(shù)組的起始地址(應該說,在編譯時被轉換成地址)。因此,該句的作用是將字符串“How do you
19、 do?”的起始地址賦值給p,也就是說,使指針p指向字符串“How do you do?”。這種方法與用字符數(shù)組處理字符串有何區(qū)別?試比較以下兩種賦值方式的區(qū)別:char a =“good!”;printf(“%s”,a);char * p =“good!”;printf(“%s”,p);ag2000ood!0p2000g2000ood!0對于以上兩種字符串的處理方式,其結果雖然一樣,但其實現(xiàn)機制卻大不相同:前者是通過數(shù)組來實現(xiàn),后者則是通過指針實現(xiàn)。我們知道:數(shù)組名代表的是數(shù)組的起始地址,它是一個常量;而后者則是一個指針變量。因此,我們對于指針變量p,可以寫出如下語句:char * p=“a
20、bcde”; printf(“%sn”,p); p=“123456789”; printf(“%sn”,p);對于字符數(shù)組a,則不能如此方便地改變其中的值。如果在程序的運行過程中要改變值,只能通過函數(shù)調用來實現(xiàn)!例:用指針將字串1的內容復制到字串2。main()() char a=“C program.”; char b20,*p1,*p2; int i; p1=a; p2=b; for( ;* p1!=0;p1+,p2+) * p2 = * p1; * p2=0; printf(“string a is:%sn”,a); printf(“string b is:%sn”,b); 指針數(shù)組和指
21、向指針的指針用于處理二維數(shù)組或多個字符串指針數(shù)組v定義:數(shù)組中的元素為指針變量v定義形式:存儲類型 數(shù)據(jù)類型 *數(shù)組名元素個數(shù)元素個數(shù);char * pa5;/*定義一個有5個元素的一維指針數(shù)組;其中的每個元素都是一個字符指針。*/因為每個字符指針同時有是一個字符串指針,可以指向一個字符串;因此,一個指針數(shù)組中的多個指針元素可以指向多個字符串。如果有定義: char * pa5=“111”,“2222”, “33333”,“44”,“555”則相當于有: pa0=“111”; pa1=“2222”; pa2=“33333”; pa3=“44”; pa4=“555”;main() int b23
22、,*pb2; int i,j; for(i=0;i2;i+) for(j=0;j3;j+) bij=(i+1)*(j+1); pb0=b0; pb1=b1; for(i=0;i2;i+) for(j=0;j3;j+,pbi+) printf(b%d%d:%2dn,i,j,*pbi);例 用指針數(shù)組處理二維數(shù)組int *pb2pb0pb1int b23b00 *pb0b01 *(pb0+1)b02 *(pb0+2)b10 *pb1b11 *(pb1+1)b12 *(pb1+2)123246例 對字符串排序(簡單選擇排序)main() void sort(char *name,int n), pr
23、int(char *name,int n); char *name=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sort(name,n); print(name,n);void sort(char *name,int n) char *temp; int i,j,k; for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; name0name1name2name3name4nameGreat WallFORTR
24、ANComputerFollow meBASICkjkjjji=0例 對字符串排序(簡單選擇排序)main() void sort(char *name,int n), print(char *name,int n); char *name=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sort(name,n); print(name,n);void sort(char *name,int n) char *temp; int i,j,k; for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j; if(
25、k!=i) temp=namei; namei=namek; namek=temp; name0name1name2name3name4nameGreat WallFORTRANComputerFollow meBASICkkjjji=1k例 對字符串排序(簡單選擇排序)main() void sort(char *name,int n), print(char *name,int n); char *name=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sort(name,n); print(name,n);void sor
26、t(char *name,int n) char *temp; int i,j,k; for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; name0name1name2name3name4nameGreat WallFORTRANComputerFollow meBASICkkjji=2例 對字符串排序(簡單選擇排序)main() void sort(char *name,int n), print(char *name,int n); char *name=Follow
27、me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sort(name,n); print(name,n);void sort(char *name,int n) char *temp; int i,j,k; for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; name0name1name2name3name4nameGreat WallFORTRANComputerFollow meBASICkkji=3例 對字符串排序(簡單
28、選擇排序)main() void sort(char *name,int n), print(char *name,int n); char *name=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sort(name,n); print(name,n);void sort(char *name,int n) char *temp; int i,j,k; for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; n
29、ame0name1name2name3name4nameGreat WallFORTRANComputerFollow meBASIC命令行參數(shù)v命令行:在操作系統(tǒng)狀態(tài)下,為執(zhí)行某個程序而鍵入的一行字符v命令行一般形式:命令名 參數(shù)1 參數(shù)2參數(shù)nmain(int argc, char *argv) v命令行參數(shù)傳遞v帶參數(shù)的main函數(shù)形式:C:TC copy.exe source.c temp.c命令行中參數(shù)個數(shù)元素指向命令行參數(shù)中各字符串首地址形參名任意命令行實參main(形參)系統(tǒng)自動調用main函數(shù)時傳遞第一個參數(shù): main所在的可執(zhí)行文件名可執(zhí)行文件名例 輸出命令行參數(shù)/*tes
30、t.c*/main(int argc, char *argv) while(argc1) +argv; printf(%sn,*argv); -argc; main(int argc, char *argv) while(argc-0) printf(%sn,*argv+);1. 編譯、鏈接test.c,生成可執(zhí)行文件test.exe2. 在DOS狀態(tài)下運行(test.exe所在路徑下)例如: C:TC test.exe hello world!運行結果:hello world!運行結果:test hello world!argv0argv1argv2char *argvworldtesthelloargvargc=3指向指針的指針l定義形式:存儲類型 數(shù)據(jù)類型 *指針名;如 int *pp;對于指向指針的指針對于指向指針的指針pp,因為它指向的變量是一個指,因為它指向的變量是一個指針變量,即針變量,即(*pp)為指針變量
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙江海洋大學《電機學2》2023-2024學年第一學期期末試卷
- 高性能纖維防護制品研發(fā)生產(chǎn)項目可行性研究報告寫作模板-備案審批
- 中國計量大學現(xiàn)代科技學院《控制電機》2023-2024學年第一學期期末試卷
- 中央財經(jīng)大學《航空自動化控制》2023-2024學年第一學期期末試卷
- 小學師生讀書評價制度
- 昭通職業(yè)學院《臨床藥理學(醫(yī)學檢驗)》2023-2024學年第一學期期末試卷
- 云南現(xiàn)代職業(yè)技術學院《大數(shù)據(jù)思維與決策》2023-2024學年第一學期期末試卷
- 企業(yè)市值管理中資本結構優(yōu)化的研究
- 合規(guī)性旅游業(yè)務培訓模板
- DB2201T 65.1-2024 肉牛飼養(yǎng)技術規(guī)范 第1部分:種牛
- 培訓透平發(fā)電機
- 人教版九年級物理全一冊 20.2電生磁同步練習(含答案)
- 高中數(shù)學三角函數(shù)圖像變換訓練-含答案
- 小收納 大世界-整理與收納知到章節(jié)答案智慧樹2023年黑龍江幼兒師范高等??茖W校
- 冷凝水的管理
- 讓我們的家更美好教案人教部編版道德與法治五年級下冊
- 鋼筋直螺紋機械連接安裝質量檢查記錄表
- 大宗商品交易管理辦法
- 銀行分管財務副行長個人述職報告4篇全文
- 年終頒獎PPT模板
- 7.6用銳角三角函數(shù)解決問題(3)
評論
0/150
提交評論