版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、會計學(xué)1 語言講義語言講義 n如何利用指針實現(xiàn)內(nèi)存的動態(tài)分 配? 第1頁/共76頁 第2頁/共76頁 n密碼密碼911911存放在某個寄存箱內(nèi),如果我們存放在某個寄存箱內(nèi),如果我們 知道這個寄存箱的名字,就能夠找到密知道這個寄存箱的名字,就能夠找到密 碼碼 n如果不知道密碼所在的寄存箱名字,知如果不知道密碼所在的寄存箱名字,知 道該寄存箱的地址也照樣能夠取出密碼道該寄存箱的地址也照樣能夠取出密碼 n如果寄存箱的地址也不知道,但是有另如果寄存箱的地址也不知道,但是有另 外一個地方存放這個寄存箱的地址,就外一個地方存放這個寄存箱的地址,就 能順藤摸瓜,間接找到密碼能順藤摸瓜,間接找到密碼 第3頁/
2、共76頁 龍井號龍井號 9111976 虎跑號虎跑號 19760217 名字名字虎跑號虎跑號龍井號龍井號 地址地址02171976 內(nèi)容內(nèi)容1976911 第4頁/共76頁 The key is: 911 If I know the address of the key, I also can get it: 911 第5頁/共76頁 內(nèi)存單元內(nèi)存單元 地址地址 內(nèi)容內(nèi)容 變量變量 int x = 20, y = 1, z = 155; printf(%d, x;) 直接訪問直接訪問:通過變量名訪問:通過變量名訪問 間接訪問間接訪問:通過通過另一個變量訪問另一個變量訪問 把變量的地址放到另一變
3、量中把變量的地址放到另一變量中 使用時先找到后者使用時先找到后者 再再從中取出前者的地址從中取出前者的地址 1000 20 x 1002 1 y 1004 155 z 2000 1000 p 2002 地址地址 指針變量指針變量 第6頁/共76頁 內(nèi)存單元內(nèi)存單元 地址地址 內(nèi)容內(nèi)容 變量變量 int x = 20, y = 1, z = 155; printf(%d, x;) 1000 20 x 1002 1 y 1004 155 z 2000 1000 p 2002 地址地址 指針變量指針變量 指針變量指針變量:存放地址的變量:存放地址的變量 某個某個變量變量的地址的地址 指向指向 第7頁
4、/共76頁 指針變量所指向的變量的類型指針變量所指向的變量的類型 int *p; p 是整型指針,指向整型變量是整型指針,指向整型變量 float *fp; fp 是浮點型指針,指向浮點型變量是浮點型指針,指向浮點型變量 char *cp; cp 是字符型指針,指向字符型變量是字符型指針,指向字符型變量 指針聲明符指針聲明符 第8頁/共76頁 類型名類型名 * 指針變量名指針變量名 int * p; 指針變量名是指針變量名是 p,不是不是*p * 是指針聲明符是指針聲明符 int k, *p1, *p2; 等價于:等價于: int k; int *p1; int *p2; 第9頁/共76頁 *
5、 間接訪問運算符間接訪問運算符,訪問指針?biāo)赶虻淖兞吭L問指針?biāo)赶虻淖兞?*p:指針變量指針變量 p 所所指向的指向的變量變量 a 3 p = printf (“a=%d, *p=%dn”, a, *p); *p = 10; printf(a=%d, *p=%dn, a, *p); printf(Enter a: ); scanf(%d, printf(a=%d, *p=%dn, a, *p); (*p)+; printf(a=%d, *p=%dn, a, *p); return 0; a 3 定義定義指針指針變量變量 p *p =10; 指針指針p所指所指向向的變量的變量,即即a (3) p
6、 = x = *p+; 第12頁/共76頁 b 2 int *p1, *p2; p1 = p2 = printf (a=%d, b=%d, *p1=%d, *p2=%dn, a, b, *p1, *p2); t = *p1; *p1 = *p2; * p2 = t; printf (a=%d, b=%d, *p1=%d, *p2=%dn, a, b, *p1, *p2); return 0; 例例8-3 通過通過指針指針改變改變變量的值變量的值 a = 1, b = 2, *p1 = 1, *p2 = 2 a = 2, b = 1, *p1 = 2, *p2 = 1 第13頁/共76頁 a 3
7、 a = 2; b = 4; c = 6; p1 = p2 = printf (a=%d, b=%d, c=%d, *p1=%d, *p2=%dn, a, b, c, *p1, *p2); p2 = p1; p1 = printf (a=%d, b=%d, c=%d, *p1=%d, *p2=%dn, a, b, c, *p1, *p2); return 0; *p2 *p1 a = 2; b = 4; c = 6; *p1 = 2, *p2 = 4 a = 2; b = 4; c = 6; *p1 = 6, *p2 = 2 第15頁/共76頁 例例8-5 int main (void ) i
8、nt a=1, b=2; int *p1 = printf (a=%d, b=%d, *p1=%d, *p2=%dn, a, b, *p1, *p2); pt = p1; p1 = p2; p2 = pt; printf (“a=%d, b=%d, *p1=%d, *p2=%dn”, a, b, *p1, *p2); return 0; p1 b 2 b = 2; *p1 = 1, *p2 = 2 a = 1; b = 2; *p1 = 2, *p2 = 1 第16頁/共76頁 *p1 和和 *p2 的值都由的值都由 1 和和 2 變成了變成了 2 和和 1 (1) 直接改變指針的值直接改變指
9、針的值 (2) 改變指針?biāo)缸兞康闹蹈淖冎羔標(biāo)缸兞康闹?p1 b 2 void replace2(int *baby) *baby = CIVET; void display(int who) if (who = CIVET) printf(貍貓貍貓); else if (who = PRINCE) printf(王子王子); before change, baby is 王子王子 after first action, baby is王子王子 after second action, baby is貍貓貍貓 第19頁/共76頁 int main (void) int a = 1, b =
10、2; int *pa = void swap1(int x, int y), swap2( int *px, int *py ), swap3 (int *px, int *py); swap1 (a, b); printf (“After calling swap1: a=%d b=%dn”, a, b); a = 1; b = 2; swap2(pa, pb); printf (“After calling swap2: a=%d b=%dn”, a, b); a = 1; b = 2; swap3(pa, pb); printf (“After calling swap3: a=%d b
11、=%dn”, a, b); return 0; 調(diào)用哪個函數(shù),可以交換調(diào)用哪個函數(shù),可以交換main ()中變量中變量a和和b的值的值? 第20頁/共76頁 a 12 b x 12 y 21 第21頁/共76頁 a b pxpy 12 值傳遞,地值傳遞,地址未變,址未變, 但存放的變量的值改變了但存放的變量的值改變了 21 第22頁/共76頁 a b pxpy 12 值傳遞,形參指針的改變值傳遞,形參指針的改變 不會影響實參不會影響實參 第23頁/共76頁 要通過函數(shù)調(diào)用來改變主調(diào)函數(shù)中某個變量的值:要通過函數(shù)調(diào)用來改變主調(diào)函數(shù)中某個變量的值: (1) 在主調(diào)函數(shù)中,在主調(diào)函數(shù)中,將該變量的地
12、址或者指向該變量的將該變量的地址或者指向該變量的 指針作為實參指針作為實參 (2) 在被調(diào)函數(shù)中,在被調(diào)函數(shù)中,用指針類型形參接受該變量的地址用指針類型形參接受該變量的地址 (3) 在被調(diào)函數(shù)中,改變形參所指向變量的值在被調(diào)函數(shù)中,改變形參所指向變量的值 a b pxpy 1221 After calling swap1: a=1, b=2 After calling swap2: a=2, b=1 After calling swap3: a=1, b=2 第24頁/共76頁 第25頁/共76頁 input year and yearday: 2000 61 2000-3-1 month d
13、ay pmonthpday 31 第26頁/共76頁 void swap2 (int *, int *); void bubble (int a , int n); int main(void) int n, a8; int i; printf(Enter n (n=8): ); scanf(%d, printf(Enter a%d : ,n); for (i=0; in;i+) scanf(%d, bubble(a, n); printf(After sorted, a%d = , n); for (i=0; in; i+) printf(%3d,ai); return 0; void bu
14、bble (int a , int n) int i, j; for( i = 1; i n; i+ ) for (j = 0; j aj+1) swap2 ( void swap2 (int *px, int *py) int t; t = *px; *px = *py; *py = t; Enter n (n=8): 8 Enter a8 : 7 3 66 3 -5 22 -77 2 After sorted, a8 = -77 -5 2 3 3 7 22 66 第27頁/共76頁 3000 a0 地址地址 內(nèi)容內(nèi)容 數(shù)組元素數(shù)組元素 3002 a1 3198 a99 ai a a+1 a
15、+99 a+i for(i = 0; i 100; i+) sum = sum + ai ; *(a+i) 下標(biāo)運算符下標(biāo)運算符 的含義的含義 第28頁/共76頁 p p+1 p+99 p+i 3000 a0 地址地址 內(nèi)容內(nèi)容 數(shù)組元素數(shù)組元素 3002 a1 3198 a99 ai a a+1 a+99 a+i sum = 0; for(i = 0; i 100; i+) sum = sum + pi; 等價等價 等價等價 第29頁/共76頁 p3000 a0 地址地址 內(nèi)容內(nèi)容 數(shù)組元素數(shù)組元素 3002 a1 3198 a99 ai a a+1 a+99 a+i sum = 0; fo
16、r(p = a; p = p+) sum = sum + *p; p p p 第30頁/共76頁 # include int main (void) double a2, *p, *q; p = q = p + 1; printf (%dn, q - p); printf (%dn, (int) q - (int) p); return 0; 例例8-10 使用指針計算數(shù)組元素個數(shù)和使用指針計算數(shù)組元素個數(shù)和 數(shù)組元素的存儲單元數(shù)數(shù)組元素的存儲單元數(shù) 1 8 指針指針p p和和q q之間元素的個數(shù)之間元素的個數(shù) 指針指針p p和和q q之間的字節(jié)數(shù)之間的字節(jié)數(shù) 地址值地址值 p q 3000
17、a0 地址地址 內(nèi)容內(nèi)容 數(shù)組元素數(shù)組元素 3008 a1 a a+1 第31頁/共76頁 double *p, *q; nq - p 兩個相同類型的指針相減,表示它們之間相隔的存儲單元兩個相同類型的指針相減,表示它們之間相隔的存儲單元 的數(shù)目的數(shù)目 np + 1 / p-1 指向下一個存儲單元指向下一個存儲單元 / 指向上一個存儲單元指向上一個存儲單元 n其他操作都是非法的其他操作都是非法的 指針相加、相乘和相除,或指針加上和減去一個浮點數(shù)指針相加、相乘和相除,或指針加上和減去一個浮點數(shù) np q 兩個相同類型指針可以用關(guān)系運算符比較大小兩個相同類型指針可以用關(guān)系運算符比較大小 指針的算術(shù)運
18、算和比較運算指針的算術(shù)運算和比較運算 p q 3000 a0 地址地址 內(nèi)容內(nèi)容 數(shù)組元素數(shù)組元素 3008 a1 a a+1 第32頁/共76頁 # include int main(void) int i, a10, *p; long sum = 0; printf(Enter 10 integers: ); for(i = 0; i 10; i+) scanf(%d, for(p = a; p = a+9; p+) sum = sum + *p; printf(sum=%ld n, sum); return 0; 例例8-11 使用指針計算數(shù)組元素之和使用指針計算數(shù)組元素之和 Enter
19、 10 integers: 10 9 8 7 6 5 4 3 2 1 sum=55 p3000 a0 地址地址 內(nèi)容內(nèi)容 數(shù)組元素數(shù)組元素 3002 a1 3018 a9 ai a a+1 a+9 a+i p p p 第33頁/共76頁 double fact (int n); int main(void ) int i, n = 5; double sum; sum = 0; for(i = 1; i = n; i+ ) sum = sum + fact (i); printf(sum = %en, sum); return 0; double fact (int n) i n t i ;
20、double result = 1; for (i = 1; i = n; i+) result = result * i ; return result ; int a5=1, 4, 5, 7, 9; fact(ai- 1); 1!+4!+5!+7!+9! 第34頁/共76頁 int sum (int *array, int n) int i, s = 0; for(i=0; in; i+) s += arrayi; return(s); 例例8-12 int main(void ) int i; int b5 = 1, 4, 5, 7, 9; printf(%dn, sum(b, 5);
21、return 0; (1) (1) 實參是數(shù)組名實參是數(shù)組名 (2) (2) 形參是指針變量形參是指針變量 可以寫成數(shù)組形式可以寫成數(shù)組形式 int array *(array+i) 第35頁/共76頁 int main(void ) int i; int b5 = 1, 4, 5, 7, 9; printf(%dn, sum(b, 5); return 0; b b0 b5 array sum(b, 5)b0+b1+.+b4 sum(b, 3)b0+b1+b2 sum(b+1, 3)b1+b2+b3 sum( for(i=0, j=n-1; ij; i+, j-) t = pi; pi =
22、pj; pj = t; Enter n:10 Enter 10 integers: 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 第37頁/共76頁 a a0 a5 p 第38頁/共76頁 void reverse(int *p, int n) int *pj, t; for(pj=p+n-1; paj+1 j=0 to 4 j=0 to 3 j=0 to 2 j=0 to 6-1-i 第41頁/共76頁 9 8 5 4 6 0 i=1 j=0: 8 9 5 4 6 0 j=1: 8 5 9 4 6 0 j=2: 8 5 4 9 6 0 j=3: 8 5
23、4 6 9 0 j=4: 8 5 4 6 0 9 int main(void ) int i, j, n, t, a10; n = 6; for(i = 0; i n; i+) scanf(%d, for(i = 1; i n; i+) for(j = 0; j aj+1) t = aj; aj = aj+1; aj+1 = t; return 0; 第42頁/共76頁 int main(void ) int i, a10; for(i=0; i10; i+) scanf(%d, sort(a, 10); for(i=0; i10; i+) printf(%d , ai); printf(n)
24、; return 0; void sort(int array, int n) int i, j, t; for(i=1; in; i+) for(j=0; jarrayj+1) t = arrayj; arrayj = arrayj+1; arrayj+1 = t; 第43頁/共76頁 第44頁/共76頁 # define MAXLINE 100 void encrypt(char *s); int main (void) char line MAXLINE; printf (Input the string: ); gets(line); encrypt (line); printf (“
25、After being encrypted: %sn, line); return 0; void encrypt ( char *s) for ( ; *s != 0; s+) if (*s = z) *s = a; else *s = *s+1; Input the string:hello hangzhou After being encrypted: ifmmp!ibohaipv 第45頁/共76頁 第46頁/共76頁 a r r a y p o i n t string printf(%s , sa+2); printf(%s , sp+3); printf(%sn, string+
26、1); ray nt tring 數(shù)組名數(shù)組名sa、指針、指針sp和字符串和字符串 string 的值都是的值都是 地址地址 第47頁/共76頁 char sa = This is a string; char *sp = This is a string; sa T h i si sas t r i n g 0 sp T h i si sas t r i n g 0 如果要改變數(shù)組如果要改變數(shù)組sa所代表的字符串,只能改變所代表的字符串,只能改變 數(shù)組元素的內(nèi)容數(shù)組元素的內(nèi)容 如果要改變指針如果要改變指針sp所代表的字符串,通常直所代表的字符串,通常直 接改變指針的值,讓它指向新的字符串接改
27、變指針的值,讓它指向新的字符串 第48頁/共76頁 第49頁/共76頁 不要引用未賦值的指針不要引用未賦值的指針 第50頁/共76頁 void encrypt ( char *s) for ( ; *s != 0; s+) if (*s = z) *s = a; else *s = *s+1; 第51頁/共76頁 第52頁/共76頁 n t 第53頁/共76頁 第54頁/共76頁 #include int main( ) char str80; gets(str); puts(str); puts(Hello); return 0; Programming ProgrammingHello P
28、rogramming is fun! ProgrammingHello Programmin g Programmin g Hello Programming is fun! Programming is fun! Hello 第55頁/共76頁 第56頁/共76頁 h a p p y 0 0 strcpy(str1, str2); h a p p y 0 str1 中中 strcpy(str1, “world”); str1 中中: w o r l d 0 第57頁/共76頁 1234 1234 第58頁/共76頁 # include stdio.h # include string.h int main(void) char str180, str220; gets(str1); gets(str2); strcat(str1, str2); puts(str1); return 0; str1中:中: Let us 0 str2中:中:go.0 str1中:中: Let us go.0 str2中:中:go.0 Let us go. Let us go. 第59頁/共76頁 strcmp(s1, Sea); strcmp(Sea, Sea );
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024水電工程安裝承包合同
- 二零二五年度汽車貸款抵押物保管合同樣本2篇
- 二零二五年度文化產(chǎn)業(yè)園開發(fā)建設(shè)合同3篇
- 2025年度食品企業(yè)HACCP體系認(rèn)證與改進(jìn)服務(wù)合同3篇
- 二零二五年特色餐廳食材供應(yīng)鏈管理服務(wù)合同3篇
- 2024版版權(quán)質(zhì)押貸款合同3篇
- 二零二五年度附帶提前還款罰金的合法借款合同3篇
- 2024版影視經(jīng)紀(jì)中介協(xié)議樣本版B版
- 2024版外貿(mào)儀器合同范本
- 個人勞務(wù)合同簡單范本
- 綿陽市高中2022級(2025屆)高三第二次診斷性考試(二診)歷史試卷(含答案)
- 《視頻壓縮基礎(chǔ)》課件
- 2025南方財經(jīng)全媒體集團(tuán)校園招聘63人高頻重點提升(共500題)附帶答案詳解
- 《A機(jī)場公司人力資源管理工作實踐調(diào)研報告》2600字(論文)
- 社工人才培訓(xùn)計劃實施方案
- 四年級數(shù)學(xué)(上)計算題專項練習(xí)及答案
- 6、水平四+田徑18課時大單元計劃-《雙手頭上前擲實心球》
- 軍事理論(2024年版)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 青島版科學(xué)四年級下冊課程綱要
- GB/T 6672-2001塑料薄膜和薄片厚度測定機(jī)械測量法
- 果樹蔬菜病害:第一章 蔬菜害蟲
評論
0/150
提交評論