版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第11章指針C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/162第11章指針本章要點(diǎn)指針概念指針與數(shù)組指針與函數(shù)字符串動(dòng)態(tài)空間管理C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/16311指針知識點(diǎn)指針概念指向數(shù)組的指針、指針數(shù)組指針做參數(shù)、指針做為函數(shù)值、指向函數(shù)的指針字符串動(dòng)態(tài)空間管理C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/16411.1理解指針當(dāng)問路時(shí),經(jīng)常聽到這樣的回答:“向前走過3個(gè)路口右轉(zhuǎn),再過兩個(gè)路口左轉(zhuǎn),再前行200米。”當(dāng)在圖書館中找一本時(shí),經(jīng)常是這樣找:“第五排書架,從上向下數(shù)第二層,左數(shù)第6本?!崩蠋熖釂枌W(xué)生,在不知道學(xué)生姓名的情況下,經(jīng)常說:“第4排左數(shù)第二個(gè)同學(xué)?!鄙鲜隼诱f明對一個(gè)事務(wù)的訪問,當(dāng)不能夠通過名稱直接訪問,只能夠通過其位置進(jìn)行訪問。C程序同樣的道理,前面的章節(jié)對數(shù)據(jù)的訪問是通過變量名稱實(shí)現(xiàn)的,但是,有時(shí)候不知道其名稱,甚至其沒有名稱,這時(shí)候只能通過該數(shù)據(jù)所在的地址進(jìn)行訪問。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/16511.2指向變量的指針C語言中定義一個(gè)變量時(shí),例如:inti1=3;描述了變量相關(guān)的3方面的屬性:值、地址、類型。1.值為3,通過變量訪問,如i1+52.地址為0012ff78(32位機(jī)器,0012ff78為16進(jìn)制數(shù)),占用內(nèi)存空間的位置,通過&i1訪問,&在scanf語句中使用過。3.類型為int,決定了其能夠參加的運(yùn)算,同時(shí)也決定了其占用空間的大?。◤钠鹗嫉刂烽_始占用的連續(xù)字節(jié)數(shù)),占用空間的大小通過sizeof運(yùn)算符,在vc中sizeof(i1)為4個(gè)字節(jié)。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/16611.2指向變量的指針把變量i1的地址存放于指針變量pi1中C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/16711.2.1指針變量的定義指針變量定義的一般形式為:
類型說明符*變量名;例如:int*pi1;對指針變量的定義包括三個(gè)內(nèi)容:1.指針類型說明,*表示這是一個(gè)指針變量;2.指針變量名,pi1為指針變量名;3.指針?biāo)赶虻淖兞康臄?shù)據(jù)類型,int為指針變量所指向的變量的數(shù)據(jù)類型,說明pi1只能儲存整型變量的地址。再如:float*pf1;/*pf1是指向浮點(diǎn)變量的指針變量*/char*pc1/*pc1是指向字符變量的指針變量*/C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/16811.2.2指針變量的引用指針變量同普通變量一樣,使用之前不僅要定義說明,而且必須賦予具體的值。未經(jīng)賦值的指針變量不能使用,否則將造成系統(tǒng)混亂,甚至死機(jī)。(問路時(shí)別人告訴你一個(gè)不存在的地址,會怎么樣?)C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/16911.2.2指針變量的引用
和指針相關(guān)有兩個(gè)運(yùn)算符&和*:1.&:取地址運(yùn)算符。其一般形式為:&變量名取一個(gè)內(nèi)存變量的地址。2.*:指針運(yùn)算符(或稱“間接訪問”運(yùn)算符)。其一般形式為:*指針變量名通過指針變量間接訪問指針變量所指向變量的數(shù)據(jù)。inti1;int*pi1;pi1=&i1;inti2=*pi1+1;
此處*代表間接訪問運(yùn)算符,取指針變量pi1所指向的變量i1的值(對i1間接訪問)加1賦值給變量i2。此語句結(jié)果完全等價(jià)于:inti2=i1+1;C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/161011.2.2指針變量的引用指針變量說明:1.對*要區(qū)別類型說明符與間接訪訪問符。2.不能用一個(gè)數(shù)給指針變量賦值,下面賦值是錯(cuò)誤的:int*pi1;pi1=20;但是,指針可用0賦值,代表空指針,哪里也不指向。3.給指針變量賦值時(shí),指針變量前不能加“*”說明符,下面的寫法是錯(cuò)誤的:
inti1;int*pi1;*pi1=&i1;指針變量pi1前面加*就代表間接訪問了,代表i1。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/161111.2.2指針變量的引用指針變量說明:4.指針變量未指向具體有效地址,間接訪問會有問題
int*pi1;/*指針變量pi1未賦值,不知道指向哪里*/*pi1=200;/*向pi1所指向的地址空間賦值200*/(隨機(jī)給你一個(gè)賬戶,存錢后怎樣取呢?)判定一個(gè)指針變量是否指向有效空間:int*pi1=0;……if(pi1!=0)*pi1=200;省略號部分,若未使pi1指向有效空間,這對*pil的賦值就不會執(zhí)行。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/161211.2.2指針變量的引用指針變量說明:5.指針變量的值是可以改變的inti1=3,i2=4,*pi1;pi1=&i1;i2=i2+*pi1;C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/161311.2.2指針變量的引用指針變量說明:5.指針變量的值是可以改變的pi1=&i2;改變指針變量pi1指向i2C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/161411.2.2指針變量的引用指針變量說明:6.指針變量只能用同類型的地址賦值float*pf1;/*pf1是指向浮點(diǎn)變量的指針變量*/charc1;/*字符變量*/pf1=&c1;pf1只能存儲float數(shù)據(jù)的地址,用字符型數(shù)據(jù)地址賦值是錯(cuò)誤的。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/161511.2.2指針變量的引用指針變量說明:7.同類型指針變量間可以相互賦值例11.1交換指針變量#include<stdio.h>intmain(){inti1=3,i2=4;int*pi1,*pi2,*pi3;pi1=&i1;pi2=&i2;pi3=0;
/*交換指針變量*/
pi3=pi1;pi1=pi2;pi2=pi3;printf("i1=%d\ni2=%d\n",i1,i2);printf("*pi1=%d\n*pi2=%d\n",*pi1,*pi2);return0;}程序運(yùn)行結(jié)果:i1=3i2=4*pi1=4*pi2=3C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/161611.2.2指針變量的引用指針變量說明:7.同類型指針變量間可以相互賦值例11.1交換指針變量C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/161711.2.2指針變量的引用指針變量說明:7.同類型指針變量間可以相互賦值例11.2交換指針變量所指向的數(shù)據(jù)#include<stdio.h>intmain(){inti1=3,i2=4;int*pi1,*pi2;intiTemp=0;pi1=&i1;pi2=&i2;
/*交換指針變量所指向的數(shù)據(jù)*/
iTemp=*pi1;*pi1=*pi2;*pi2=iTemp;printf("i1=%d\ni2=%d\n",i1,i2);printf("*pi1=%d\n*pi2=%d\n",*pi1,*pi2);return0;}程序運(yùn)行結(jié)果:i1=4i2=3*pi1=4*pi2=3C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/161811.2.2指針變量的引用指針變量說明:7.同類型指針變量間可以相互賦值例11.2交換指針變量所指向的數(shù)據(jù)C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/1619課堂練習(xí)
1.指針變量存儲的是什么?C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/162011.3數(shù)組與指針
一個(gè)變量有一個(gè)地址,一個(gè)數(shù)組包含若干元素,每個(gè)數(shù)組元素都在內(nèi)存中占用存儲單元,它們都有相應(yīng)的地址。所謂數(shù)組的指針是指數(shù)組的起始地址,數(shù)組元素的指針是數(shù)組元素的地址。對數(shù)組元素也可以采用指針進(jìn)行訪問,效率相對更高。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/162111.3.1一維數(shù)組與指針一個(gè)數(shù)組是由連續(xù)的一塊內(nèi)存單元組成的。數(shù)組名就是這塊連續(xù)內(nèi)存單元的首地址(常量)。intiArr[5]={1,2,3,4,5};int*pi;pi=&iArr[0];C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/162211.3.1一維數(shù)組與指針C語言規(guī)定,數(shù)組名代表數(shù)組的首地址,也就是第0號元素的地址。因此,下面兩個(gè)語句等價(jià):
pi=&iArr[0];pi=iArr;
iArr數(shù)組名是整型常量地址
inti;iArr=&i;/*不可以,因?yàn)閕Arr為常量*/C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/162311.3.1一維數(shù)組與指針1.指針相關(guān)的運(yùn)算符(1)取地址運(yùn)算符&:單目運(yùn)算符(注意其優(yōu)先級),其結(jié)合性為自右至左,其功能是取變量的地址。(2)間接訪問運(yùn)算符*:單目運(yùn)算符,其結(jié)合性為自右至左,用來表示指針變量所指的變量。(3)賦值運(yùn)算符=:可以給指針變量賦值。(4)算術(shù)運(yùn)算符+、-、++、--。
+:地址表達(dá)式(pi)+整型表達(dá)式(in),結(jié)果為在pi地址值位置跳過in×(pi所指類型字節(jié)數(shù))個(gè)字節(jié)后的地址。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/162411.3.1一維數(shù)組與指針1.指針相關(guān)的運(yùn)算符-:地址表達(dá)式(pi)-整型表達(dá)式(in),結(jié)果為在pi地址值位置跳回in×(pi所指類型字節(jié)數(shù))個(gè)字節(jié)后的地址。-:地址表達(dá)式(pi1)-地址表達(dá)式(pi12),結(jié)果為在pi2和pi1相差的字節(jié)數(shù)÷(pi1所指類型字節(jié)數(shù))。pi1與pi2必須指向相同數(shù)據(jù)類型。++:地址變量(pi)++或者++地址變量(pi),結(jié)果為在pi地址值位置跳過pi所指類型字節(jié)數(shù)個(gè)字節(jié)后的地址。分前++和后++。--:地址變量(pi)--或者--地址變量(pi),結(jié)果為在pi地址值位置跳回pi所指類型字節(jié)數(shù)個(gè)字節(jié)后的地址。分前--和后--。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/162511.3.1一維數(shù)組與指針1.指針相關(guān)的運(yùn)算符(5)關(guān)系運(yùn)算。支持6種關(guān)系運(yùn)算符,用來比較地址的大小。例如:&iArr[1]<&iArr[3]為真;pi<iArr+3為真(pi的值為iArr)。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/162611.3.1一維數(shù)組與指針1.指針相關(guān)的運(yùn)算符(5)關(guān)系運(yùn)算。intiArr[5]={0,1,2,3,4};int*pi,*pi1,*pi2;pi=&iArr[1];pi1=&iArr[2];pi2=&iArr[4];①*pi++:由于++和*同優(yōu)先級,結(jié)合方向自右而左,等價(jià)于*(pi++)。先對*pi,然后pi加1。表達(dá)式的值為iArr[1],pi的值為&iArr[2]。②*++pi:等價(jià)于*(++pi)。先pi加1,然后*pi。表達(dá)式的值為iArr[2],pi的值為&iArr[2]。③(*pi)++:先*pi,然后(*pi)加1。表達(dá)式的值為iArr[1]++,iArr[1]的值改變了,pi的值為&iArr[1],pi的值未改變。④pi2-pi1:pi2和pi1相差兩個(gè)整型數(shù)所占字節(jié)數(shù)的大小,它的返回值不是相差字節(jié)數(shù),而是相差整數(shù)的個(gè)數(shù),所以值為2。上述算術(shù)運(yùn)算符對簡單變量地址運(yùn)算是無意義的,因?yàn)閷τ谝粋€(gè)簡單變量x,&x+5計(jì)算的結(jié)果地址不知道是哪個(gè)數(shù)據(jù)的地址。而數(shù)組空間是連續(xù)的,對于一個(gè)數(shù)組arr,arr+5就是arr[5]的地址。
C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/162711.3.1一維數(shù)組與指針1.指針相關(guān)的運(yùn)算符(5)關(guān)系運(yùn)算。intiArr[5]={0,1,2,3,4};int*pi,*pi1,*pi2;pi=&iArr[1];pi1=&iArr[2];pi2=&iArr[4];①*pi++:由于++和*同優(yōu)先級,結(jié)合方向自右而左,等價(jià)于*(pi++)。先對*pi,然后pi加1。表達(dá)式的值為iArr[1],pi的值為&iArr[2]。②*++pi:等價(jià)于*(++pi)。先pi加1,然后*pi。表達(dá)式的值為iArr[2],pi的值為&iArr[2]。③(*pi)++:先*pi,然后(*pi)加1。表達(dá)式的值為iArr[1]++,iArr[1]的值改變了,pi的值為&iArr[1],pi的值未改變。④pi2-pi1:pi2和pi1相差兩個(gè)整型數(shù)所占字節(jié)數(shù)的大小,它的返回值不是相差字節(jié)數(shù),而是相差整數(shù)的個(gè)數(shù),所以值為2。上述算術(shù)運(yùn)算符對簡單變量地址運(yùn)算是無意義的,因?yàn)閷τ谝粋€(gè)簡單變量x,&x+5計(jì)算的結(jié)果地址不知道是哪個(gè)數(shù)據(jù)的地址。而數(shù)組空間是連續(xù)的,對于一個(gè)數(shù)組arr,arr+5就是arr[5]的地址。
C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/162811.3.1一維數(shù)組與指針2.引用數(shù)組元素intiArr[5]={1,2,3,4,5};int*pi;pi=iArr;(1)pi+i1和iArr+i1就是iArr[i1]的地址,或者說它們指向iArr數(shù)組的第i個(gè)元素。(2)*(pi+i1)或*(iArr+i1)就是pi+i1或iArr+i1所指向的數(shù)組元素,即iArr[i1]。例如,*(pi+2)或*(iArr+2)就是iArr[2]。(3)指向數(shù)組指針變量可以帶下標(biāo),如pi[i1]與*(pi+i1)等價(jià)。引入指針變量后,對于數(shù)組iArr,pi是指向數(shù)組的指針變量,其初值pi=iArr。就可以用兩種方法來訪問數(shù)組元素:(1)下標(biāo)法,即用iArr[i1]形式訪問數(shù)組元素,也可以用pi[i1]訪問數(shù)組元素。(2)指針法,即采用*(iArr+i1)或*(pi+i1)形式,用間接訪問的方法來訪問數(shù)組元素。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/162911.3.1一維數(shù)組與指針例11.3數(shù)組元素賦值并輸出(數(shù)組名-下標(biāo)法)#include<stdio.h>intmain(){intiArr[5],i1;for(i1=0;i1<5;i1++)iArr[i1]=i1;for(i1=0;i1<5;i1++)printf("iArr[%d]=%d\n",i1,iArr[i1]);return0;}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/163011.3.1一維數(shù)組與指針例11.4數(shù)組元素賦值并輸出(指針變量-下標(biāo)法)#include<stdio.h>intmain(){intiArr[5],i1;int*pi=iArr;/*pi為變量,iArr為常量*/for(i1=0;i1<5;i1++)pi[i1]=i1;for(i1=0;i1<5;i1++)printf("iArr[%d]=%d\n",i1,pi[i1]);return0;}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/163111.3.1一維數(shù)組與指針例11.5數(shù)組元素賦值并輸出(數(shù)組名-指針法)#include<stdio.h>intmain(){intiArr[5],i1;for(i1=0;i1<5;i1++)*(iArr+i1)=i1;for(i1=0;i1<5;i1++)printf("iArr[%d]=%d\n",i1,*(iArr+i1));return0;}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/163211.3.1一維數(shù)組與指針例11.6數(shù)組元素賦值并輸出(指針變量-指針法)#include<stdio.h>intmain(){intiArr[5],i1;int*pi=iArr;for(i1=0;i1<5;i1++)*(pi+i1)=i1;for(i1=0;i1<5;i1++)printf("iArr[%d]=%d\n",i1,*(pi+i1));return0;}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/163311.3.1一維數(shù)組與指針例11.7數(shù)組元素賦值并輸出(指針變量-指針移動(dòng)法)#include<stdio.h>intmain(){intiArr[5],i1;int*pi=iArr;for(i1=0;i1<5;i1++){ *pi=i1; pi++;}
/*此時(shí),pi已經(jīng)指向iArr[4]之后,輸出數(shù)組元素,pi重新指回?cái)?shù)組頭部*/
pi=iArr;for(i1=0;i1<5;i1++){printf("iArr[%d]=%d\n",i1,*pi); pi++;}return0;}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/163411.3.1一維數(shù)組與指針例11.8數(shù)組元素賦值并輸出(指針變量關(guān)系運(yùn)算-指針法)#include<stdio.h>intmain(){intiArr[5],i1=0;int*pi=iArr;for(;pi<iArr+5;pi++,i1++) *pi=i1;
/*此時(shí),pi已經(jīng)指向iArr[4]之后,為下面輸出數(shù)組,必須讓pi重新指回?cái)?shù)組頭部*/pi=iArr;i1=0;for(;pi<iArr+5;pi++,i1++)printf("iArr[%d]=%d\n",i1,*pi);return0;}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/163511.3.2二維數(shù)組與指針1.理解二維數(shù)組
C語言對二維數(shù)組的存儲是行優(yōu)先方式的,對于整型二維數(shù)組iArr。intiArr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/163611.3.2二維數(shù)組與指針1.理解二維數(shù)組一個(gè)二維數(shù)組是以一維數(shù)組為元素構(gòu)造的一維數(shù)組,也就是二維數(shù)組可以看作一維數(shù)組,只不過該一維數(shù)組的每個(gè)元素又是一個(gè)一維數(shù)組。如iArr,把iArr當(dāng)作一維數(shù)組看待,iArr有3個(gè)元素,分別為iArr[0],iArr[1],iArr[2],每個(gè)元素是一個(gè)有4個(gè)整型元素構(gòu)成的一維數(shù)組。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/163711.3.2二維數(shù)組與指針1.理解二維數(shù)組iArr[i1]有兩層含義,它既是“一維數(shù)組iArr”的數(shù)組元素,又是一維數(shù)組名。iArr[1]是數(shù)組iArr的一個(gè)數(shù)組元素;同時(shí),iArr[1]是一個(gè)一維數(shù)組名,含有iArr[1][0],iArr[1][1],iArr[1][2],iArr[1][3]四個(gè)元素。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/163811.3.2二維數(shù)組與指針1.理解二維數(shù)組(對比一維)對于一維數(shù)組:intiArr1[4]={11,12,13,14};iArr1是一個(gè)其數(shù)組元素類型的常量地址,即int型的常量地址,則iArr1+1的值會跳過一個(gè)數(shù)組元素,即跳過4個(gè)字節(jié)(假定一個(gè)int,4個(gè)字節(jié))。對于當(dāng)作一維數(shù)組的“iArr”,iArr是一個(gè)其數(shù)組元素類型的常量地址,它的數(shù)組元素為iArr[i1](iArr[i1]為4個(gè)int類型的一維數(shù)組),所以iArr為大小為4的一維整型數(shù)組型的常量地址,則iArr+1的值會跳過一個(gè)數(shù)組元素,即跳過大小為4的一維整型數(shù)組(一行,16個(gè)字節(jié),假定一個(gè)int為4個(gè)字節(jié))。因此也把iArr稱為行地址。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/163911.3.2二維數(shù)組與指針1.理解二維數(shù)組(對比一維)在一維數(shù)組中iArr1中,iArr1[i1]等價(jià)于*(iArr1+i1),代表取出第i1個(gè)元素。在二維數(shù)組iArr中,iArr[i1]也等價(jià)于*(iArr+i1),iArr[i1]和*(iArr+i1)是一維數(shù)組的數(shù)組名和首地址。因?yàn)閕Arr[i1]和*(iArr+i1)為一維數(shù)組,為整數(shù)類型常量地址,所以iArr[i1]+1和*(iArr+i1)+1都會跳過一個(gè)整型數(shù)據(jù)(一列,4個(gè)字節(jié),假定一個(gè)int為4個(gè)字節(jié)),因此,也把iArr[i1]和*(iArr+i1)稱為列地址。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/164011.3.2二維數(shù)組與指針1.理解二維數(shù)組(對比一維)行地址(一維數(shù)組地址),一次跳過一行,如iArr、iArr+i1、&iArr[i1]、&*(iArr+i1);列地址(數(shù)據(jù)元素),一次跳過一列,如*iArr、*(iArr+i1)、iArr[i1]。*(*(iArr+1)+2):iArr+1一行指針,*(iArr+1)一列指針,*(iArr+1)+2一行二列地址,*(*(iArr+1)+2)一行二列地址間接訪問到iArr[1][2],值為7。
C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/164111.3.2二維數(shù)組與指針例11.9行列地址#include<stdio.h>intmain(){intiArr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
/*行地址*/printf("行地址\n");printf("iArr=%x,",iArr);printf("iArr+1=%x\n",iArr+1);printf("&iArr[0]=%x,",&iArr[0]);printf("&iArr[0]+1=%x\n",&iArr[0]+1);printf("&*(iArr+0)=%x,",&*(iArr+0));printf("&*(iArr+0)+1=%x\n",&*(iArr+0)+1);/*列地址*/printf("列地址\n");printf("*iArr=%x,",*iArr);printf("*iArr+1=%x\n",*iArr+1);printf("iArr[0]=%x,",iArr[0]);printf("iArr[0]+1=%x\n",iArr[0]+1);printf("*(iArr+0)=%x,",*(iArr+0));printf("*(iArr+0)+1=%x\n",*(iArr+0)+1);程序運(yùn)行結(jié)果:行地址iArr=12ff50,iArr+1=12ff60&iArr[0]=12ff50,&iArr[0]+1=12ff60&*(iArr+0)=12ff50,&*(iArr+0)+1=12ff60列地址*iArr=12ff50,*iArr+1=12ff54iArr[0]=12ff50,iArr[0]+1=12ff54*(iArr+0)=12ff50,*(iArr+0)+1=12ff54數(shù)據(jù)元素iArr[1][2]=7/*訪問元素*/printf("數(shù)據(jù)元素\n");printf("iArr[1][2]=%d\n",*(*(iArr+1)+2));return0;}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/164211.3.2二維數(shù)組與指針2.指向一維數(shù)組的指針對于一維數(shù)組intiArr1[4];可以把iArr賦值給指向int型的指針變量。如:int*pi1;pi1=iArr1;對于二維數(shù)組intiArr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};同樣可以把iArr賦值給指向一維數(shù)組的指針變量,因?yàn)槎S數(shù)組的可以看成以一維數(shù)組為成員的一維數(shù)組。int(*pia)[4];它表示pia是一個(gè)指針變量,它指向包含4個(gè)元素的一維數(shù)組。然后就可以賦值:pia=iArr;C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/164311.3.2二維數(shù)組與指針2.指向一維數(shù)組的指針pia指向第一個(gè)一維數(shù)組iArr[0],其值等于iArr。而pia+1則指向一維數(shù)組iArr[1]。從前面的行列地址分析可得出*(pia+iRow)+iCol是二維數(shù)組iRow行iCol列的元素的地址,而*(*(pia+iRow)+iCol)則是iRow行iCol列元素的值。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/164411.3.2二維數(shù)組與指針2.指向一維數(shù)組的指針指向一維數(shù)組的指針變量定義的一般形式為:
類型說明符(*指針變量名)[數(shù)組長度];其中“類型說明符”為所指數(shù)組的數(shù)組元素類型,“*”表示其后的變量是指針類型,“數(shù)組長度”表示所指向一維數(shù)組的長度。應(yīng)注意“(*指針變量名)”兩邊的括號不可少,如缺少括號則表示是指針數(shù)組(后面介紹),意義就完全不同了??梢赃@樣理解:先看小括號內(nèi),有*號是在定義指針變量;然后是中括號,表示指針變量指向該長度的一維數(shù)組;最后看類型說明符,表示該數(shù)組的每個(gè)元素為類型說明符說明的類型。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/164511.3.2二維數(shù)組與指針例11.10一個(gè)學(xué)習(xí)小組有5個(gè)人,每個(gè)人有3門課的考試成績。要求利用函數(shù)計(jì)算每門課程的平均成績?nèi)纾?趙 錢孫 李 張Math8061 59 85 76C 75 65 63 87 77English92 71 70 90 85問題分析:可定義一個(gè)二維數(shù)組score[3][5]存儲五個(gè)人3門課的成績。再定義一個(gè)一維數(shù)組courseAverage[3]存儲計(jì)算所得各門課平均成績。要完成的要接收一門課程(數(shù)組的一行)為參數(shù),所以應(yīng)該設(shè)指向一維數(shù)組的指針為參數(shù)。算法描述:1.依次輸入每門課程的成績(每門課一行)。2.計(jì)算每門課程平均成績,即對每行計(jì)算平均成績(函數(shù)完成)。3.輸出每門課程平均成績。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/164611.3.2二維數(shù)組與指針#include<stdio.h>intmain(){inti,j;floatsum;floatscore[3][5];/*存儲成績*/floatcourseAverage[3];/*存儲每門課程平均成績*/floataverage(float(*p)[5]);
/*輸入成績*/for(i=0;i<3;i++)/*行(每門課)循環(huán)*/for(j=0;j<5;j++)/*行內(nèi)每列循環(huán)*/scanf("%f",&score[i][j]);
/*輸出成績表*/for(i=0;i<3;i++)/*行(每門課)循環(huán)*/{for(j=0;j<5;j++)/*行內(nèi)每列循環(huán)*/printf("%f\t",score[i][j]);printf("\n");/*每行結(jié)束輸出一個(gè)換行*/}/*計(jì)算平均成績*/for(i=0;i<3;i++)/*行(每門課)循環(huán)*/courseAverage[i]=average(score+i);/*每行地址為參數(shù)*/
/*輸出成績表*/for(i=0;i<3;i++)printf("%f\t",courseAverage[i]);return0;}/*計(jì)算平均成績,參數(shù)為行地址(指向一維數(shù)組指針)*/floataverage(float(*p)[5]){inti;floatsum=0;for(i=0;i<5;i++)
/**p轉(zhuǎn)為列地址,(*p+i)偏移i,間接訪問*(*p+i)*/ sum+=*(*p+i);returnsum/5;}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/164711.3.3指針數(shù)組一個(gè)數(shù)組的元素值為指針,則該數(shù)組稱為指針數(shù)組。指針數(shù)組所有元素都必須是指向相同數(shù)據(jù)類型的指針。指針數(shù)組定義的一般形式為:
類型說明符*數(shù)組名[數(shù)組長度];可以這樣理解:先看“數(shù)組名[數(shù)組長度]”,表示定義一個(gè)該長度的一維數(shù)組;然后看“類型說明符*”,表示該數(shù)組的每個(gè)元素為指向該類型說明符類型的指針。例如:int*pa[3];表示pa是一個(gè)指針數(shù)組,它有三個(gè)數(shù)組元素,每個(gè)元素值都是一個(gè)指針,指向整型變量。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/164811.3.3指針數(shù)組例11.11通過指針數(shù)組訪問二維數(shù)組#include<stdio.h>intmain(){intiArr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};int*pa[3];/*指針數(shù)組,每個(gè)成員都是指向int型的指針*/intiRow;pa[0]=iArr[0];/*iArr[0]為一維數(shù)組名,為int型地址*/pa[1]=iArr[1];pa[2]=iArr[2];for(iRow=0;iRow<3;iRow++)printf("%d,%d,%d,%d\n",*pa[iRow],*(pa[iRow]+1),*(pa[iRow]+2),*(pa[iRow]+3));return0;}程序運(yùn)行結(jié)果:1,2,3,45,67,89,10,11,12C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/164911.3.3指針數(shù)組例11.11通過指針數(shù)組訪問二維數(shù)組C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/165011.3.4指向指針的指針對一維數(shù)組intiArr1[5];數(shù)組成員類型是int,一維數(shù)組名iArr1是指向int的指針常量,是指向其成員類型的指針常量。對于指針數(shù)組int*pa[3];數(shù)組成員類型是int*,一維數(shù)組名pa是指向int*的指針常量,同樣是指向其成員類型(指向整形的指針)的指針常量,也就是說pa是指向指向整型指針的指針。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/165111.3.4指向指針的指針指向指針的指針定義的一般形式為:類型說明符**變量名;可以這樣理解:先看“*變量名”,表示定義一個(gè)指針變量;然后看“類型說明符*”,表示該指針變量為指向“類型說明符*”類型的指針。charc1=’A’;char*pc;char**ppc;pc=&c1;ppc=&pc;c1、*pc、**ppc的值都為’A’;分別為直接訪問、間接訪問、二級間接訪問C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/165211.3.4指向指針的指針例11.12不移動(dòng)數(shù)據(jù),通過改變指針使得追加數(shù)據(jù)有序#include<stdio.h>intmain(){intiArr[5]={1,5,7,9};int*pa[5]={&iArr[0],&iArr[1],&iArr[2],&iArr[3],0};int**ppi,i1;
/*---輸出原來4個(gè)有序數(shù)據(jù)---*/printf("輸出原來4個(gè)有序數(shù)據(jù)\n");ppi=pa;/*ppi和pa同樣為指向整型的指針的指針*/for(i1=0;i1<4;i1++){printf("%d\n",**ppi);ppi++;}
/*---追加一個(gè)數(shù)據(jù),原來數(shù)據(jù)不動(dòng),調(diào)整指針數(shù)組,通過指針數(shù)組訪問仍然有序---*/iArr[4]=3;pa[1]=&iArr[4];pa[2]=&iArr[1];pa[3]=&iArr[2];pa[4]=&iArr[3];
/*---輸出追加1個(gè)之后的5個(gè)有序數(shù)據(jù)-*/ppi=pa;/*指針回到前面*/printf("輸出追加之后5個(gè)有序數(shù)據(jù)\n");for(i1=0;i1<5;i1++){printf("%d\n",**ppi); ppi++;}return0;}程序運(yùn)行結(jié)果:輸出原來4個(gè)有序數(shù)據(jù)1579輸出追加1個(gè)之后的5個(gè)有序數(shù)據(jù)13579C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/165311.3.4指向指針的指針C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程課堂練習(xí)1.指針類型作用?2指針與下標(biāo)?3.不用指針可以嗎?4.用指針方法實(shí)現(xiàn)一個(gè)一維數(shù)組的轉(zhuǎn)置。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/1654C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/165511.4.1指針作函數(shù)參數(shù)例11.13交換變量數(shù)據(jù)――交換形參指針變量#include<stdio.h>voids*pi1Copy,int*pi2Copy){int*piTemp;piTemp=pi1Copy;pi1Copy=pi2Copy;pi2Copy=piTemp;}intmain(){inti1=3,i2=4;int*pi1,*pi2;pi1=&i1;pi2=&i2;
s);printf("i1=%d\ni2=%d\n",i1,i2);return0;}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/165611.4.1指針作函數(shù)參數(shù)例11.13交換變量數(shù)據(jù)――交換形參指針變量C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/165711.4.1指針作函數(shù)參數(shù)例11.14交換形參指針變量所指向的變量#include<stdio.h>voids*pi1Copy,int*pi2Copy){intiTemp=0;
/*交換形參指針變量所指向的變量,實(shí)參不受影響,但是實(shí)參所指向數(shù)據(jù)改變了*/iTemp=*pi1Copy;
/*用的間接訪問,實(shí)際上是訪問i1、i2*/*pi1Copy=*pi2Copy;*pi2Copy=iTemp;}intmain(){inti1=3,i2=4;int*pi1,*pi2;pi1=&i1;pi2=&i2;
s);printf("i1=%d\ni2=%d\n",i1,i2);return0;}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/165811.4.1指針作函數(shù)參數(shù)例11.14交換形參指針變量所指向的變量C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/165911.4.1指針作函數(shù)參數(shù)例11.14交換形參指針變量所指向的變量若把swap函數(shù)改成下面的寫法:voids*pi1Copy,int*pi2Copy){int*ipTemp;
*ipTemp=*pi1Copy;/*ipTemp指向哪里?*/*pi1Copy=*pi2Copy;*pi2Copy=*ipTemp;}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/166011.4.2指針作函數(shù)參數(shù)例11.16對數(shù)組中的每個(gè)元素加1#include<stdio.h>intmain(){intiArr1[3]={2,5,3},iJ;voidadd(intiArr2[3]);
/*輸出數(shù)組*/for(iJ=0;iJ<=2;iJ++) printf("%d",iArr1[iJ]);printf("\n");add(iArr1);/*數(shù)組名作為實(shí)參,注意,只有數(shù)組名,沒有下標(biāo)*//*函數(shù)調(diào)用后,輸出數(shù)組*/for(iJ=0;iJ<=2;iJ++) printf("%d",iArr1[iJ]);printf("\n");return0;}voidadd(intiArr2[3]){intiI;for(iI=0;iI<=2;iI++) iArr2[iI]++;}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/166111.4.2數(shù)組名作函數(shù)參數(shù)指針變量地址,所以實(shí)參數(shù)組與形參數(shù)組可以用指針變量取代pi=iArr1;add(pi);/*指針變量作為實(shí)參*/voidadd(int*iArr2)/*指針變量作形參*/還可以實(shí)參用數(shù)組名,形參用變量名,如:add(iArr1);/*數(shù)組名作為實(shí)參*/voidadd(int*iArr2)/*指針變量作形參*/也可以用指針變量作實(shí)參,數(shù)組名作為形參,如:pi=iArr1;add(pi);/*指針變量作為實(shí)參*/voidadd(intiArr2[3])/*數(shù)組名作為形參*/C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/166211.4.2數(shù)組名作函數(shù)參數(shù)歸納起來,如果有一個(gè)實(shí)參數(shù)組,想在函數(shù)中改變此數(shù)組的元素的值,實(shí)參與形參的對應(yīng)關(guān)系有以下4種:(1)形參和實(shí)參都是數(shù)組名。(2)實(shí)參用數(shù)組,形參用指針變量。(3)實(shí)參、形參都用指針變量。(4)實(shí)參為指針變量,形參為數(shù)組名。通常情況下,為了能夠讓函數(shù)處理不同長度的數(shù)組,可以在參數(shù)中增加一處理數(shù)據(jù)長度的形參變量。還有函數(shù)的返回值只有一個(gè),若需要函數(shù)返回多個(gè)同類型結(jié)果數(shù)據(jù),也可以利用數(shù)組作函數(shù)參數(shù),見例11.20。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/166311.4.2數(shù)組名作函數(shù)參數(shù)歸納起來,如果有一個(gè)實(shí)參數(shù)組,想在函數(shù)中改變此數(shù)組的元素的值,實(shí)參與形參的對應(yīng)關(guān)系有以下4種:(1)形參和實(shí)參都是數(shù)組名。(2)實(shí)參用數(shù)組,形參用指針變量。(3)實(shí)參、形參都用指針變量。(4)實(shí)參為指針變量,形參為數(shù)組名。通常情況下,為了能夠讓函數(shù)處理不同長度的數(shù)組,可以在參數(shù)中增加一處理數(shù)據(jù)長度的形參變量。還有函數(shù)的返回值只有一個(gè),若需要函數(shù)返回多個(gè)同類型結(jié)果數(shù)據(jù),也可以利用數(shù)組作函數(shù)參數(shù),見例11.20。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/166411.4.2指針作函數(shù)參數(shù)例11.20把給定整數(shù)數(shù)組中能被3整除的數(shù)據(jù)挑出來#include<stdio.h>intselect(int*piSourceCopy,intiN,int*piTargetCopy){inti1,iNum=0;for(i1=0;i1<iN;i1++)if(piSourceCopy[i1]%3==0) piTargetCopy[iNum++]=piSourceCopy[i1];returniNum;}intmain(){intiArrSource[10]={5,15,25,36,47,58,69,78,56,90};intiArrTarget[10];/*存放結(jié)果*/
inti1,iNum=0;
iNum=select(iArrSource,10,iArrTarget);for(i1=0;i1<iNum;i1++) printf("%d",iArrTarget[i1]);return0;}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/166511.4.3返回指針值的函數(shù)在C語言中允許一個(gè)函數(shù)的返回值是一個(gè)指針(即地址),這種返回指針值的函數(shù)稱為指針型函數(shù)。定義指針型函數(shù)的一般形式為:類型說明符*函數(shù)名(形參表){……/*函數(shù)體*/}把“類型說明符*”放在一起理解,則表示函數(shù)的返回值為指向“類型說明符”類型的指針。例如:
int*f(intx,inty){....../*函數(shù)體*/}表示f是一個(gè)返回指針值的函數(shù),它返回指向一個(gè)整型變量的指針。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/166611.4.3返回指針值的函數(shù)例11.18在給定整數(shù)數(shù)組中選出最大整數(shù)并返回其地址#include<stdio.h>int*max(int*piSourceCopy,intiN)/*返回指針*/{inti1;int*pi1=&piSourceCopy[0];/*記載最大元素地址*/for(i1=1;i1<iN;i1++)if(piSourceCopy[i1]>*pi1) pi1=&piSourceCopy[i1];returnpi1;}intmain(){intiArrSource[10]={5,15,25,36,47,58,69,78,56,90};int*pi;/*接收最大元素地址*/pi=max(iArrSource,10);printf("%d",*pi);return0;}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/166711.4.3返回指針值的函數(shù)例11.19指向已經(jīng)釋放數(shù)據(jù)空間#include<stdio.h>char*lost(){charc1='A';return&c1;}intmain(){char*pc;pc=lost();printf("%c",*pc);return0;}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/166811.4.4指向函數(shù)的指針在C語言中,一個(gè)函數(shù)總是占用一段連續(xù)的內(nèi)存區(qū),而函數(shù)名就是該函數(shù)所占內(nèi)存區(qū)的首地址。我們可以把函數(shù)的這個(gè)首地址(或稱入口地址)賦予一個(gè)指針變量,使該指針變量指向該函數(shù)。然后通過指針變量就可以找到并調(diào)用這個(gè)函數(shù)。我們把這種指向函數(shù)的指針變量稱為“函數(shù)指針變量”。函數(shù)指針變量定義的一般形式為:
類型說明符(*指針變量名)(參數(shù)表);
首先“(*指針變量名)”,說明是在定義指針變量;其次“(參數(shù)表)”,說明指針指向函數(shù);最后“類型說明符”,表示被指函數(shù)的返回值的類型。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/166911.4.4指向函數(shù)的指針例11.20計(jì)算兩個(gè)整數(shù)最大值--通過函數(shù)指針調(diào)用函數(shù)#include<stdio.h>intmax(inti1,inti2){if(i1>i2) returni1;else returni2;}intmain(){int(*pf)(int,int);/*定義函數(shù)指針*/inti1,i2,i3;pf=max;/*函數(shù)名賦值給函數(shù)指針變量*/printf("inputtwonumbers:\n");scanf("%d%d",&i1,&i2);i3=(*pf)(i1,i2);/*通過函數(shù)指針調(diào)用函數(shù)*/printf("maxmum=%d",i3);return0;}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/167011.4.4指向函數(shù)的指針函數(shù)指針變量形式調(diào)用函數(shù)的步驟如下:(1)先定義函數(shù)指針變量:int(*pf)(int,int);(2)把被調(diào)函數(shù)的入口地址(函數(shù)名)賦予該函數(shù)指針變量:pf=max;(3)用函數(shù)指針變量形式調(diào)用函數(shù):i3=(*pf)(i1,i2);使用函數(shù)指針變量還應(yīng)注意以下兩點(diǎn):(1)函數(shù)指針變量不能進(jìn)行算術(shù)運(yùn)算,這是與數(shù)組指針變量不同的。(2)函數(shù)調(diào)用中"(*指針變量名)"的兩邊的括號不可少。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程課堂練習(xí)一個(gè)學(xué)習(xí)小組有10個(gè)人,每個(gè)人學(xué)習(xí)3門課程,用10行3列浮點(diǎn)型數(shù)組存儲。編寫函數(shù)計(jì)算每個(gè)人的總成績,參數(shù)為flaot(*p)[3]類型。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/1671C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/167211.5字符串字符串常量是由一對雙引號括起的字符序列。例如:"CLanguage"、"student"、"123"等都是合法的字符串常量。字符串常量和字符常量是不同的。它們主要區(qū)別:(1)字符常量由單引號括起來,字符串常量由雙引號括起來。(2)字符常量只能是單個(gè)字符,字符串常量則可以含零個(gè)或多個(gè)字符。(3)可以把一個(gè)字符常量賦予一個(gè)字符變量,但不能把一個(gè)字符串常量賦予一個(gè)字符變量。在C語言中沒有相應(yīng)的字符串變量,但是可以用一個(gè)字符數(shù)組來存放一個(gè)字符串常量。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/167311.5字符串(4)字符常量占一個(gè)字節(jié)的內(nèi)存空間。字符串不像其他其它數(shù)據(jù)類型具有固定的長度,不同字符串是不等長的,因此,字符串的存儲不光需要存儲其起始位置,還應(yīng)該記載其結(jié)束位置。字符串常量占的內(nèi)存字節(jié)數(shù)等于字符串中字節(jié)數(shù)加1,增加的一個(gè)字節(jié)中存放字符'\0'(ASCII碼為0),這是字符串結(jié)束的標(biāo)志。例如:字符串“CLanguage”在內(nèi)存中所占的字節(jié)(11)C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/167411.5.1字符數(shù)組與字符串
在C語言中沒有專門的字符串變量,通常用一個(gè)字符數(shù)組來存放一個(gè)字符串。字符串是以'\0'作為串的結(jié)束符。因此當(dāng)把一個(gè)字符串存入一個(gè)數(shù)組時(shí),也把結(jié)束符'\0'存入數(shù)組,并以此作為該字符串是否結(jié)束的標(biāo)志。有了'\0'標(biāo)志后,就不必再用字符數(shù)組的長度來判斷字符串的長度了。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/167511.5.1字符數(shù)組與字符串C語言允許用字符串的方式對數(shù)組作初始化賦值,但是,與用字符初始化是有區(qū)別的。charcArr[]={'C','','l','a','n','g','u','a','g','e'};數(shù)組cArr大小為10??蓪懤米址跏蓟癁椋篶harcArr[]={"CLanguage"};或去掉{}寫為:charcArr[]="CLanguage";數(shù)組cArr大小為11。用字符串方式賦值比用字符逐個(gè)賦值要多占一個(gè)字節(jié),用于存放字符串結(jié)束標(biāo)志'\0'。'\0'是由C編譯系統(tǒng)自動(dòng)加上的。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/167611.5.1字符數(shù)組與字符串對于字符數(shù)組可以有兩種使用方式:(1)當(dāng)作單個(gè)字符看待,如cArr[0]、Arr[1]……;(2)當(dāng)作字符串看待,全體合在一起,代表一個(gè)含義,使用數(shù)組名。可以使用printf函數(shù)和scanf函數(shù)一次性輸出輸入一個(gè)字符數(shù)組中的字符串,而不必使用循環(huán)語句逐個(gè)地輸入輸出每個(gè)字符。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/167711.5.1字符數(shù)組與字符串例11.21兩種方式輸出字符數(shù)組#include<stdio.h>intmain(){charcArr[11]="CLanguage";/*用字符串初始化*/inti1;
/*按字符方式輸出*/for(i1=0;i1<10;i1++)printf("%c",cArr[i1]);
/*按字符串方式輸出*/printf("\n%s",cArr);/*%s輸出字符串,直接使用數(shù)組名*/return0;}若改為charcArr[]={'C','','l','a','n','g','u','a','g','e'};C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/167811.5.1字符數(shù)組與字符串例11.22兩種方式輸入字符數(shù)組#include<stdio.h>intmain(){charcArr1[11];charcArr2[11];inti1;
/*按字符方式輸入*/for(i1=0;i1<10;i1++)scanf("%c",&cArr1[i1]);
/*按字符串方式輸入*/scanf("%s",cArr2);/*%s輸入字符串,直接使用數(shù)組名*/return0;}(1)由于定義數(shù)組長度為11,因此輸入的字符串長度必須小于11,以留出一個(gè)字節(jié)用于存放字符串結(jié)束標(biāo)志'\0';(2)scanf的各輸入項(xiàng)必須以地址方式出現(xiàn),而數(shù)組名恰好是數(shù)組空間的首地址,所以數(shù)組名前不能用&符號;(3)當(dāng)用scanf函數(shù)輸入字符串時(shí),字符串中不能含有空格,否則將以空格作為串的結(jié)束符。
C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/167911.5.2字符串與指針在C語言中,可以用字符數(shù)組存放一個(gè)字符串。如:charcArr[]="CLanguage";cArr是數(shù)組名,它代表字符指向字符型的常量指針,所以,字符數(shù)組名就可以賦值給指向字符型的指針變量。如:char*pc;pc=cArr;C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/168011.5.2字符串與指針例11.23通過指針變量訪問字符數(shù)組#include<stdio.h>intmain(){charcArr[11]="CLanguage";/*用字符串初始化*/inti1;char*pc;pc=cArr;printf("按字符方式輸出,下標(biāo)方式:\n");for(i1=0;i1<10;i1++)printf("%c",pc[i1]);printf("\n按字符方式輸出,間接訪問方式:\n");for(i1=0;i1<10;i1++,pc++)printf("%c",*pc);printf("\n按字符串方式輸出,每次起始位置后移:\n");pc=cArr;/*因?yàn)橹皃c已經(jīng)移動(dòng)*/for(i1=0;i1<10;i1++,pc++)printf("%s\n",pc);/*%s輸出字符串,使用指針變量,每次指針后移*/return0;}程序運(yùn)行結(jié)果:按字符方式輸出,下標(biāo)方式:CLanguage按字符方式輸出,間接訪問方式:CLanguage按字符串方式輸出,每次起始位置后移:CLanguageLanguageLanguageanguagenguageguageuageagegeeC程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/168111.5.2字符串與指針字符型指針變量還可以指向字符串常量。如:char*pc="CLanguage";表示pc是一個(gè)指向字符型的指針變量,把字符串的首地址賦予pc。還可以寫為:char*pc;pc="CLanguage";需要注意的是,字符型指針變量本身是一個(gè)變量,用于存放字符串的首地址。而字符串常量本身是存放在以該首地址為首的一塊連續(xù)的內(nèi)存空間中并以'\0'作為串的結(jié)束,字符串常量本身本身使不能被更改的。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/168211.5.2字符串與指針對字符串存儲,有用字符型指針變量指向字符串常量和按照字符數(shù)組存儲兩種方式,注意這兩種方式的差異:(1)字符型指針變量指向字符串常量方式:char*pc="CLanguage";讀取其中字符是允許的:charc1=pc[3];/*允許*/因?yàn)橹赶虻氖亲址A?,所以,寫入是不允許的:pc[3]='A';/*不允許*/更改字符型指針變量也是允許的:pc="BASIC";/*允許*/pc不再指向字符串常量"CLanguage",而是指向字符串常量"BASIC"。(2)字符數(shù)組方式:charcArr[11]="CLanguage";讀寫其中字符都是允許的:cahrc1=cArr[3];cArr[3]='A';/*都允許*/數(shù)組名是不允許更改的:cArr="BASIC";/*不允許*/C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/168311.5.2字符串與指針C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/168411.5.3字符串函數(shù)
程序開發(fā)過程中經(jīng)常涉及到字符串操作,尤其是管理性程序,如學(xué)生管理系統(tǒng)中的學(xué)號、銀行業(yè)務(wù)中帳號等。C語言提供了豐富的字符串處理函數(shù),大致可分為字符串的輸入、輸出、合并、修改、比較、轉(zhuǎn)換、復(fù)制、搜索幾類。使用這些函數(shù)可大大減輕編程的負(fù)擔(dān)。用于輸入輸出的字符串函數(shù),在使用前應(yīng)包含頭文件"stdio.h",使用其它字符串函數(shù)則應(yīng)包含頭文件"string.h"。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/168511.5.3字符串函數(shù)1.字符串輸出函數(shù)puts規(guī)格說明:intputs(constchar*pc);功能描述:把字符指針指定的字符串輸出到標(biāo)準(zhǔn)輸出流中,空字符不輸出,但是輸出一個(gè)換行符。函數(shù)參數(shù):pc可以使指針變量,也可以是字符數(shù)組名。函數(shù)返回值:若出現(xiàn)寫錯(cuò)誤,則返回EOF(-1),否則返回非負(fù)數(shù)。例如:char*pc="CLanguage";puts(pc);puts函數(shù)完全可以由printf函數(shù)取代。當(dāng)需要按一定格式輸出時(shí),通常使用printf函數(shù)。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/168611.5.3字符串函數(shù)2.字符串輸入函數(shù)gets規(guī)格說明:char*gets(char*pc);功能描述:從標(biāo)準(zhǔn)輸入流讀字符到字符指針指定的字符數(shù)組中,直到遇到換行符或輸入文檔結(jié)束符,并且丟棄換行符或結(jié)束符,然后在字符數(shù)組中添加一個(gè)空字符。函數(shù)參數(shù):pc必須是字符數(shù)組名或指向字符數(shù)組的指針變量。不可以使用指針變量指向字符串常量,因?yàn)槌A靠臻g不允許改變。例如:char*pc="CLanguage";gets(pc);內(nèi)存寫錯(cuò)誤,試圖向常量空間寫入字符。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/168711.5.3字符串函數(shù)2.字符串輸入函數(shù)gets規(guī)格說明:char*gets(char*pc);函數(shù)返回值:若成功,返回pc1;若直接遇見換行符或結(jié)束符,pc所指數(shù)組不變,返回空指針;若讀入長度超出數(shù)組長度,數(shù)組改變,會出現(xiàn)內(nèi)存寫問題(超出數(shù)組長度)。例如:charcArr[11];gets(cArr);/*或char*pc=cArr;gets(pc);也可以*/輸入大于等于一個(gè)字符小于等于十個(gè)字符時(shí),正常;直接輸入換行符,pc數(shù)組不變,返回空指針;輸入超過十個(gè)字符,會出現(xiàn)內(nèi)存寫問題(超出數(shù)組長度)。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/168811.5.3字符串函數(shù)2.字符串輸入函數(shù)gets規(guī)格說明:char*gets(char*pc);例11.24#include<stdio.h>intmain(){charcArr[15];printf("inputstring:\n");gets(cArr);printf("outputstring:\n");puts(cArr);return0;}inputstring:CLanguageoutputstring:CLanguage
當(dāng)輸入的字符串中含有空格時(shí),輸出仍為全部字符串。說明gets函數(shù)并不以空格作為字符串輸入結(jié)束的標(biāo)志,而只以換行作為輸入結(jié)束,這是與scanf函數(shù)的不同。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/168911.5.3字符串函數(shù)3.測字符串長度函數(shù)strlen規(guī)格說明:intstrlen(constchar*pc);功能描述:計(jì)算pc所指向的串的長度。函數(shù)參數(shù):pc可以使指針變量,也可以是字符數(shù)組名。函數(shù)返回值:返回p1指向數(shù)組長度,空字符之前的字符個(gè)數(shù)。例如:charcArr={'I','','l','o','v','e','\0','C','','L','a','n','g','u','a','g','e','\0'};strlen(cArr)的值為6,以碰到第一個(gè)空字符的長度為準(zhǔn),也就是說cArr當(dāng)作字符串看時(shí),只包括"Ilove"。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/10/169011.5.3字符串函數(shù)4.字符串連接函數(shù)strcat規(guī)格說明:char*strcat(char*pc1,constchar*pc2);功能描述:把字符指針pc1所指向的字符數(shù)組的末尾添加pc2所指向的串(包括結(jié)尾的空字符在內(nèi))的副本,pc2所指向的串的第一個(gè)字符覆蓋pc1
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 技術(shù)保密合同
- 承包人合同范本(2篇)
- 2025年度高品質(zhì)內(nèi)墻抹灰裝飾工程承包合同4篇
- 2025版內(nèi)蒙古生態(tài)環(huán)保產(chǎn)業(yè)投資合同范本4篇
- 二零二五年度農(nóng)產(chǎn)品質(zhì)量檢測與追溯服務(wù)合同4篇
- 2025版牛羊肉冷鏈物流配送服務(wù)合同4篇
- 二零二五年度回遷房買賣合同標(biāo)準(zhǔn)樣本(產(chǎn)權(quán)互換版)2篇
- 二零二五年度木工班組承包節(jié)能減排合同范本3篇
- 二零二五年度農(nóng)業(yè)廢棄物回收與資源化利用合作合同4篇
- 2025年度個(gè)人設(shè)備租賃融資借款合同樣本4篇
- 2025年度公務(wù)車輛私人使用管理與責(zé)任協(xié)議書3篇
- 經(jīng)濟(jì)學(xué)基礎(chǔ)試題及答案 (二)
- 售后工程師述職報(bào)告
- 綠化養(yǎng)護(hù)難點(diǎn)要點(diǎn)分析及技術(shù)措施
- 2024年河北省高考?xì)v史試卷(含答案解析)
- 車位款抵扣工程款合同
- 小學(xué)六年級數(shù)學(xué)奧數(shù)題100題附答案(完整版)
- 高中綜評項(xiàng)目活動(dòng)設(shè)計(jì)范文
- 英漢互譯單詞練習(xí)打印紙
- 2023湖北武漢華中科技大學(xué)招聘實(shí)驗(yàn)技術(shù)人員24人筆試參考題庫(共500題)答案詳解版
- 一氯二氟甲烷安全技術(shù)說明書MSDS
評論
0/150
提交評論