版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、指針C語言內容提要指針的概念;難點:對指針數據類型的理解 數組的下標法引用和指針法引用;難點:二維數組的地址和指針概念 利用字符指針存取字符串;難點:字符數組和字符指針的區(qū)別與聯系 指針數組應用;難點:指向數組的指針與指針數組的區(qū)別 帶參數的main函數;10.1地址和指針的概念printf (“%d,i);scanf (“%d, &i);k = i+j;內存區(qū)的每一個字節(jié)有一個編號,這就是“地址 。程序中定義了一個變量,在對程序進行編譯時,系統就會給這個變量分配內存單元,但是沒有賦值?!爸苯釉L問方式:按變量地址存取變量的值“間接訪問的方式:將變量的地址存放在另一個變量中例如“間接訪問的方式:
2、將變量的地址存放在另一個變量中。在語言中,指針是一種特殊的變量,它是存放地址的??梢酝ㄟ^語句: int i; i_pointer =;指針和指針變量的定義:一個變量的地址稱為該變量的“指針。指針變量的值(即指針變量中存放的值)是地址(即指針)。請區(qū)分“指針和“指針變量這兩個概念。10.2 變量的指針和指向變量的指針變量2000i_pointer3* i_pointer200010.2.1 定義一個指針變量指針變量的定義包括三個內容:指針類型說明,定義變量為一個指針變量;指針變量名;變量值(指針)所指向的變量的數據類型, 基類型。其一般形式為:類型說明符 *變量名;其中,*表示這是一個指針變量,
3、變量名即為定義的指針變量名,類型說明符表示本指針變量所指向的變量的數據類型。下面都是合法的定義:float *pointer_1;/ pointer_1是指向float型變量的指針變量char *pointer_2;/pointer_2是指向字符型變量的指針變量可以用賦值語句使一個指針變量得到另一個變量的地址,從而使它指向一個該變量。如:float i;char j;pointer_1=&i;pointer_2=&j;*pointer_1=i;類型說明要一致注意指針變量前面的“*,表示該變量的類型為指針型變量。例: float *pointer_1;指針變量名是pointer_1 ,而不是*
4、pointer_1 。 在定義指針變量時必須指定基類型。float a;int * pointer_1; pointer_1=&a; 10.2.2 指針變量的引用指針變量中只能存放地址(指針),不要任何其他非地址類型的數據賦給一個指針變量。例10. 通過指針變量訪問整型變量#include voidmain ( ) int a,b; int*pointer_1, *pointer_; a=100;=10; pointer_1=&a; pointer_2=&b; printf ( “%d,%dn, a,b ); printf( “%d,%dn, *pointer_,*pointer_); 100
5、10&a100ap1&b10bp2p2=p1&a100ap1&b100bp2*p2=*p1對“和“*運算符說明:a=3;&a=23f1;pointer_=;* pointer_的含義是什么?*&a含義是什么?y=(* pointer_1) +y=+* pointer_1y=* pointer_1+y=* (pointer_1+)y=* +pointer_1 * pointer_的含義是什么?“和“*兩個運算符的優(yōu)先級別相同,右結合& * pointer_= & a*的含義是什么?先進行運算,得的地址,再進行*運算。即所指向的變量,也就是變量a。*和*pointer_的作用是一樣的,它們都等價于
6、變量。即*與等價。 (*pointer_1)+和*pointer_1+的區(qū)別?(*pointer_)+相當于+。*pointer_ + ,從附錄可知:+和*為同一優(yōu)先級別,而結合方向為自右而左,因此它相當于*(pointer_ +)。由于+在pointer_1的右側,是“后加,因此先對pointer_的原值進行*運算,得到的值,然后使pointer_的值改變,這樣pointer_不再指向了。例10.2輸入和兩個整數,按降序序輸出a,b#include void main() int *p1,*p2,*p, a, b; scanf(%d,%d,&a, &b); p1=&a; p2=&b; if
7、(ab) p=p1 ; p1=p2; p2=p; printf (na=%d, b=%dn, a, b); printf (max=%d, min=%dn, *p1, *p2);交換的是變量的地址a,b的值沒有變,但p1,p2的值交換了&aap1&bbp2&aap1&bbp2運行情況如下:5,9= 5,= 9 max = 9, min = 5#include void main() int *p1,*p2, p, a, b; scanf(%d,%d,&a, &b); p1=&a; p2=&b; if (ab) p=*p1 ; *p1=*p2; *p2=p; printf (na=%d, b=%
8、dn, a, b); printf (“max=%d, min=%dn, *p1, *p2);printf (“na=%d, b=%dn, a, b); printf (max=%d, min=%dn, p1, p2);交換的是變量的值955910.2.3 指針變量作為函數參數例10.3 對輸入的兩個整數按大小順序輸出 #include swap(int *p1, int *p2 ) int temp; temp=*p1; *p1=*p2; 偶 *p2=temp; printf(n%d,%dn, *p1, *p2);void main() int a,b; int *pointer_1,*po
9、inter_2; scanf(%d,%d,&a,&b); printf(n%d,%dn,a,b); pointer_1=&a; pointer_2=&b; if (ab) swap(pointer_1, pointer_2); printf(n%d,%dn,a,b); printf(n%d,%dn, *pointer_1, *pointer_2); 交換的是地址中的值所以a,b中的值改變了指針變量按值傳遞方式,指針地址沒變955910.2.3 指針變量作為函數參數例10.3 對輸入的兩個整數按大小順序輸出 #include swap(int *p1,int *p2) int temp; tem
10、p=*p1; *p1=*p2; *p2=temp; printf(n%d,%dn, *p1, *p2);void main() int a,b; scanf(%d,%d,&a,&b); printf(n%d,%dn,a,b); if (ab) swap( &a, &b ); printf(n%d,%dn,a,b); 交換的是地址中的值所以a,b中的值改變了變量地址按值傳遞,地址沒變,但調用函數后,地址中的值變化了注意:三種錯誤表示方法void swap (int *p1, int *p2) int *temp; *temp=*p1; *p1=*p2; *p2=*temp;void swap (
11、int x, int y) int temp; temp=x; x=y; y=temp; 錯誤:原意是將temp指向的值和 p1 指向的值交換,但是, temp只是定義了,沒有地址的值,所以*temp就不知是何物。在函數內部x和y的值交換了,但是在主程序中沒交換void swap (int *p1, int *p2) int *temp,i; temp=&i; *temp=*p1; *p1=*p2; *p2=*temp;void main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointe
12、r_2=&b; if (apf2表示pf1處于高地址位置; pf1b) pmax=&a; pmin=&b; else pmax=&b; pmin=&a; if (c*pmax) pmax=&c; if (c*pmin) pmin=&c; printf(max=%dnmin=%dn,*pmax,*pmin); 10.3 數組與指針數組名是地址。一個數組包含假設干元素,每個數組元素都在內存中占用存儲單元,它們都有相應的地址。指針變量既然可以指向變量,當然也可以指向數組元素(把某一元素的地址放到一個指針變量中)。所謂數組元素的指針就是數組元素的地址。10.3.1 指向數組元素的指針定義一個指向數組元
13、素的指針變量 int a10, *p; p=&a0; 或p=a;在定義指針變量時可以賦給初值:int *p=&a0; 它等效于:int *p; p=&a0;定義時也可以寫成: int *p=a通過指針引用數組元素假設有一個a數組,整型,有10個元素引用一個數組元素,可以用:下標法,如ai形式;指針法,如*(a+i) 或 *(p+i) 。a數組名,p是指向數組元素的指針變量,其初值p=a。注意:int a12,*p; p=a; *(a+1) *(p+1) p+; a+;a=a+1, 這樣a的值就改變了,但是a是數組的首地址,是常量,所以這個表達式是錯的。例10.5 輸出數組中的全部元素下標法#i
14、nclude void main() int a10, i; for ( i=0; i10; i+)scanf (“%d,&ai); printf (“n); for ( i=0; i10; i+)printf (“%d,ai );通過數組名計算數組元素地址,找出元素的值。#include void main() int a10, i; for ( i=0; i10; i+)scanf ( “%d, &ai ); printf (“n); for ( i=0; i10; i+)printf ( “%d, *(a+i) );用指針變量指向數組元素#include void main() int
15、a10, *p, i; for ( i=0; i10; i+)scanf ( “%d, &ai ); printf (“n); for (p=a; p(a+10); p+) printf (“%d, *p);例10.6 指針變量輸出a數組的10個元素。 #include void main() int *p,i,a10; p=a; for (i=0; i10; i+) scanf (“%d,p+); printf (“n); for (i=0; i10; i+,p+) printf (“%d,*p); 運行情況:1 2 3 4 5 6 7 8 9 0 22153 234 0 0 30036 2
16、5202 11631 8259 8237 28483 顯然輸出的數值并不是數組中各元素的值解決這個問題的方法,只要在第二個for循環(huán)之前加一個賦值語句:p=a;#include void main() int *p,i,a10; p=a; for (i=0; i10; i+) scanf (“%d,p+); printf (“n); p=a; for (i=0; i10; i+, p+) printf (“%d,*p); 為什么要重新賦值10.3.3 用數組名作函數參數數組名作函數的參數如: void main() f (int arr,int n); int array10; f( arra
17、y ,10) ; void f (int arr,int n) f (int arr, int n)f (int *p, int n)以上兩種寫法是等價的。 例10.7 將數組a中n個整數按相反順序存放#include #define N 100void main() void inv ( int x,int n); int i,aN =3,7,9,11,6,7,5,4,2; printf (“The original array:n); for(i=0;i10;i+) printf (“%d, ai ); printf (“n); inv (a,10); printf (“The array
18、 has been inverted:n); for(i=0;i10;i+) printf (“%d, ai ); printf (“n);數組名實參代替形參void inv(int x, int n) int temp,i,j,m=(n-1)/2; for (i=0; i=m; i+) j=n-1-i; temp=xi; xi=xj; xi=temp; 運行情況如下:The original array:,The array has been inverted:,整個函數中數組的值被置逆,數組的值發(fā)生了改變。#include void main() void inv(int *,int n)
19、; int i, a =3,7,9,11,0,6,7,5,4,2; printf (“ The original array: n ) ; for (i=0; i10; i+)printf (“ %d ,ai ); printf (“n ) ; inv ( a, 10 ) ; printf (“The array has been in verted: n ) ; for (i=0; i10; i+) printf (“ %d , ai ); printf (“n ) ;對置逆程序作一些改動。將函數inv中的形參改成指針變量。 void inv ( int *x, int n) int p,
20、m,temp, *i,*j; m=(n-1)/2; i=x; j=x+n-1; p=x+m; for (; i=p; i+; j- - ) temp=*i; *i=*j; *j=temp; 歸納起來,如果有一個實參數組,想在函數中改變此數組中的元素的值,實參與形參的對應關系有以下種情況: void main() int a10; f(a,10);形參和實參都用數組名void f( int x, int n) void main() void f (int *,int n) int a10; f(a,10); void main() void f (int *x,int n) int a10 ,
21、*p=a; f(p,10); 實參用數組名,形參用指針變量實參形參都用指針變量void main() void f ( int x,int n) int a10, *p=a; f(p,10); 實參用指針變量,形參為數組名#include void main() void inv(int *,int n); int i, arr10, *p=arr; printf (“ The original array: n ) ; for ( i=0; i10; i+, p+) scanf (“ %d , p ); printf (“n ) ; p=arr; inv ( p, 10 ) ; printf
22、 (“The array has been in verted: n ) ; for (p=arr; parr+10; p+) printf (“ %d , *p ); printf (“n ) ;void inv (int *x, int n) int p, m,temp,*i,*j; m=(n-1)/2; i=x; j=x+n-1; p=x+m; for (; i=p; i+; j- - ) temp=*i; *i=*j; *j=temp; 幾個注意的問題:指針變量可以實現本身的值的改變。p+是合法的;a+是錯誤的。因為a是數組名,它是數組的首地址,是常量。*p+,由于+和*同優(yōu)先級,右結
23、合,等價于*(p+)。*(p+)與*(+p)作用不同。假設p的初值為a,那么*(p+)等價求得a0,p指向a1 ;*(+p)等價求得a1, p指向a1 。 (*p)+表示p所指向的元素值加1。如果p當前指向a數組中的第i個元素,那么 *(p-)相當于ai-; *(+p)相當于a+i; *(-p)相當于a-i。float aver(float *pa);void main() float sco5, av, *sp ; int i; sp=sco; printf(ninput 5 scores:n); for(i=0;i5;i+) scanf(%f,&scoi); ver(sp,&av); pr
24、intf (average score is %5.2f, av);void aver( float *pa, int *av) int i,s=0; for(i=0;i5;i+) s=s+ *pa+ ; *av=s/5;例10.9 用選擇法對10個整數按由大到小順序排序 #includevoid main() int *p,i,a100,n; printf (The original array:n); n=inputarr(a); printf(n); p=a; sort(p,10); for(p=a,i=0;i10;i+) printf(%d ,*p); p+; printf(n);vo
25、id sort(int x,int n) int i,j,k,t; for (i=0;in-1;i+) k=i; for (j=i+1;jxk) k=j; if (k!=i) t=xi; xi=xk; xk=t; 10. 字符串與指針字符串的表示形式 (1) 用字符數組存放一個字符串,然后輸出該字符串。用字符串指針指向一個字符串void main() char *string=I love China!; printf(%sn,string);輸出字符串中n個字符后的所有字符void main() char *ps=this is a book; int n=10; ps=ps+n; prin
26、tf(%sn,ps);例 將字符串復制為字符串 對字符串中字符的存取,可以用下標方法,也可以用指針方法 #include void main() char =“ am a boy,b20; int i; for ( i=0; *(a+i)!=0; i+ )*(b+i) =*(a+i); *(b+i) =0; printf(string a is :%n,a); printf( string b is:); for ( i=0; bi!=0; i+ ) printf(%c,bi ); printf(n); 也可以設指針變量,用它的值的改變來指向字符串中的不同的字符。 例用指針變量來處理將字符串復
27、制為字符串#include void main() char a =“I am a boy. ,b20,*p1,*p2; int i; p1=a;p2=b; for(;*p1!=0;p1+,p2+) * p2 =*p1;* p2 =0; printf (string a is:n, a ); printf (string b is :) ; for ( i=0; bi!=0; i+) printf (“%c,bi ); printf (“ n);程序必須保證使p1和p2同步移動。 10.4.2 字符指針作函數參數例10.19 用函數調用實現字符串的復制 #include void main()
28、 void copy_string(char from, char to); char a =“ am a teacher.; char b =“you are a student.; printf(“string a=%n string b=%sn a,b); printf(copy string a to string b:n ); copy_string (a,b); printf(“nstring a=%snstring b=%sn“, a,b); (1) 用字符數組作參數void copy_string(char from. char to)( int i=0; while (fro
29、mi!=0) toi = fromi; i+ ; toi =0;程序運行結果如下:string a = I am teacher.string b=you are a student.copy string a to string b:string a = I am teacher. string b= I am teacher. () 形參用字符指針變量 #include void main() void copy_string(char *from, char *to); char *a = “ am a teacher .; char *b = “you are a student .;
30、 printf (string a=%snsrring b=%sn, a,b); printf (copy string a to string b:n ); copy_string(a,b); printf(“nstring a=%snstring b=%sn“, a,b); void copy_string (char *from,char *to) for (;*from!= 0; from+, to+) *to=*from ;*to= 0 ; 將copy_string函數改寫為void copy_string (char * from ,char * to ) while ( * to
31、 = * from ) != 0) to +; from +; (3) 對 copy_string 函數還可作簡化 2、 copy_string函數的函數體還可改為 while (*to+ = *from+) != 0) ; 3、copy_string函數的函數體還可寫成 while ( *from ! = 0 ) *to+ = *from +; *to = 0 ;4、上面的while語句還可以進一步簡化為下面的while語句:while (*to+ = *from+) ;它與下面語句等價:while (*to+=*from+) !=0);將*from賦給*to,如果賦值后的*to值等于0,那
32、么循環(huán)終止( 0已賦給*to) 5、函數體中while語句也可以改用for語句:for (; ( *to += *from+)!=0;) 或for(;*to += *from+;);6、也可用指針變量,函數copy_string可寫為void copy_string ( char from, char to ) char *p1, p2; p1 = from ; p2 = to; while ( *p2+ = *p1+ ) != 0 );10.5 指向函數的指針10. 用函數指針變量調用函數可以用指針變量指向整型變量、字符串、數組,也可以指向一個函數。一個函數在編譯時被分配給一個入口地址。這個
33、函數的入口地址就稱為函數的指針。 例 求和中的大者。先列出按一般方法的程序。#include voidmain() int max(int,int); int a,b,c; scanf(“%d,%d,a,b); c=max(a,); printf(“a=%,=%,max=%d , a,b,c); int max(int x,int y) int ; if(xy) z=; else z=y; return(z); 例:求和中的大者。先列出按一般方法的程序。將 main 函數改寫為#include voidmain() int max(int,int); int (*p)(); int a,b,c; p=max(); scanf(%d,%d,a,b); c = (*p)(a,b); printf(“= %d,b=%d,max=%d, a,b,c); 10.7指針數組和指向指針的指針10.7
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年橋梁新技術在耐久性評估中的應用探討
- 2026年建筑中的智能化設備與自動化設計
- 2026年橋梁施工過程中如何保持材料質量
- 2026年模塊化建筑在工地的應用策略
- 2026春招:西部航空心理測試題及答案
- 貨運場站安全培訓資料課件
- 基于人工智能的醫(yī)學圖像識別
- 醫(yī)療機器人與輔助手術技術
- 心電圖室工作亮點總結
- 2026年廣東江門中醫(yī)藥職業(yè)學院單招職業(yè)技能筆試參考題庫帶答案解析
- 大型機械設備安全操作培訓教材
- 室外給排水管道施工技術交底范本
- 移動電源生產工藝流程
- 動靜脈內瘺術后護理查房規(guī)范
- 核安全事故培訓課件
- 碼頭泊位改造試運行方案
- 2025年中考英語真題分類匯編(全國)專題04 時態(tài)、語態(tài)、三大從句及常識和情景交際(原卷版)
- 【語文】北京市朝陽外語小學小學二年級上冊期末試卷(含答案)
- 追女生的聊天技巧
- 藥物配置錯誤不良事件
- DBJ50T-111-2024 保障性住房設計標準
評論
0/150
提交評論