第7章109間接訪問-指針_第1頁
第7章109間接訪問-指針_第2頁
第7章109間接訪問-指針_第3頁
第7章109間接訪問-指針_第4頁
第7章109間接訪問-指針_第5頁
已閱讀5頁,還剩104頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、指針指針是內(nèi)存的是內(nèi)存的地址地址并可作為數(shù)據(jù)并可作為數(shù)據(jù)是一個靈活和危險的機制是一個靈活和危險的機制允許允許共享共享處理數(shù)據(jù)處理數(shù)據(jù)允許內(nèi)存允許內(nèi)存動態(tài)動態(tài)分配(只要需要,而非預先定義)分配(只要需要,而非預先定義)1000 21000 xp如有:如有:int X, *intp, Y;X=3;Y=4;intp=&X;如執(zhí)行:如執(zhí)行:*intp=Y+4;注意:不能用注意:不能用 intp=100;intp=100;因為我們永遠不知道變量存儲的因為我們永遠不知道變量存儲的 真實地址,而且真實地址,而且程序每次運行變量地址可能都不同。程序每次運行變量地址可能都不同。1000 x1004y10

2、08p11012p2執(zhí)行語句:執(zhí)行語句:x=23;y=234;100023x1004234y1008p11012p2執(zhí)行語句:執(zhí)行語句:p1=&x;p2=&y;100023x1004234y10081000p110121004p2執(zhí)行語句:執(zhí)行語句:*p1=34;p2=p1;100034x1004234y10081000p110121000p2有以下結(jié)構(gòu)有以下結(jié)構(gòu) Ap1aBp2b比較執(zhí)行比較執(zhí)行 p1=p2和和 *p1= *p2后的不同結(jié)果。后的不同結(jié)果。 解:解: Ap1aBp2bBp1aBp2b例如:有定義例如:有定義 int a10, int a10, * *p p 并

3、且執(zhí)行了并且執(zhí)行了 p=ap=a, 那么可用下列語句訪問數(shù)組那么可用下列語句訪問數(shù)組a a的元素的元素for ( i=0; i10; +i )for ( i=0; i10; +i ) cout pi; cout pi; 指針保存的是一個地址,地址是一個整型數(shù),因此指針保存的是一個地址,地址是一個整型數(shù),因此可以進行各種算術(shù)運算,但僅有加減運算是有意義可以進行各種算術(shù)運算,但僅有加減運算是有意義的。指針運算與數(shù)組有密切的關(guān)系的。指針運算與數(shù)組有密切的關(guān)系方法方法3: for ( p=a; pa+10; +p ) cout *p ; 方法方法2: for ( i=0; i10; +i ) cout

4、 *(a+i); 方法方法1: for ( i=0; i10; +i ) cout ai; 方法方法4: for ( p=a, i=0; i10; +i ) cout *(p+i); 方法方法5: for ( p=a, i=0; i10; +i ) cout pi ; 下列程序段下列程序段 有無問題?有無問題? for ( i=0; i10; +i ) cout *a ; +a; arrayintp當執(zhí)行了當執(zhí)行了 intp = arrayintp = array后后輸出結(jié)果:輸出結(jié)果:5abcde#include #include /包含包含assert宏的頭文件宏的頭文件using nam

5、espace std;int main() int *p; p = new int; assert (p != 0); /p等于等于0,則退出程序,則退出程序 *p=20; cout *p; delete p; return 0;OSProgramHeap動態(tài)分配Stack自動分配Globe variables靜態(tài)分配可改為:可改為:p = new int n;assert( p != NULL);數(shù)據(jù)段數(shù)據(jù)段或代碼區(qū)或代碼區(qū)棧棧堆堆字符串常量存儲在一字符串常量存儲在一個稱為數(shù)據(jù)段的內(nèi)存?zhèn)€稱為數(shù)據(jù)段的內(nèi)存區(qū)域里區(qū)域里 將存儲字符將存儲字符串串”abcde”abcde”的內(nèi)存的的內(nèi)存的首地址賦給

6、指針變量首地址賦給指針變量StringString。 數(shù)據(jù)段數(shù)據(jù)段棧棧堆堆將字符數(shù)組將字符數(shù)組ss的起的起始地址存入始地址存入String數(shù)據(jù)段數(shù)據(jù)段棧棧堆堆“aaa0”動態(tài)變量存儲在堆工動態(tài)變量存儲在堆工作區(qū)作區(qū) 將存儲字符串將存儲字符串”aaa”aaa”的內(nèi)存的首地址賦給的內(nèi)存的首地址賦給指針變量指針變量StringString。 #include Using namespace std;int word_cnt(const char *s) int cnt = 0; while (*s != 0) while (isspace(*s) +s; /跳過空白字符跳過空白字符if (*s !=

7、 0) +cnt;/找到一個單詞找到一個單詞 while (!isspace(*s) & *s != 0) +s; /跳過單詞跳過單詞 return cnt;統(tǒng)計字符串中單詞數(shù)的函數(shù)例:編一函數(shù),交換二個參數(shù)值。例:編一函數(shù),交換二個參數(shù)值。 void swap(int a, int b) int c; c=a; a=b; b=c; 希望通過調(diào)用希望通過調(diào)用swap(x, y)swap(x, y)交換變量交換變量x x和和y y的值的值新手可能會編出如下的函數(shù):新手可能會編出如下的函數(shù):因為因為C+C+采用的是值傳遞機制,函數(shù)中采用的是值傳遞機制,函數(shù)中a a、b b值的值的交換不會影

8、響實際參數(shù)交換不會影響實際參數(shù)x x和和y y的值的值void swap(int *a, int *b) int c; c=*a; *a= *b; *b=c; 3 4xyab交換交換x x和和y y的值,可以調(diào)用的值,可以調(diào)用swap(&x, &y)swap(&x, &y)用指針作為參數(shù)可以在函數(shù)中修改主調(diào)程序用指針作為參數(shù)可以在函數(shù)中修改主調(diào)程序的變量值,即實現(xiàn)變量傳遞。必須小心使的變量值,即實現(xiàn)變量傳遞。必須小心使用!用!正確的方法int SolveQuadratic(double a,double b,double c, double *px1,doubl

9、e *px2) double disc, sqrtDisc; if(a = 0) return 3; /不是一元二次方程不是一元二次方程 disc = b * b - 4 * a * c; if( disc 0 ) return 2; /無根無根 if ( disc = 0 ) *px1 = -b /(2 * a); return 1; /等根等根 /兩個不等根兩個不等根 sqrtDisc = sqrt(disc); *px1 = (-b + sqrtDisc) / (2 * a); *px2 = (-b - sqrtDisc) / (2 * a); return 0;#include usi

10、ng namespace std;void f(int arr, int k)cout sizeof(arr) sizeof(k) endl;void main() int a10=1,2,3,4,5,6,7,8,9,0; cout sizeof(a) endl; f(a,10); 輸出:輸出:C+將數(shù)組名作為參數(shù)傳遞處理成指針的傳遞將數(shù)組名作為參數(shù)傳遞處理成指針的傳遞即在即在mainmain中,中,a a是數(shù)是數(shù)組,占用了組,占用了4040個字個字節(jié)。而在函數(shù)節(jié)。而在函數(shù)f f中,中,arrarr是一個指針是一個指針void sort(int p , int n)void sort(int

11、p , int n).main()main()int a100;int a100; . . sort(a, 100); / sort(a, 100); /排序整個數(shù)組排序整個數(shù)組 sort(a, 50); /sort(a, 50); /排序數(shù)組的前排序數(shù)組的前5050個元素個元素 sort(a+50, 50); /sort(a+50, 50); /排序數(shù)組的后排序數(shù)組的后5050個元素個元素 . void minmax ( int a , int n , int *min_ptr , int *max_ptr) int min1 , max1 , min2 , max2; switch(n)

12、case 1: *min_ptr = *max_ptr = a0; return; case 2: if (a0 a1 ) *min_ptr = a0; *max_ptr= a1; else *min_ptr = a1; *max_ptr= a0; return; default: minmax( a, n/2, &min1, &max1 ); minmax( a + n/2, n - n / 2, &min2, &max2 ); if (min1 min2) *min_ptr = min1; else *min_ptr = min2; if (max1 max

13、2) *max_ptr = max2; else *max_ptr = max1; return; 引用的概念引用的概念函數(shù)中的引用函數(shù)中的引用引用的概念引用的概念函數(shù)中的引用函數(shù)中的引用指針參數(shù)指針參數(shù)void swap(int *m, int *n) int temp; temp=*m; *m=*n; *n=temp;調(diào)用:調(diào)用:swap(&x, &y)引用參數(shù)引用參數(shù)void swap(int &m, int &n)int temp; temp=m; m=n; n=temp;調(diào)用:調(diào)用:swap( x, y)注意:實參必須是變量,而不能是一個表達式注意:實

14、參必須是變量,而不能是一個表達式/該函數(shù)用二分查找在該函數(shù)用二分查找在cityTable中查找中查找cityName是否出現(xiàn)是否出現(xiàn)/lh和和rh表示查找范圍,返回出現(xiàn)的位置表示查找范圍,返回出現(xiàn)的位置Int binarySearch(char *cityTable, int lh, int rh, char *cityName)int mid, result; if (lh 0) return binarySearch(cityTable, lh, mid-1, cityName); else return binarySearch(cityTable, mid+1, rh,cityName

15、); return -1; /沒有找到?jīng)]有找到“aaa”“bbb”“ccc”“ddd”“eee”“fff”“ggg”“hhh”“iii”“jjj”假設(shè)生成的執(zhí)行文件myprogram.exeqp15s“abcde”輸出結(jié)果:輸出結(jié)果:aaabbbcccdddeeeaa1a2a0123456789101112aij*(ai + j)(*(a + i)j*(*(a + i) + j)*(&a00 + 5 * i + j)int a35;注意:如果輸出a和a0,這兩個值是相同的。但是,這兩個值的含義是不同的,前者是第0行的首地址,它的類型是指向由四個元素組成的一位數(shù)組的首地址,后者是第0行第

16、一個元素的地址,它的類型是整型指針 函數(shù)的指針:指向函數(shù)代碼的起始地址函數(shù)的指針:指向函數(shù)代碼的起始地址int main() int select; while(1) cout 1-add n; cout 2-deleten; cout 3-modifyn; cout 4-print salaryn; cout 5-print reportn; cout select; switch(select) case 0: return 0; case 1: add(); break; case 2: erase(); break; case 3: modify(); break; case 4: p

17、rintSalary(); break; case 5: printReport(); break; default: cout input errorn; template void quicksort(T data, int low, int high, int (*comp)(T, T) int mid; if (low = high) return; mid = divide(data, low, high, comp); quicksort( data, low, mid-1, comp); quicksort( data, mid+1, high, comp);template i

溫馨提示

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

評論

0/150

提交評論