《間接訪問指針》PPT課件.ppt_第1頁
《間接訪問指針》PPT課件.ppt_第2頁
《間接訪問指針》PPT課件.ppt_第3頁
《間接訪問指針》PPT課件.ppt_第4頁
《間接訪問指針》PPT課件.ppt_第5頁
已閱讀5頁,還剩104頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7章 間接訪問指針,指針的概念 指針運算與數(shù)組 動態(tài)內存分配 字符串再討論 指針作為函數(shù)參數(shù)和返回值 指針數(shù)組與多級指針 指向多維數(shù)組的指針 指向函數(shù)的指針,指針介紹,本章將介紹C+語言的一個重要的特性:指針,為了成為一個優(yōu)秀的C+語言程序員,你必須掌握指針并熟練地使用它們。,指針 是內存的地址并可作為數(shù)據 是一個靈活和危險的機制 允許共享處理數(shù)據 允許內存動態(tài)分配(只要需要,而非預先定義),指針的概念,指針就是把地址作為數(shù)據處理 指針變量:存儲地址的變量 變量的指針:當一個變量存儲另一個變量的地址時,那我們說它就是那個變量的指針 使用指針的目的:提供間接訪問,指針的概念 續(xù),如在某一程序中定義了 int x = 2; 如系統(tǒng)給x分配的空間是1000號單元,則指向x的指針是另一個變量p,p中存放的數(shù)據為1000 1000號單元的內容有兩種訪問方式: 訪問變量x(直接訪問) 訪問變量p指向的單元的內容(間接訪問),定義指針變量,定義指針變量要告訴編譯器該變量中存放的是一個地址。 指針變量的主要用途是提供間接訪問,因此也需要知道指針指向的單元的數(shù)據類型 指針變量的定義 類型標識符 *指針變量; 如:int *intp; double *doublep; int *p, x, *q;,指針變量的操作,如何讓指針指向某一變量?因為我們不知道系統(tǒng)分配給變量的真正地址是什么。 用地址運算符 “ & 運算符后面不能跟常量或表達式。如 &2 是沒有意義的,&(m * n + p )。也是沒有意義的 如何通過指針變量處理和改變它所指向的單元的值? 用引用運算符 “*” 解決。如 *intp 表示的是 intp 指向的這個單元的內容。如:*intp = 5 等價于 x = 5 在對 intp 使用引用運算之前,必須先對 intp 賦值,指針實例,如有: int X, *intp, Y; X=3; Y=4; intp=,如執(zhí)行: *intp=Y+4;,注意:不能用 intp=100; 因為我們永遠不知道變量存儲的 真實地址,而且程序每次運行變量地址可能都不同。,指針使用,指針變量可以指向不同的變量。如上例中intp指向x,我們可以通過對intp的重新賦值改變指針的指向。如果想讓intp指向y,只要執(zhí)行intp=&y就可以了。這時,intp與x無任何關系。 同類的指針變量之間可相互賦值,表示二個指針指向同一內存空間。 空指針 指針沒有指向任何空間 空指針用常量NULL表示,NULL的值一般賦為0 不能引用空指針指向的值,指針變量的使用,設有定義 int x, y; int *p1,*p2;,執(zhí)行語句: x=23; y=234;,執(zhí)行語句: p1=,執(zhí)行語句: *p1=34; p2=p1;,指針實例,有以下結構,比較執(zhí)行 p1=p2和 *p1= *p2后的不同結果。,指針的初始化,指針在使用前必須初始化。 和別的變量一樣,定義指針不初始化是一個比較普通的錯誤。 沒有初始化的指針可能指向任意地址,對這些指針作操作可能會導致程序錯誤。 NULL是一個特殊指針值,稱為空指針。它的值為0。它可被用來初始化一個指針,表示不指向任何地址。 思考:int *p; *p = 5; 有什么問題?,第7章 間接訪問指針,指針的概念 指針運算與數(shù)組 動態(tài)內存分配 字符串再討論 指針作為函數(shù)參數(shù)和返回值 指針數(shù)組與多級指針 指向多維數(shù)組的指針 指向函數(shù)的指針,指針運算和數(shù)組,指向數(shù)組元素的指針 數(shù)組元素是一個獨立的變量,因此可以有指針指向它。如:p = &a1, p = &ai 數(shù)組元素的地址是通過數(shù)組首地址計算的。如數(shù)組的首地址是 1000,則第i 個元素的地址是1000 + i * 每個數(shù)組元素所占的空間長度,指針與數(shù)組,在C+中,指針和數(shù)組關系密切,幾乎可以互換使用 數(shù)組名可以看成是常量指針,對一維數(shù)組來說,數(shù)組名是數(shù)組的起始地址,也就是第0個元素的地址 如執(zhí)行了p=array,則p與array是等價的,對該指針可以進行任何有關數(shù)組下標的操作,例如:有定義 int a10, *p 并且執(zhí)行了 p=a, 那么可用下列語句訪問數(shù)組a的元素 for ( i=0; i10; +i ) cout pi;,指針運算,指針+1表示數(shù)組中指針指向元素的下一元素地址; 指針-1表示數(shù)組中指針指向元素的上一元素地址; 合法的指針操作:p + k, p - k, p1 - p2,指針保存的是一個地址,地址是一個整型數(shù),因此可以進行各種算術運算,但僅有加減運算是有意義的。指針運算與數(shù)組有密切的關系,數(shù)組元素的指針表示,當把數(shù)組名,如 intarray,賦給了一個同類指針intp 后,intarray 的元素可以通過intp訪問。第i個元素的地址可表示為 intp + i,第i個元素的值可表示為 *(intp + i)。 通過指針訪問數(shù)組時,下標有效范圍由程序員自己檢查。 如輸出數(shù)組 a 的十個元素,方法3: for ( p=a; pa+10; +p ) cout *p ;,方法2: for ( i=0; i10; +i ) cout *(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; ,指針和數(shù)組的區(qū)別,雖然通過指針可以訪問數(shù)組,但兩者本質是不同的。 在定義數(shù)組時為數(shù)組的各個元素分配了全部的存儲區(qū),而在定義指針時,僅僅分配四個字節(jié)的存儲區(qū)存放指針地址。只有把一個數(shù)組名付給了對應的指針后,指針才能當作數(shù)組使用 如有:int array5, *intp;,當執(zhí)行了 intp = array 后,第7章 間接訪問指針,指針的概念 指針運算與數(shù)組 動態(tài)內存分配 字符串再討論 指針作為函數(shù)參數(shù)和返回值 指針數(shù)組與多級指針 指向多維數(shù)組的指針 指向函數(shù)的指針,動態(tài)分配,在C+語言中,每個程序需要用到幾個變量,在寫程序前就應該知道。每個數(shù)組有幾個元素也必須在寫程序時就決定。 有時我們并不知道我們需要多大的數(shù)組元素直到程序開始運行。因此希望能在程序中根據某一個當前運行值來決定數(shù)組的大小。如設計一個打印魔陣的程序,我們希望先輸入魔陣的階數(shù),然后根據階數(shù)定義一個矩陣,動態(tài)分配方法,這些問題的解決方案就是內存的動態(tài)分配。我們定義一個指針,并讓它指向一個合適的內存。如: int *scores; scores = 內存的起始地址;,動態(tài)內存分配與回收,中由new 和 delete兩個運算符替代 - 運算符new用于進行內存分配: 申請動態(tài)變量:p = new type; 申請動態(tài)數(shù)組:p = new typesize; 申請動態(tài)變量并初始化:p = new type(初值); - 運算符delete 釋放 new分配的內存: 釋放動態(tài)變量:delete p; 釋放動態(tài)數(shù)組:delete p;,動態(tài)內存分配與回收,/為簡單變量動態(tài)分配內存,并作初始化 int main() int *p; p = new int(99); /動態(tài)分配內存,并將99作為初始化值賦給它 cout *p; delete p; return 0; ,動態(tài)內存分配與回收,/動態(tài)字符串的使用 int main() int *p; char *q; p = new int(5); q = new char10; strcpy(q, “abcde“); cout *p endl; cout q endl; delete p; delete q; return 0; ,輸出結果: 5 abcde,動態(tài)分配的檢查,new操作的結果是申請到的空間的地址 當系統(tǒng)空間用完時,new操作可能失敗 new操作失敗時,返回空指針,動態(tài)內存分配與回收,/動態(tài)分配檢查 int main() int *p; p = new int; if(!p) cout “allocation failuren“; return 1; *p = 20; cout *p; delete p; return 0; ,assert宏,assert()宏在標準頭文件cassert中 assert()有一個參數(shù),表示斷言為真的表達式,預處理器產生測試該斷言的代碼。如果斷言不是真,則在發(fā)出一個錯誤消息后程序會終止。,#include #include /包含assert宏的頭文件 using namespace std; int main() int *p; p = new int; assert (p != 0); /p等于0,則退出程序 *p=20; cout *p; delete p; return 0; ,內存分配的進一步介紹,靜態(tài)分配:對全局變量和靜態(tài)變量,編譯器為它們分配空間,這些空間在整個程序運行期間都存在 自動分配:函數(shù)內的局部變量空間是分配在系統(tǒng)的棧工作區(qū)。當函數(shù)被調用時,空間被分配;當函數(shù)執(zhí)行結束后,空間被釋放 動態(tài)分配:在程序執(zhí)行過程中需要新的存儲空間時,可用動態(tài)分配的方法向系統(tǒng)申請新的空間,當不再使用時用顯式的方法還給系統(tǒng)。這部分空間是從被稱為堆的內存區(qū)域分配。,內存泄漏,動態(tài)變量是通過指針間接訪問的。如果該指針被修改,這個區(qū)域就被丟失了。堆管理器認為你在繼續(xù)使用它們,但你不知道它們在哪里,這稱為內存泄露。 為了避免出現(xiàn)孤立的區(qū)域,應該明白地告訴堆管理器這些區(qū)域不再使用??梢圆捎胐elete操作,它釋放由new申請的內存。 當釋放了內存區(qū)域,堆管理器重新收回這些區(qū)域,而指針仍然指向堆區(qū)域,但不能再使用指針指向的這些區(qū)域。 要確保在程序中同一個區(qū)域釋放一次。 釋放內存對一些程序不重要,但對有些程序很重要。如果你的程序要運行很長時間,而且存在內存泄漏,這樣程序會耗盡所有內存,直至崩潰。,動態(tài)空間分配示例,輸入一批數(shù)據,計算它們的和。數(shù)據個數(shù)在設計程序時尚無法確定。 存儲一批數(shù)據應該用數(shù)組,但C+語言的數(shù)組大小必須是固定的。該問題有兩個解決方案: 開設一個足夠大的數(shù)組,每次運行時只使用一部分。缺點:浪費空間 用動態(tài)內存分配根據輸入的數(shù)據量申請一個動態(tài)數(shù)組,#include using namespace std; int main() int *p, i, n, sum=0; cout n; if (!(p = new int n) exit(1); for (i=0; i pi; for(i=0; in; +i) sum += pi; delete p; cout “Number of elements:“ n endl; cout “Sum of the elements:“ sum endl; return 0; ,可改為: p = new int n; assert( p != NULL);,第7章 間接訪問指針,指針的概念 指針運算與數(shù)組 動態(tài)內存分配 字符串再討論 指針作為函數(shù)參數(shù)和返回值 指針數(shù)組與多級指針 指向多維數(shù)組的指針 指向函數(shù)的指針,字符串再討論,字符串的另一種表示是定義一個指向字符的指針。然后直接將一個字符串常量或字符串變量賦給它 如 char *String, ss =“abcdef”; String = “abcde”; String = ss;,String = “abcde”;的執(zhí)行結果,字符串常量存儲在一個稱為數(shù)據段的內存區(qū)域里 將存儲字符串”abcde”的內存的首地址賦給指針變量String。,String = ss的執(zhí)行過程,將字符數(shù)組ss的起始地址存入String,String = new char5; strcpy(String, “aaa”),動態(tài)變量存儲在堆工作區(qū) 將存儲字符串”aaa”的內存的首地址賦給指針變量String。,用指針表示的字符串的操作,可以直接作為字符串操作函數(shù)的參數(shù)。但必須注意,如果該指針指向的是一個字符串常量時,則使用是受限的。如不能作為strcpy的第一個參數(shù) 由于在C+中,數(shù)組名被解釋成指向數(shù)組首地址的指針。因此,字符串是用一個指針變量表示,我們可以把此指針變量解釋成數(shù)組的首地址,通過下標訪問字符串中的字符。如string3的值是d。,用指針處理串,目的:編寫一個記錄串中單詞的個數(shù)的函數(shù)。 關鍵技術:要傳遞一個字符串給函數(shù),字符串作為函數(shù)的參數(shù),字符串作為函數(shù)的參數(shù)和數(shù)組名作為參數(shù)傳遞一樣,可以有兩種方法 作為字符數(shù)組傳遞 作為指向字符的指針傳遞 兩種傳遞方式的本質是一樣的,都是傳遞了字符串的首地址 字符串作為字符數(shù)組傳遞時不需要指定長度。因為字符串操作的結束是依據0,#include Using namespace std; int word_cnt(const char *s) int cnt = 0; while (*s != 0) while (isspace(*s) +s; /跳過空白字符 if (*s != 0) +cnt; /找到一個單詞 while (!isspace(*s) ,統(tǒng)計字符串中單詞數(shù)的函數(shù),第7章 間接訪問指針,指針的概念 指針運算與數(shù)組 動態(tài)內存分配 字符串再討論 指針作為函數(shù)參數(shù)和返回值 指針數(shù)組與多級指針 指向多維數(shù)組的指針 指向函數(shù)的指針,指針作為函數(shù)參數(shù)和返回值,指針作為函數(shù)參數(shù) 數(shù)組名作為函數(shù)參數(shù) 返回指針的函數(shù) 引用和引用傳遞 返回引用的函數(shù),指針作為函數(shù)參數(shù),例:編一函數(shù),交換二個參數(shù)值。,void swap(int a, int b) int c; c=a; a=b; b=c; ,希望通過調用swap(x, y)交換變量x和y的值,新手可能會編出如下的函數(shù):,因為C+采用的是值傳遞機制,函數(shù)中a、b值的交換不會影響實際參數(shù)x和y的值,void swap(int *a, int *b) int c; c=*a; *a= *b; *b=c; ,交換x和y的值,可以調用swap(&x, &y),用指針作為參數(shù)可以在函數(shù)中修改主調程序的變量值,即實現(xiàn)變量傳遞。必須小心使用!,正確的方法,能解一元二次方程的函數(shù),目前為止我們了解到的函數(shù)只能有一個返回值,由return 語句返回。 一個一元二次方程有二個解,如何讓此函數(shù)返回二個解。答案是采用指針作為函數(shù)的參數(shù)。 由調用程序準備好存放兩個根的變量,將變量地址傳給函數(shù)。在函數(shù)中將兩個根的值分別放入這兩個地址,函數(shù)原型,函數(shù)原型可設計為: void SolveQuadratic(double a, double b, double c, double *px1, double *px2) 函數(shù)的調用 SolveQuadratic(1.3, 4.5, 2.1, &x1, &x2) SolveQuadratic(a, b, c, &x1, &x2) 函數(shù)的參數(shù)有兩類:輸入參數(shù)和輸出參數(shù)。一般,輸入參數(shù)用值傳遞,輸出參數(shù)用指針傳遞。在參數(shù)表中,輸入參數(shù)放在前面,輸出參數(shù)放在后面。,原型的改進,并不是每個一元二次方程都有兩個不同根,有的可能有兩個等根,有的可能沒有根。函數(shù)的調用者如何知道x1和x2中包含的是否是有效的解? 解決方案:讓函數(shù)返回一個整型數(shù)。該整型數(shù)表示解的情況,完整的函數(shù),int SolveQuadratic(double a,double b,double c, double *px1,double *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; ,函數(shù)的調用,int main() double a,b,c,x1,x2; int result; cout a b c; result = SolveQuadratic(a, b, c, ,指針作為函數(shù)參數(shù)和返回值,指針作為函數(shù)參數(shù) 數(shù)組名作為函數(shù)參數(shù) 返回指針的函數(shù) 引用和引用傳遞 返回引用的函數(shù),數(shù)組傳遞的進一步討論,數(shù)組傳遞的本質是地址傳遞,因此形參和實參可以使用數(shù)組名,也可以使用指針。 數(shù)組傳遞是函數(shù)原型可寫為: type fun(type a, int size); 也可寫為 type fun(type *p, int size); 但在函數(shù)內部,a和p都能當作數(shù)組使用 調用時,對這兩種形式都可用數(shù)組名或指針作為實參 建議:如果傳遞的是數(shù)組,用第一種形式;如果傳遞的是普通的指針,用第二種形式,#include using 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ù)傳遞處理成指針的傳遞,即在main中,a是數(shù)組,占用了40個字節(jié)。而在函數(shù)f中,arr是一個指針,數(shù)組傳遞的靈活性,void sort(int p , int n) . main() int a100; . sort(a, 100); /排序整個數(shù)組 sort(a, 50); /排序數(shù)組的前50個元素 sort(a+50, 50); /排序數(shù)組的后50個元素 . ,實例,設計一函數(shù)用分治法在一個整數(shù)數(shù)組中找出最大和最小值 具體方法是: 如果數(shù)組只有一個元素,則最大最小都是他。 如果數(shù)組中只有兩個元素,則大的一個就是最大數(shù),小的就是最小數(shù)。這種情況不需要遞歸。 否則,將數(shù)組分成兩半,遞歸找出前一半的最大最小值和后一半的最大最小值。取兩個最大值中的較大者作為最大值,兩個最小值中的較小值作為最小值。,設計考慮,函數(shù)的參數(shù)是要查找的數(shù)組,傳遞一個數(shù)組要兩個參數(shù):數(shù)組名和數(shù)組規(guī)模 函數(shù)返回的是數(shù)組中的最大值和最小值,將它們作為指針傳遞的參數(shù) 查找數(shù)組的前一半就是遞歸調用本函數(shù),傳給他的參數(shù)是當前的數(shù)組名,數(shù)組的規(guī)模是原來的一半 查找數(shù)組的后一半也是遞歸調用本函數(shù),傳給它的參數(shù)是數(shù)組后一半的起始地址,規(guī)模也是原來的一半,偽代碼,void minmax ( int a , int n , int *min_ptr , int *max_ptr) switch (n) case 1: 最大最小都是a0; case 2: 大的得放入*max_ptr,小的放入*min_ptr; Default: 對數(shù)組a的前一半和后一般分別調用minmax; 取兩個最大值中的較大者作為最大值; 取兩個最小值中的較小值作為最小值 ,void minmax ( int a , int n , int *min_ptr , int *max_ptr) int min1 , max1 , min2 , max2; switch(n) 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, ,指針作為函數(shù)參數(shù)和返回值,指針作為函數(shù)參數(shù) 數(shù)組名作為函數(shù)參數(shù) 返回指針的函數(shù) 引用和引用傳遞 返回引用的函數(shù),返回指針的函數(shù),函數(shù)的返回值可以是一個指針 返回指針的函數(shù)原型: 類型 *函數(shù)名(形式參數(shù)表); 當函數(shù)的返回值是指針時,返回地址對應的變量不能是局部變量。,實例,設計一個函數(shù)從一個字符串中取出一個子串。 原型設計: 從哪一個字符串中取子串、起點和終點 返回值:字符串可以用一個指向字符的指針表示,所以函數(shù)的執(zhí)行結果是一個字符串,表示一個字符串可以用一個指向字符的指針 返回值指針指向的空間必須在返回后還存在。這可以用動態(tài)字符數(shù)組,char *subString(char *s, int start, int end) int len = strlen(s); if (start = len | end = len | start end) cout “起始或終止位置錯“ endl; return NULL; char *sub = new charend - start + 2; strncpy(sub, s + start, end - start +1); subend - start +1 = 0; return sub; ,指針作為函數(shù)參數(shù)和返回值,指針作為函數(shù)參數(shù) 數(shù)組名作為函數(shù)參數(shù) 返回指針的函數(shù) 引用和引用傳遞 返回引用的函數(shù),引用傳遞,引用傳遞是地址傳遞的另一種更簡單明了的實現(xiàn)方法,引用的概念 函數(shù)中的引用,C+中的引用,引用的定義:給一個變量取一個別名,使一個內存單元可以通過不同的變量名來訪問。 例:int i; int j是i的別名,i與j是同一個內存單元。 C+引入引用的主要目的是將引用作為函數(shù)的參數(shù)。,引用傳遞,引用傳遞是地址傳遞的另一種更簡單明了的實現(xiàn)方法,引用的概念 函數(shù)中的引用,引用參數(shù),C+引入引用的主要目的是將引用作為函數(shù)的參數(shù)。,指針參數(shù) void swap(int *m, int *n) int temp; temp=*m; *m=*n; *n=temp; 調用:swap(&x, &y),引用參數(shù) void swap(int 調用:swap( x, y),注意:實參必須是變量,而不能是一個表達式,調用swap(x,y)時,相當于發(fā)生了變量定義 int &m = x int &n = y 即,形式參數(shù)m和實際參數(shù)x共享一塊空間,形式參數(shù)n和實際參數(shù)y共享一塊空間。在swap函數(shù)中交換了m和n的值,就相當于交換了x和y的值。,指針作為函數(shù)參數(shù)和返回值,指針作為函數(shù)參數(shù) 數(shù)組名作為函數(shù)參數(shù) 返回指針的函數(shù) 引用和引用傳遞 返回引用的函數(shù),返回引用的函數(shù)的主要用途,將函數(shù)用于賦值運算符的左邊,即作為左值。 int a = 1, 3, 5, 7, 9; int /函數(shù)是aj的一個引用,第7章 間接訪問指針,指針的概念 指針運算與數(shù)組 動態(tài)內存分配 字符串再討論 指針作為函數(shù)參數(shù)和返回值 指針數(shù)組與多級指針 指向多維數(shù)組的指針 指向函數(shù)的指針,指針數(shù)組與多級指針,指針數(shù)組 Main函數(shù)的參數(shù) 多級指針,指針數(shù)組,地址本身也是數(shù)據,他們也可以像其他數(shù)據一樣組織成一個數(shù)組 一個數(shù)組,如果他的元素均為指針,則稱為指針數(shù)組 一維指針數(shù)組的定義形式: 類型名 *數(shù)組名數(shù)組長度; 例如,char *String10; 定義了一個名為String的指針數(shù)組,該數(shù)組有10個元素,數(shù)組的每個成員是一個指向字符的指針,指針數(shù)組的應用,字符串可以用一個指向字符的指針表示,一組字符串可以用一個指向字符的指針數(shù)組來表示 例:寫一個函數(shù)用二分法查找某一個城市在城市表中是否出現(xiàn)。用遞歸實現(xiàn) 關鍵問題: 城市表的存儲:用指向字符的指針數(shù)組 查找時的比較:用字符串比較函數(shù),/該函數(shù)用二分查找在cityTable中查找cityName是否出現(xiàn) /lh和rh表示查找范圍,返回出現(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); return -1; /沒有找到 ,函數(shù)的應用,#include using namespace std; int binarySearch(char *cityTable, int lh, int rh, char *cityName); int main() char *string10 = “aaa“, “bbb“, “ccc“, “ddd“, “eee“, “fff“, “ggg“, “hhh“, “iii“,“jjj“; char tmp10; while (cin tmp) cout binarySearch(string, 0, 9, tmp) endl; return 0; ,指針數(shù)組與多級指針,指針數(shù)組 Main函數(shù)的參數(shù) 多級指針,main函數(shù)的形參,如需要實現(xiàn):copy a b之類的功能,可以用帶有參數(shù)的main函數(shù)來實現(xiàn) main函數(shù)有二個形式參數(shù): int argc, char *argv argc 參數(shù)的數(shù)目(包括命令名本身) argv 指向每個參數(shù)的指針,是一個指向字符串的指針數(shù)組,把參數(shù)傳遞給main(),#include int main(int argc, char *argv) int i; cout “argc=“ argc endl; for(i=0; iargc; +i) cout “argv“ i “=“ argvi endl; return 0; ,假設生成的執(zhí)行文件myprogram.exe,把參數(shù)傳遞給main() 續(xù),假設生成的執(zhí)行文件myprogram.exe 在命令行輸入:myprogram 輸出結果:argc=1 argv0=myprogram 在命令行輸入:myprogram try this 輸出結果:argc=3 argv0=myprogram argv1=try argv2=this,main函數(shù)參數(shù)實例,編寫一個求任意n個正整數(shù)的平均數(shù)的程序 如果該程序對應的可執(zhí)行文件名為aveg,則可以在命令行中輸入 aveg 10 30 50 20 40 表示求10、30、50、20和40的平均值,對應的輸出為30。,設計考慮,將這些數(shù)據作為命令行的參數(shù) 從argc得到數(shù)據的個數(shù) 從argv得到每一個數(shù)值,但注意數(shù)值是以字符串表示,要進行計算,必須把它轉換成真正的數(shù)值 由于每個數(shù)據都要轉換,而且這個工作很獨立,所以將它設計成一個函數(shù),字符串形式的數(shù)字轉換到真正的數(shù)值,int ConvertStringToInt(char *s) int num = 0; while(*s) num = num * 10 + *s - 0; +s; return num; ,計算程序,int main(int argc, char *argv) int sum = 0; for (int i = 1; i argc; +i) sum += ConvertStringToInt(argvi); cout sum / (argc - 1) endl; return 0; ,指針數(shù)組與多級指針,指針數(shù)組 Main函數(shù)的參數(shù) 多級指針,多級指針,指針指向的內容還是一個指針,稱為多級指針 如有定義:char *string10; string是一個數(shù)組,數(shù)組元素可以通過指針來訪問。如果p是指向數(shù)組string的某一個元素,那么p指向的內容是一個指向字符的指針,因此p就是一個多級指針。string也是一個多級指針,不過是一個常指針,多級指針的定義,兩級指針:類型名 *變量名; 三級指針:類型名 *變量名; 如:int *q; 表示q指向的內容是一個指向整型的指針??梢赃@樣使用:int x=15, *p= 表示s指向的內容是一個指向字符的指針,多級指針的應用,可以用指向指針的指針訪問指針數(shù)組的元素。如 #include using namespace std; int main() char *city = “aaa“, “bbb“, “ccc“, “ddd“, “eee“; char *p; for (p=city; pcity+5; +p) cout *p endl; return 0; ,輸出結果: aaa bbb ccc ddd eee,第7章 間接訪問指針,指針的概念 指針運算與數(shù)組 動態(tài)內存分配 字符串再討論 指針作為函數(shù)參數(shù)和返回值 指針數(shù)組與多級指針 指向多維數(shù)組的指針 指向函數(shù)的指針,二維數(shù)組與指針,int a34;等價于定義了3個變量,指向一維數(shù)組的指針,a 是一個指針數(shù)組,它的每個元素是一個整型指針,指向每一行的第一個元素。a是一個指向一維數(shù)組的指針,指向a 的第一個元素。對a加1,事實上是跳到下一行 指向一維數(shù)組的指針可以這樣定義: 類型名 (*指針變量名)一維數(shù)組的元素個數(shù); 注意:圓括號不能省略,如果省略了圓括號就變成了指針數(shù)組,等價于aij的表達式,int a35;,用指向數(shù)組的指針輸出二維數(shù)組a,int (*p)4, *q; for (p = a; p a + 3; +p) /每一行 for (q = *p; q *p+4; +q) /每一列 cout *q t; cout endl; ,注意:如果輸出a和a0,這兩個值是相同的。但是,這兩個值的含義是不同的,前者是第0行的首地址,它的類型是指向由四個元素組成的一位數(shù)組的首地址,后者是第0行第一個元素的地址,它的類型是整型指針,動態(tài)的二維數(shù)組,方法一:用一維動態(tài)數(shù)組 將它按行序轉換成一維數(shù)組,用動態(tài)的一維數(shù)組存儲。如一個3行4列的矩陣a可以存儲為12個元素的一維數(shù)組 訪問i行j列的元素轉換成訪問一維數(shù)組的第4*i+j個元素 方法二:用指向指針的指針,可以用aij訪問 用指向指針的指針指向一個一維的指針數(shù)組 指針數(shù)組中的每個元素指向矩陣的每一行的第一個元素,int main() int *a, i, j, k = 0; a = new int *3; for (i = 0; i 3; +i) ai = new int4; for (i = 0; i 3; +i) for (j = 0; j 4; +j) aij = k+; for (i = 0; i 3; +i) cout endl; for (j = 0; j 4; +j) cout aij t; for (i = 0; i 3; +i) delete ai; delete a; return 0; ,第7章 間接訪問指針,指針的概念 指針運算與數(shù)組 動態(tài)內存分配 字符串再討論 指針作為函數(shù)參數(shù)和返回值 指針數(shù)組與多級指針 指向多維數(shù)組的指針 指向函數(shù)的指針,函數(shù)的指針和指向函數(shù)的指針變量,定義:返回類型 (*指針變量名)( ) ; 使用 : 賦值 eg. int isdigit(int n, int k); . int (*p)(int, int ); p=isdigit; 引用:a=isdigit(n,k); a=(*p)(n,k); 或 a=p(n,k),函數(shù)的指針:指向函數(shù)代碼的起始地址,函數(shù)的指針的用途,菜單選擇的實現(xiàn) 作為函數(shù)的參數(shù),函數(shù)指針的應用,用函數(shù)指針的數(shù)組實現(xiàn)菜單選擇 例如,在一個工資管理系統(tǒng)中有如下功能: 1。添加員工; 2。刪除員工; 3。修改員工信息; 4。打印工資單; 5。打印匯總表; 6。退出。 在設計中,一般把每個功能設計成一個函數(shù)。如添加員工的函數(shù)為add,刪除員工的函數(shù)為delete,

溫馨提示

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

評論

0/150

提交評論