版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第五章指針的應(yīng)用C++編程導(dǎo)論1第五章指針的應(yīng)用教學(xué)目標(biāo): 1.著重介紹指針與指針變量的概念; 2.指針類型變量的定義、賦值以及引用的方法; 3.指針與地址運(yùn)算符; 4.通過指針類型的變量去訪問單一變量; 5.通過指針類型的變量去操作一維數(shù)組; 6.通過指針類型的變量去操作二維數(shù)組; 7.動態(tài)存儲分配的概念及應(yīng)用。2西南交通大學(xué)戴克儉c++第五章第五章指針的應(yīng)用教學(xué)內(nèi)容: 1.掌握地址和指針的概念 2.掌握指針類型變量的定義、賦值以及引用的方法 3.掌握將一個變量或數(shù)組的地址賦給指針類型的變量 4.掌握指針操作相關(guān)的運(yùn)算符; 5.掌握通過指針類型的變量去訪問單一變量; 6.掌握通過指針類型的變量去操作一維數(shù)組; 7.理解通過指針類型的變量去操作二維數(shù)組; 8.理解動態(tài)存儲分配的概念及應(yīng)用。3西南交通大學(xué)戴克儉c++第五章§5.1指針的概述 [例5.1.1]閱讀如下程序: 源程序清單: #include<iostream> usingnamespacestd; voidmain() { inta; int*p; a=10; p=&a;4西南交通大學(xué)戴克儉c++第五章§5.1指針的概述 cout<<"a的值表示方法1:"<<a<<endl; cout<<"a的值表示方法2:"<<*p<<endl; cout<<"a的地址表示方法1:"<<&a<<endl; cout<<"a的地址表示方法2:"<<p<<endl; } 編程技巧: 在源程序清單中,我們可以看到在操作變量a時,用了不同的兩種方法,一種就是用我們很習(xí)慣的變量名的方式操作,另一種就是本章要學(xué)習(xí)的新概念指針的方式操作。5西南交通大學(xué)戴克儉c++第五章§5.1指針的概述 1.指針是C++從C中繼承過來的重要的概念,它提供了一種較為直觀的地址操作的手段。正確地使用指針,可以方便、靈活而有效地組織和表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。 2.利用指針可以進(jìn)行動態(tài)內(nèi)存分配和管理,可以更靈活地使用內(nèi)存空間。 3.為了理解指針,要先理解關(guān)于內(nèi)存地址的概念。計(jì)算機(jī)的內(nèi)存儲器就像一個巨大的一維數(shù)組,每個數(shù)組元素就是一個存儲單元。就像數(shù)組中的每個元素都有一個下標(biāo)一樣,每個內(nèi)存單元都有一個編號,這個編號就稱為內(nèi)存單元的地址。在微型計(jì)算機(jī),地址編碼的基本單位是字節(jié),每個字節(jié)是一個基本內(nèi)存單元。6西南交通大學(xué)戴克儉c++第五章§5.1指針的概述 4.在運(yùn)行一個程序時,程序本身及其所用到的數(shù)據(jù)都要放在內(nèi)存儲器中。程序、函數(shù)、變量、常數(shù)、數(shù)組和對象等,在內(nèi)存儲器中都要占有一席之地。存放在內(nèi)存儲器中的程序和數(shù)據(jù)都有一個地址,用它們占用的那片存儲單元中的第一個存儲單元的地址表示。 5.在C++中,為某個變量、函數(shù)常數(shù)、數(shù)組和對象等分配內(nèi)存儲器的工作由編譯程序完成。計(jì)算機(jī)通過這種地址編號的方式來管理內(nèi)存數(shù)據(jù)讀寫的準(zhǔn)確定位。程序中聲明的變量是要占據(jù)一定的內(nèi)存空間的,不同的數(shù)據(jù)類型占用的字節(jié)數(shù)是不一樣的,例如:char型占1個字節(jié),short型占2個字節(jié),int型和long型都占4個字節(jié)。如圖5-1所示,表明了每一個內(nèi)存單元都有自己的地址,在地址所標(biāo)志的內(nèi)存單元中可用來存放數(shù)據(jù),一般稱為內(nèi)存單元的內(nèi)容。7西南交通大學(xué)戴克儉c++第五章§5.1指針的概述內(nèi)存單元內(nèi)存單元內(nèi)存單元2000200120023000地址編號內(nèi)存儲器……36…3004內(nèi)存單元的地址內(nèi)存單元的內(nèi)容inti=3;intj=6;8西南交通大學(xué)戴克儉c++第五章 6.在C++程序中是如何從內(nèi)存單元中存取數(shù)據(jù)的呢 (1)是通過變量名,稱為直接訪問方式,直接對變量的存儲單元進(jìn)行存取訪問。在變量獲得內(nèi)存空間的同時,變量名也就成為了相應(yīng)內(nèi)存空間的名稱,在變量的整個生存期內(nèi)都可以用這個名字訪問該內(nèi)存空間,表現(xiàn)在程序語句中就是通過變量名存取變量內(nèi)容。 例如:[例5.1.1]中,用語句: cout<<"a的值表示方法1:"<<a<<endl; 來輸出變量a的值?!?.1指針的概述9西南交通大學(xué)戴克儉c++第五章(2)是通過地址,稱為間接訪問方式,先找到存放變量的地址的變量,得到變量的地址,再根據(jù)變量的地址找到變量的存儲單元,對它進(jìn)行存取訪問。 例如:[例5.1.1]中,用語句: cout<<"a的值表示方法2:"<<*p<<endl; 來輸出變量a的值。(3)有時使用變量名不夠方便或者根本沒有變量可用,這時就需要直接用地址來訪問內(nèi)存單元。例如,在不同的函數(shù)之間傳送大量數(shù)據(jù)時,如果不是傳遞變量值,而是只傳遞變量的地址,就會減小開銷,提高效率。如果是動態(tài)分配的內(nèi)存單元,則根本就沒有名稱,這時只能通過地址訪問。§5.1指針的概述10西南交通大學(xué)戴克儉c++第五章§5.1指針的概述 1.如何通過地址來操作呢? 在C++中專門用一種數(shù)據(jù)類型,稱為“指針”數(shù)據(jù)類型來表示“地址”,指針實(shí)際上是某個內(nèi)存單元的首地址。一個變量在內(nèi)存空間中占用的地址就稱為該變量的“指針”。 2.程序中定義的任何變量、數(shù)組或函數(shù)等,在編譯時都會在內(nèi)存中分配一個確定的地址單元,即都有地址。 C++規(guī)定:11西南交通大學(xué)戴克儉c++第五章 (1)變量的地址可以用&表示。例如,&i表示變量i的地址。 (2)數(shù)組的地址,即數(shù)組第一個元素的地址,可以直接用數(shù)組名表示。例如,a或&a[0]。 (3)函數(shù)的地址用函數(shù)名表示。(關(guān)于函數(shù)的概念將在下一章學(xué)習(xí))
§5.1指針的概述12西南交通大學(xué)戴克儉c++第五章
1.如何使用指針呢? (1)由于指針是一種數(shù)據(jù)類型,是包含另一個變量地址的變量,指針也是一個變量,應(yīng)遵循先定義,后使用。 (2)定義指針類型是由該指針指向的變量類型決定。 定義指針變量的一般格式如下: ①
定義語句中的“*”表示該變量為指針變量。§5.2指針變量的定義、賦值及使用存儲類型數(shù)據(jù)類型*指針變量13西南交通大學(xué)戴克儉c++第五章
②
數(shù)據(jù)類型標(biāo)識符規(guī)定了指針變量指向的數(shù)據(jù)類型 例如: [例5.1.1]中,定義語句: int*p; “*”表示該變量p為指針變量;且指針變量p只能操作整型數(shù)據(jù)?!?.2指針變量的定義、賦值及使用14西南交通大學(xué)戴克儉c++第五章 2.指針變量的初始化的常用形式: 與變量定義一樣,定義好指針變量后也可以對它進(jìn)行初始化,指針變量可以初始化為0、NULL或一個地址。數(shù)值為0或者NULL的指針不指任何內(nèi)容。數(shù)值0是可以直接賦給指針變量的唯一整數(shù)值。
(1)指針變量的初始化常用的第一種形式: 在定義指針變量的同時進(jìn)行初始化賦值,一般格式如下: 數(shù)據(jù)類型*指針名=初始地址;§5.2指針變量的定義、賦值及使用15西南交通大學(xué)戴克儉c++第五章 例如: inta=3; int*pa=&a; (2)指針變量的初始化常用的第二種形式: 定義指針變量后,用賦值語句將其初始化。 指針變量名=地址;可以是變量的地址、數(shù)組名、函數(shù)名等。 例如:先定義:int*p; 再用賦值語句:p=&x;§5.2指針變量的定義、賦值及使用16西南交通大學(xué)戴克儉c++第五章(3)使用時注意事項(xiàng): ①指針的類型是它所指向變量的類型。 ②已賦初值的指針可以初始化另一個指針變量。 例如:q=p;由于p已經(jīng)有值,可以來初始化q。 ③用變量地址作為初值時,該變量的定義必須在指針初始化之前定義。 例如:[例5.3.1]中, inta=3;int*pa=&a; intx;int*p;p=&x; 變量的定義一定要在指針定義之前。§5.2指針變量的定義、賦值及使用17西南交通大學(xué)戴克儉c++第五章 ④不能把常量或表達(dá)式的地址賦給指針變量。
例如:P=&67;P=&(i+5)是非法的。 ⑤不能將一個非0整數(shù)直接賦給指針變量,但可以賦整數(shù)值0,表示該指針為空指針。 例如:int*p;p=0;p為空指針,不指向任何地址。 ⑥允許聲明指向void類型的指針,該指針可以被賦予任何類型對象的地址。 例如:void*general; int*point;inti; general=&i;point=(int*)general;§5.2指針變量的定義、賦值及使用18西南交通大學(xué)戴克儉c++第五章 3.使用時要注意指針與指針變量的區(qū)別: 指針是內(nèi)存單元的地址,簡稱地址。 指針變量是用于存儲變量地址的變量。
§5.2指針變量的定義、賦值及使用19西南交通大學(xué)戴克儉c++第五章
1.為了使用指針變量,要掌握兩個運(yùn)算符: (1)指針運(yùn)算符*,也稱為“間接訪問”運(yùn)算符,是一個一元運(yùn)算符,表示指針變量所指向的變量的值。 (2)取地址運(yùn)算符&,是一個一元運(yùn)算符,用來得到一個對象的地址,例:&x,取變量x的地址。取地址運(yùn)算符的操作數(shù)必須是變量名。 2.使用指針變量與使用一般變量一樣,一定要先定義后使用,使用前,指針變量一定要有明確的指向,例如,int*p;,p=&x;明確指向變量x的地址。§5.2指針變量的定義、賦值及使用20西南交通大學(xué)戴克儉c++第五章§5.3通過指針變量訪問單一變量 [例5.5.1]閱讀如下程序: 源程序清單: #include<iostream> usingnamespacestd; voidmain() { intx,*p; x=3; p=&x; *p=*p+10; cout<<*p<<endl; }21西南交通大學(xué)戴克儉c++第五章§5.3通過指針變量訪問單一變量 編程技巧: 1.程序中定義指針變量p,它的數(shù)據(jù)類型與它要操作的變量的數(shù)據(jù)類型一致,[例5.5.1]中同為int。 2.定義好指針變量p后,用賦值語句p=&x;將它要操作的變量的地址賦給了指針變量p。 3.用間接訪問*p,替代變量名來操作變量, [例5.5.1]中*p=*p+10;在原來的值3基礎(chǔ)上加上10,與語句x=x+10;等價。 4.用*p輸出值,即輸出值為13。22西南交通大學(xué)戴克儉c++第五章 5.注意事項(xiàng): (1)*出現(xiàn)在定義語句中和執(zhí)行語句中其含義是不同的 例如:[例5.5.1]中,intx,*p;在該語句中,*p是一個int型指針,*在定義語句中,表示定義的是指針變量 cout<<*p; 在該語句中,*p是輸出指針p的內(nèi)容,*在執(zhí)行語句表示指針?biāo)笇ο蟮膬?nèi)容。 (2)p=&x;將變量x的地址賦給指針變量p,一定要先定義x,然后才能將變量x的地址賦給指針變量p,p有明確的指向后才能操作?!?.3通過指針變量訪問單一變量23西南交通大學(xué)戴克儉c++第五章 [例5.5.2]輸入a和b兩個整數(shù),運(yùn)用指針技術(shù)按先大后小的順序輸出a和b。 思路分析:輸入兩個整數(shù),判斷誰大誰小,若a大輸出a,b;若a小輸出b,a。 算法描述:§5.3通過指針變量訪問單一變量輸出*p1、*p2的值輸出*p2、*p1的值*p1<*p2YN用指針操作方式從鍵盤獲取輸入兩個整數(shù)的值定義兩個整型變量,及操作它們的兩個整型指針,并把兩個整型變量的地址分別賦給兩個整型指針24西南交通大學(xué)戴克儉c++第五章 源程序清單: #include<iostream> #include<iomanip> usingnamespacestd; voidmain(void) { inta,b; int*p1=&a; int*p2=&b; cout<<"inputaandb:"<<endl; cin>>*p1>>*p2;§5.3通過指針變量訪問單一變量25西南交通大學(xué)戴克儉c++第五章 if(*p1<*p2) cout<<"按先大后小的順序輸出的a和b 為:"<<*p2<<setw(4)<<*p1<<endl; else cout<<"按先大后小的順序輸出的a和b 為:"<<*p1<<setw(4)<<*p2<<endl; } 編程技巧: 1.利用間接訪問方式來操作?!?.3通過指針變量訪問單一變量26西南交通大學(xué)戴克儉c++第五章§5.4通過指針變量操作一維數(shù)組 在C++中,有了指針和地址的概念,我們在操作數(shù)組時,就可以用如下的四種方法來操作數(shù)組。 使用數(shù)組名和下標(biāo) 使用數(shù)組名和指針運(yùn)算 使用指針變量 使用下標(biāo)表示法引用指針指向的數(shù)組元素 [例5.6.1]設(shè)有一個int型數(shù)組a,有10個元素,請用上述的四種方法去訪問數(shù)組的各個元素。27西南交通大學(xué)戴克儉c++第五章 源程序清單: #include<iostream> usingnamespacestd; voidmain() { inta[10]; inti,*p; for(i=0;i<10;i++) cin>>a[i];//數(shù)組名和下標(biāo)來訪問數(shù)組§5.4通過指針變量操作一維數(shù)組28西南交通大學(xué)戴克儉c++第五章 for(i=0;i<10;i++) cout<<*(a+i);//數(shù)組名和指針運(yùn)算來訪問數(shù)組 for(p=a;p-a<10;p++) cout<<*p;//指針變量的移動來訪問數(shù)組 p=a; for(i=0;i<10;i++) cout<<p[i];//下標(biāo)表示法 }§5.4通過指針變量操作一維數(shù)組29西南交通大學(xué)戴克儉c++第五章 編程技巧: 1.例中第一種方法操作數(shù)組時,使用數(shù)組名和下標(biāo)來訪問數(shù)組,是第四章中我們已經(jīng)學(xué)習(xí)和掌握的方法。 2.例中第二種方法操作數(shù)組時,使用數(shù)組名和指針運(yùn)算來訪問數(shù)組,利用了數(shù)組名a是數(shù)組首地址,是一個地址常量,是數(shù)組第一個元素的地址,但數(shù)組名所代表的首地址只是一個指針常量,是固定的指針,我們不能對數(shù)組名賦予一個新的地址值,也不能使這指針常量“移動”,指向數(shù)組的其它元素,要指向其它數(shù)組元素時,通過首地址加上一個值,使之指向其它的數(shù)組元素。例如:[例5.6.1]中就通過*(a+i)來指向數(shù)組中的第i個元素。§5.4通過指針變量操作一維數(shù)組30西南交通大學(xué)戴克儉c++第五章 3.例中第三種方法操作數(shù)組時,使用指針變量來訪問數(shù)組,是利用指針變量可以賦新的地址值和使指針變量“移動”而指向數(shù)組的其它元素。 4.例中第四種方法操作數(shù)組時,使用下標(biāo)表示法引用指針指向的數(shù)組元素,注意操作時,指針要指向數(shù)組的首地址。
§5.4通過指針變量操作一維數(shù)組31西南交通大學(xué)戴克儉c++第五章
1.要使用指針變量來訪問數(shù)組,關(guān)鍵是如何“移動”指針變量,使指針變量指向具體要操作地數(shù)組元素的地址,就需要掌握指針變量的算術(shù)運(yùn)算。 指針與整數(shù)的加減運(yùn)算
指針p加上或減去n,其意義是指針當(dāng)前指向位置的前方或后方第n個數(shù)據(jù)的地址。 指針加一,減一運(yùn)算
指向下一個或前一個數(shù)據(jù)。 例如:y=*px++相當(dāng)于y=*(px++)
*和++優(yōu)先級相同,自右向左結(jié)合§5.4通過指針變量操作一維數(shù)組32西南交通大學(xué)戴克儉c++第五章 如: inta[5]={1,2,3,4,5}; int*p; p=a;p++;p+=3;p--; 指針變量值每自增一次 指向后一個數(shù)組元 素的內(nèi)存單元 指針變量值每自減一次 指向前一個數(shù)組元 素的內(nèi)存單元6.8指針的算術(shù)運(yùn)算pa-2pa-1pa+1pa+2pa+3*(pa-2)*pa*(pa+1)*(pa+2)*(pa+3)*(pa-1)short*papa33西南交通大學(xué)戴克儉c++第五章
兩指針相減:
兩指針相減的結(jié)果是一個整數(shù),等于兩指針指向的內(nèi)存單元之間的內(nèi)存單元的個數(shù)減1。 例如:
inta[10],*p,*q,k; p=a; q=a+10; k=q-p;//k的值等于9§5.4通過指針變量操作一維數(shù)組34西南交通大學(xué)戴克儉c++第五章 [例5.6.3]閱讀如下程序: 源程序清單: #include<iostream> usingnamespacestd; voidmain() { chara[10]="abcdefghi"; char*p1,*p2; p1=a; p1+=2; p2=a+4;//指針變量p2,直接由數(shù)組名加上4,指向數(shù)組 的第五個數(shù)組元素的內(nèi)存單元§5.4通過指針變量操作一維數(shù)組35西南交通大學(xué)戴克儉c++第五章 if(p1<p2) cout<<“p1所指向的數(shù)組元素在p2所指向的數(shù)組元素前面!"<<endl; else cout<<“p1所指向的數(shù)組元素在p2所指向的數(shù)組元素后 面!"<<endl; p1++;p2--; if(p1==p2) cout<<“p1和p2同時指向數(shù)組中的同一個元素且元素值 為:"<<*p1<<endl; else cout<<"p1和p2沒有指向數(shù)組中的同一個元素!"<<endl; }§5.4通過指針變量操作一維數(shù)組36西南交通大學(xué)戴克儉c++第五章 編程技巧: 1.在操作數(shù)組時,有時可能會用到兩個指針變量指向同一個數(shù)組,例如:在[例5.6.3]中,用p1和p2兩個指針變量指向同一個數(shù)組,此時兩個指針變量之間的可以進(jìn)行關(guān)系運(yùn)算,其關(guān)系運(yùn)算的結(jié)果表明了這兩個指針變量所指向的數(shù)組元素的先后關(guān)系。 (1)若p1==p2;表明p1和p2指向數(shù)組中的同一個數(shù)組元素; (2)若p1<p2;表明p1所指向的數(shù)組元素在p2所指向的數(shù)組元素前面; (3)若p1>p2;表明p1所指向的數(shù)組元素在p2所指向的數(shù)組元素后面。 例如:§5.4通過指針變量操作一維數(shù)組37西南交通大學(xué)戴克儉c++第五章 [例5.6.3]中,第一次輸出時,p1<p2條件成立,表明p1所指向的數(shù)組元素在p2所指向的數(shù)組元素前面;如圖5-3所示。§5.4通過指針變量操作一維數(shù)組38西南交通大學(xué)戴克儉c++第五章 第二次輸出時,p1==p2條件成立,表明p1和p2指向數(shù)組中的同一個數(shù)組元素,如圖5-4所示。 2.此外,指針變量還可以和零之間進(jìn)行等于或不等于的關(guān)系運(yùn)算。例如:p==0或p!=0。§5.4通過指針變量操作一維數(shù)組39西南交通大學(xué)戴克儉c++第五章指針應(yīng)用舉例 [例5.6.4]利用指針技術(shù),將鍵盤輸入的N個整數(shù)按相反的順序存放并輸出。 思路分析:分別取出數(shù)組最前面和最后面的元素,進(jìn)行交換,即a[0]與a[N-1]交換;然后再分別取出a[1]與a[N-2]交換;直到交換完畢。 算法描述:for(i=0,j=N-1;i<j;i++,j--)定義、輸入初始數(shù)組的值指針指向數(shù)組的首地址temp=*(p+i)*(p+i)=*(p+j)*(p+j)=temp輸出交換后數(shù)組的值40西南交通大學(xué)戴克儉c++第五章
源程序清單: #include<iostream> #include<iomanip> usingnamespacestd; intmain(void) { inta[10],i,j,temp,*p; cout<<"Inputteninterger:"<<endl; for(p=a;p<a+10;p++) cin>>*p;指針應(yīng)用舉例41西南交通大學(xué)戴克儉c++第五章指針應(yīng)用舉例p=a;for(i=0,j=10-1;i<j;i++,j--){ temp=*(p+i); *(p+i)=*(p+j); *(p+j)=temp;}for(p=a;p<a+10;p++) cout<<setw(4)<<*p;cout<<endl;return0;}
42西南交通大學(xué)戴克儉c++第五章指針應(yīng)用舉例 編程技巧: 1.定義指針變量操作一維數(shù)組,定義后把指針變量指向數(shù)組的首地址,用循環(huán)輸入各個數(shù)組元素的值。 2.再次使用指針變量操作數(shù)組前,必須要明確指針變量的指向,即指針變量再次指向數(shù)組的首地址,用語句“p=a;”實(shí)現(xiàn)。 3.利用了兩個變量i,j并賦初值后,用*(p+i)、*(p+j)分別取出數(shù)組中首尾元素的值進(jìn)行交換,然后使i++、j--分別再取出數(shù)組中第二個元素的值和倒數(shù)第二個元素的值進(jìn)行交換,直到交換完畢,即條件i<j不成立。43西南交通大學(xué)戴克儉c++第五章 [例5.6.5]把一個整數(shù)插入到一個由小到大的有序數(shù)列中,并仍然保持由小到大的順序。 思路分析: 設(shè)有10個整數(shù)按由小到大的順序存放在a數(shù)組中,待插入的數(shù)存放在變量x中,如:10個有序數(shù)依次為: 2468121617203040,待插入的數(shù):x=11。 要插入的數(shù)8<x=11<12,所以x=11應(yīng)放在a[4]中。 如何放入a[4]中,首先把原來a[4]~a[9]中的所有元素向后移一位,然后再把x的值放入到a[4]中,經(jīng)過以上的操作之后,數(shù)據(jù)如下: 246811121617203040完成插入。
指針應(yīng)用舉例44西南交通大學(xué)戴克儉c++第五章指針應(yīng)用舉例 完成插入操作的關(guān)鍵是確定插入的位置。設(shè)一個位置變量p,令其初值為0,將x與a[p]進(jìn)行比較,只要x大于a[p]就表示x所要插的位置是在a[p]之后,此時應(yīng)該使p后移一個位置,接著再進(jìn)行下一個元素的比較;不斷重復(fù)以上過程,一旦x不再大于a[p],這時的p就是x所要插入的位置,在沒找到x所要插的位置之前,循環(huán)次數(shù)無法確定,判斷循環(huán)條件可用邏輯條件: (x>a[p]&&p<10) p<10條件的限制是保證找位置的操作只在數(shù)組中進(jìn)行。 找到插入位置后,就進(jìn)行移動,在該位置后的所有元素向后移動一位,移動空出來的位置把x的值插入,在輸出插入完成后數(shù)組的值。45西南交通大學(xué)戴克儉c++第五章指針應(yīng)用舉例算法描述:定義數(shù)組,定義變量并賦初值輸入數(shù)組的值、輸入待插入的數(shù)當(dāng)x>*(t+p)&&p<N成立
P++指針指向最后一個元素,即t=a+N-1當(dāng)t>=a+p成立*(t+1)=*tt--t=a+p;指針指向要插入的位置*t=x;插入值輸出插入完成后的數(shù)組
46西南交通大學(xué)戴克儉c++第五章指針應(yīng)用舉例 #include<iostream> #include<iomanip> usingnamespacestd; voidmain(void) { constintN=10; inta[N+1],p=0,x,*t; cout<<“輸入a數(shù)組:”<<endl; for(t=a;t<a+N;t++) cin>>*t; cout<<“輸入待插入的數(shù)x:”<<endl; cin>>x;47西南交通大學(xué)戴克儉c++第五章指針應(yīng)用舉例 t=a; while(x>*(t+p)&&p<N) p++; for(t=a+N-1;t>=a+p;t--) *(t+1)=*t; t=a+p; *t=x; for(t=a;t<=a+N;t++) cout<<setw(3)<<*t; }48西南交通大學(xué)戴克儉c++第五章指針應(yīng)用舉例 編程技巧: 1.在定義數(shù)組時,要考慮到插入后數(shù)組元素的長度增加了一個,定義時要在原數(shù)組長度的基礎(chǔ)上加一。例如:[例5.6.5]中,定義數(shù)組為:inta[N+1]。 2.要注意指針變量在使用后的指向,再次操作時要賦初值,例如:[例5.6.5]中,t=a;讓指針變量再次指向數(shù)組的首地址。49西南交通大學(xué)戴克儉c++第五章 [例5.6.6]編寫程序,用指針技術(shù)刪除字符串末尾的所有空格。 思路分析: 用指針操作字符串,首先把指針指向字符串末尾的字符,取出其末尾字符的值,進(jìn)行判斷是否等于空格,若等于就刪除,即把指針指向前一個字符,指針減1,再取出倒數(shù)第二個字符進(jìn)行判斷是否等于空格,等于就進(jìn)行同樣的操作,直到不等于,就說明字符串末尾已經(jīng)沒有空格,操作完成,需要給字符串末尾加上結(jié)束標(biāo)志‘\0’。指針應(yīng)用舉例50西南交通大學(xué)戴克儉c++第五章指針應(yīng)用舉例定義strings1表示字符串,定義char型指針變量*p操作字符串,定義操作中用到的變量n,j輸入含有末尾空格的字符串找到末尾字符:n=s1.size();j=n-1;指針變量*p賦初值:p=&s1[0];當(dāng)while(*(p+j)==空格)j--;加字符串結(jié)束標(biāo)志“\0”輸出刪除末尾空格后的字符串51西南交通大學(xué)戴克儉c++第五章 源程序清單: #include<iostream> #include<string> usingnamespacestd; voidmain(void) { intn,j; strings1=""; char*p; cout<<"輸入需要刪除末尾空格的字符串:"<<endl; getline(cin,s1); cout<<"未刪除末尾空格前的字符串為:"<<endl<<s1<< "字符串結(jié)束標(biāo)志!"<<endl; n=s1.size();指針應(yīng)用舉例52西南交通大學(xué)戴克儉c++第五章指針應(yīng)用舉例 j=n-1; p=&s1[0]; while(*(p+j)=='')j--; *(p+j+1)='\0'; cout<<"刪除末尾空格后的字符串為:"<<endl<<s1<< "字符串結(jié)束標(biāo)志!"<<endl; } 編程技巧: 1.用string數(shù)據(jù)類型,加頭文件#include<string>。 2.由于輸入字符串含有空格,輸入時必須用getline(cin,s1)函數(shù)實(shí)現(xiàn)輸入。 3.用s1.size()函數(shù)求出字符串的長度n,包含字符串的實(shí)際長度,字符數(shù)組是從下標(biāo)0開始,最后一個字符的位置應(yīng)為n-1。 4.用語句:p=&s1[0]對指針變量進(jìn)行賦初值。53西南交通大學(xué)戴克儉c++第五章應(yīng)用舉例[例6-1]從鍵盤輸入整數(shù)集合a、b的元素個數(shù)和各個元素的值,計(jì)算并輸出其交集。源程序清單如下: #include<iostream.h> #include<iomanip.h> voidmain(void) {constintM=20,N=10; inta[M],b[N],c[M]; intd,e,f=0,*pa,*pb,*pc;
cout<<"輸入數(shù)組a中元素的個數(shù):"<<endl; cin>>d;54西南交通大學(xué)戴克儉c++第五章 cout<<"輸入數(shù)組a的"<<d<<"個元素:"<<endl; for(pa=a;pa<a+d;pa++) cin>>*pa; cout<<"輸入數(shù)組b中元素的個數(shù):"<<endl; cin>>e; cout<<"輸入數(shù)組b的"<<e<<"個元素:"<<endl; for(pb=b;pb<b+e;pb++) cin>>*pb; for(pa=a,pc=c;pa<a+d;pa++) for(pb=b;pb<b+e;pb++)應(yīng)用舉例55西南交通大學(xué)戴克儉c++第五章 if(*pa==*pb) { *pc++=*pa; f++; break; } cout<<"交集c的各個元素依次為:"<<endl; for(pc=c;pc<c+f;pc++) cout<<setw(3)<<*pc;}應(yīng)用舉例56西南交通大學(xué)戴克儉c++第五章[例6-2]從鍵盤輸入整數(shù)集合a、b的元素個數(shù)和各個元素的值,計(jì)算并輸出其并集。源程序清單如下: #include<iostream.h> #include<iomanip.h> voidmain(void) { constintM=20,N=10; inta[M],b[N],c[M+N]; intd,e,f=0,*pa,*pb,*pc;應(yīng)用舉例57西南交通大學(xué)戴克儉c++第五章 cout<<"輸入數(shù)組a中元素的個數(shù):"<<endl; cin>>d; cout<<"輸入數(shù)組a的"<<d<<"個元素:"<<endl; for(pa=a;pa<a+d;pa++) cin>>*pa; cout<<"輸入數(shù)組b中元素的個數(shù):"<<endl; cin>>e; cout<<"輸入數(shù)組b的"<<e<<"個元素:"<<endl; for(pb=b;pb<b+e;pb++) cin>>*pb;應(yīng)用舉例58西南交通大學(xué)戴克儉c++第五章 for(pa=a,pc=c;pa<a+d;pa++,pc++) {*pc=*pa;f++;} for(pb=b;pb<b+e;pb++) {for(pa=a;pa<a+d;pa++) if(*pb==*pa) break; if(pa>=a+d) {*pc++=*pb;f++;} } cout<<"交集c的各個元素依次為:"<<endl; for(pc=c;pc<c+f;pc++) cout<<setw(3)<<*pc; }應(yīng)用舉例59西南交通大學(xué)戴克儉c++第五章§5.5二維數(shù)組與指針[例5.12]運(yùn)用指針的方法編程實(shí)現(xiàn):輸出如下二維數(shù)組各元素的值。 inta[3]4]={1,2,3,4,5,6,7,8,9,10,11,12}源程序清單一:
#include<iostream> #include<iomanip> usingnamespacestd; voidmain() { inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}60西南交通大學(xué)戴克儉c++第五章
int*p; for(p=a[0];p<a[0]+12;p++) {if(p-a[0])%4==0)cout<<endl; cout<<setw(4)<<*p; } cout<<endl; }§5.5二維數(shù)組與指針61西南交通大學(xué)戴克儉c++第五章源程序清單二:
#include<iostream> #include<iomanip> usingnamespacestd; voidmain(void) { inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int*p[3],i,j; for(i=0;i<3;i++) { p[i]=a[i];§5.5二維數(shù)組與指針62西南交通大學(xué)戴克儉c++第五章
for(j=0;j<4;j++) cout<<setw(4)<<*(p[i]+j); cout<<endl; } }編程技巧:⑴通過前面的學(xué)習(xí)我們知道,二維數(shù)組在計(jì)算機(jī)里實(shí)際上是轉(zhuǎn)換成一維數(shù)組來存儲的,是按行方式存放的。§5.5二維數(shù)組與指針63西南交通大學(xué)戴克儉c++第五章⑵在操作二維數(shù)組時,指向二維數(shù)組的指針變量的定義、賦值和使用與指向一維數(shù)組的指針變量基本相同。⑶具體操作二維數(shù)組時,一般常用兩種方法:
①用指針變量使用數(shù)組元素,此方法是把二維數(shù)組轉(zhuǎn)換成一維數(shù)組來操作,定義指針變量先指向首地址,然后通過指針變量“移動”來操作具體的數(shù)組元素。 ②定義指針數(shù)組使用數(shù)組元素,指針數(shù)組就是數(shù)組中每個元素是指針,用它來指向一維數(shù)組?!?.5二維數(shù)組與指針64西南交通大學(xué)戴克儉c++第五章 [5.13]利用指針技術(shù),求5×5階方陣主對角線的和。 思路分析:
5×5的方陣用二維數(shù)組a[5][5]表示,定義一個指針數(shù)組*p[5]來操作數(shù)組;求主對角線的和,先找到主對角線上的元素,應(yīng)滿足條件行號等于列號,再進(jìn)行累加。 算法描述:§5.5二維數(shù)組與指針65西南交通大學(xué)戴克儉c++第五章源程序清單:
#include<iostream> usingnamespacestd; voidmain(void) { inta[5][5],*p[5],i,j,sum=0; cout<<“請輸入方陣的值:”<<endl; for(i=0;i<5;i++) { p[i]=a[i]; for(j=0;j<5;j++)cin>>*(p[i]+j); }§5.5二維數(shù)組與指針66西南交通大學(xué)戴克儉c++第五章
for(i=0;i<5;i++) { p[i]=a[i]; for(j=0;j<5;j++) if(i==j) sum=sum+*(p[i]+j); } cout<<“方陣的對角線之和為:”<<sum<<endl; }§5.5二維數(shù)組與指針67西南交通大學(xué)戴克儉c++第五章6.10存儲分配 靜態(tài)存儲分配:
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年版衛(wèi)生院防疫工作聘用合同書3篇
- 2024版設(shè)備維修與技術(shù)支持合同3篇
- 2025年度文化產(chǎn)業(yè)擔(dān)保合同會計(jì)處理及文化創(chuàng)意產(chǎn)業(yè)扶持3篇
- 年度汽車電子競爭策略分析報告
- 二零二五版集裝箱運(yùn)輸保險代理服務(wù)合同范本3篇
- 2025年度互聯(lián)網(wǎng)醫(yī)療信息服務(wù)合同糾紛解決書模板4篇
- 貪吃蛇課程設(shè)計(jì)論文c
- 2025年酒店住宿服務(wù)銷售合同修訂與客戶滿意度提升3篇
- 二零二五年都市白領(lǐng)租房代理服務(wù)合同樣本3篇
- 2025年水電站經(jīng)營權(quán)承包與電力銷售收入分成合同2篇
- 企業(yè)會計(jì)準(zhǔn)則、應(yīng)用指南及附錄2023年8月
- 諒解書(標(biāo)準(zhǔn)樣本)
- 2022年浙江省事業(yè)編制招聘考試《計(jì)算機(jī)專業(yè)基礎(chǔ)知識》真題試卷【1000題】
- 認(rèn)養(yǎng)一頭牛IPO上市招股書
- GB/T 3767-2016聲學(xué)聲壓法測定噪聲源聲功率級和聲能量級反射面上方近似自由場的工程法
- GB/T 23574-2009金屬切削機(jī)床油霧濃度的測量方法
- 西班牙語構(gòu)詞.前后綴
- 動物生理學(xué)-全套課件(上)
- 河北省衡水市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細(xì)
- DB32-T 2665-2014機(jī)動車維修費(fèi)用結(jié)算規(guī)范-(高清現(xiàn)行)
- 智能消防設(shè)備公司市場營銷方案
評論
0/150
提交評論