




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第7章指針蘇小紅
sxh@C語言大學(xué)實(shí)用教程1第7章指針蘇小紅
sxh@C語言大學(xué)實(shí)內(nèi)容提要指針的概念;難點(diǎn):對指針數(shù)據(jù)類型的理解數(shù)組的下標(biāo)法引用和指針法引用;難點(diǎn):二維數(shù)組的地址和指針概念利用字符指針存取字符串;難點(diǎn):字符數(shù)組和字符指針的區(qū)別與聯(lián)系指針數(shù)組應(yīng)用;難點(diǎn):指向數(shù)組的指針與指針數(shù)組的區(qū)別帶參數(shù)的main函數(shù);動態(tài)內(nèi)存分配函數(shù)及其應(yīng)用;難點(diǎn):一維、二維動態(tài)數(shù)組的實(shí)現(xiàn)動態(tài)數(shù)據(jù)結(jié)構(gòu)(在第8章介紹)內(nèi)容提要指針的概念;為什么引入指針的概念指針為函數(shù)提供修改變量值的手段
指針為C的動態(tài)內(nèi)存分配系統(tǒng)提供支持
指針為動態(tài)數(shù)據(jù)結(jié)構(gòu)(如例鏈表、隊(duì)列、二叉樹等)提供支持
指針可以改善某些子程序的效率
為什么引入指針的概念指針為函數(shù)提供修改變量值的手段計(jì)算機(jī)內(nèi)的存儲部件,所有指令和數(shù)據(jù)都保存在內(nèi)存內(nèi)速度快,但是掉電即失可以隨機(jī)訪問只要指名要訪問的內(nèi)存單元的地址,就可以立即訪問到該單元地址是一個(gè)無符號整數(shù),其字長一般與主機(jī)相同內(nèi)存中的每個(gè)字節(jié)都有唯一的一個(gè)地址地址按字節(jié)編號,按類型分配空間內(nèi)存(RandomAccessMemory)
地址(Address)計(jì)算機(jī)內(nèi)的存儲部件,所有指令和數(shù)據(jù)都保存在內(nèi)存內(nèi)內(nèi)存(Ran尋址方式如何讀寫內(nèi)存中的數(shù)據(jù)?通過變量的地址訪問變量所在的存儲單元兩種尋址方式直接(尋址)訪問直接按變量地址來存取變量內(nèi)容的訪問方式間接(尋址)訪問通過指針變量來間接存取它所指向的變量的訪問方式尋址方式如何讀寫內(nèi)存中的數(shù)據(jù)?關(guān)于指針的原則學(xué)習(xí)原則一定要學(xué)會其實(shí)通常的應(yīng)用很簡單與使用變量幾乎無異使用原則永遠(yuǎn)要清楚每個(gè)指針指向了哪里永遠(yuǎn)要清楚指針指向的位置是什么關(guān)于指針的原則學(xué)習(xí)原則指針(Pointer)的概念指針也是一種數(shù)據(jù)類型指針變量具有指針類型的變量,專門存放地址數(shù)據(jù)的變量
變量的指針變量的地址指針(Pointer)的概念指針也是一種數(shù)據(jù)類型如何定義指針變量?定義指針變量int*p;定義了一個(gè)指針變量p,簡稱指針pp是變量,int*是類型p里保存一個(gè)地址。此時(shí)這個(gè)地址是哪呢(p指向哪呢)?指針變量初始化p=&a;*p就像普通的變量一樣使用,其值是p指向的內(nèi)存的內(nèi)容(在上例和a等價(jià),但尋址方式不同)p可以動態(tài)(任意)地指向不同內(nèi)存,從而使*p代表不同的變量如何定義指針變量?定義指針變量inti,*p;p=&i;
int*p;float*q;p=q;inti;float*p;p=&i;int*p;p=100;判斷是真?是假?指針變量只存放地址!一個(gè)指針變量不能指向與其類型不同的變量!我是真的,你猜對了嗎?應(yīng)在類型相同的指針變量之間賦值inti,*p;int*p;inti;int*p;&與*操作符&用來取變量的地址inti,*p;
p=&i;int*p,a[10];
p=a;int*p,a[10];
p=&a[0];int*p,a[10];
p=&a[5];*用來取指針指向地址的內(nèi)容inti,*p;
p=&i;
*p=0;int*p,a[10];
p=a;
*p=0;int*p,a[10];
p=&a[0];
*p=0;int*p,a[10];
p=&a[5];
*p=0;&與*操作符&用來取變量的地址*用來取指針指向地址的內(nèi)容指針的指向指針指向非其定義時(shí)聲明的數(shù)據(jù)類型,將引起warningvoid*類型的指針可以指向任意類型的變量指針在初始化時(shí)一般int*p=NULL;NULL表示空指針,即無效指針但它只是邏輯上無效,并不是真正地?zé)o效如果指針指向一個(gè)非你控制的內(nèi)存空間,并對該空間進(jìn)行訪問,將可能造成危險(xiǎn)指針的指向指針指向非其定義時(shí)聲明的數(shù)據(jù)類型,將引起warni指針變量與其它類型變量的對比共性在內(nèi)存中占據(jù)一定大小的存儲單元先定義,后使用特殊性
它的內(nèi)容只能是地址,而不能是數(shù)據(jù)必須初始化后才能使用,否則指向不確定的存儲單元只能指向同一基類型的變量可參與的運(yùn)算:加、減一個(gè)整數(shù),自增、自減、關(guān)系、賦值指針變量與其它類型變量的對比共性指針運(yùn)算(1/4)算術(shù)運(yùn)算int*p,a[10];p=a;p++;/*p的值增加多少?*/指針的加減運(yùn)算是以其指向的類型的字長為單位的6000600160026003600460056006p-1pp+1指針運(yùn)算(1/4)算術(shù)運(yùn)算6000p-1pp+1指針運(yùn)算(2/4)int*p,*q,a[10];
p=a;
q=&a[5];q-pq=p+3;指針運(yùn)算不能亂算一般只進(jìn)行指針和整數(shù)的加減運(yùn)算,同類型指針之間的減法運(yùn)算其它運(yùn)算,比如乘法、除法、浮點(diǎn)運(yùn)算、指針之間的加法等,并無意義,所以也不支持指針運(yùn)算(2/4)int*p,*q,a[10];
p指針運(yùn)算(3/4)關(guān)系運(yùn)算只有指向同一種數(shù)據(jù)類型的兩個(gè)指針才能進(jìn)行關(guān)系運(yùn)算。值為1或0p>qp<qp==q指針不與非指針量進(jìn)行比較,但可與NULL(即0值)進(jìn)行等或不等的關(guān)系運(yùn)算判斷p是否為空指針P==NULLp!=NULL指針運(yùn)算(3/4)關(guān)系運(yùn)算指針運(yùn)算(4/4)賦值運(yùn)算指針在使用前一定要賦值為指針變量賦的值必須是一個(gè)地址main(){
int*p; scanf("%d",p);…}main(){
inta,*p=&a;scanf("%d",p);…}錯!指針運(yùn)算(4/4)賦值運(yùn)算main()main()錯!指針與函數(shù)指針既然是數(shù)據(jù)類型,自然可以做函數(shù)的參數(shù)和返回值的類型指針做參數(shù)的經(jīng)典例子:兩數(shù)的互換指針與函數(shù)指針既然是數(shù)據(jù)類型,自然可以做函數(shù)的參數(shù)和返回值的voidSwap(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;}main(){inta,b;a=15;b=8;Swap(&a,&b);printf("a=%d,b=%d",a,b);}
voidSwap(intx,inty){inttemp;temp=x;x=y;y=temp;}main(){inta,b;a=15;b=8;Swap(a,b);printf("a=%d,b=%d",a,b);}程序1程序2例7.2:編寫函數(shù)實(shí)現(xiàn)兩數(shù)的互換主調(diào)函數(shù)被調(diào)函數(shù)實(shí)參形參結(jié)果有何不同?NotWork!Why?main()main()程序1程序2例7.2:編寫函主調(diào)函數(shù)被調(diào)函數(shù)main(){inta,b;a=15;b=8;Swap(a,b);printf("a=%d,b=%d",a,b);}voidSwap(intx,inty){inttemp;temp=x;x=y;y=temp;}1515ab實(shí)參形參88xyab程序1xy主調(diào)函數(shù)被調(diào)函數(shù)main()voidSwap(intx,簡單變量作函數(shù)參數(shù)圖7-3Swap函數(shù)調(diào)用前后參數(shù)變化的示意圖1581581581515881581515a)調(diào)用Swap函數(shù)(b)執(zhí)行Swap函數(shù)c)從Swap函數(shù)返回tempxy
bmain函數(shù)Swap函數(shù)①②③aaatemptempxxy
ybb簡單變量作函數(shù)參數(shù)圖7-3Swap函數(shù)調(diào)用前后參數(shù)變化的主調(diào)函數(shù)被調(diào)函數(shù)main(){inta,b;a=15;b=8;Swap(&a,&b);printf("a=%d,b=%d",a,b);}voidSwap(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;}&a&a實(shí)參形參&b&bxyab程序2xy15ab8主調(diào)函數(shù)被調(diào)函數(shù)main()voidSwap(int*x指針變量作函數(shù)參數(shù)圖7-5用指針變量作函數(shù)參數(shù)實(shí)現(xiàn)兩數(shù)互換函數(shù)的示意圖158815&a&b&a&b15(a)調(diào)用Swap函數(shù)
(b)執(zhí)行Swap函數(shù)
a
a
b
b
*x
*x
*y
*y
y
y
x
x
&a
&b
main函數(shù)
Swap函數(shù)temptemp②①③指針變量作函數(shù)參數(shù)圖7-5用指針變量作函數(shù)參數(shù)實(shí)現(xiàn)兩數(shù)互換swap函數(shù)的幾種錯誤形式(1/3)參數(shù)單向傳遞voidSwap(intx,inty){
inttemp;temp=x;/*x,y為內(nèi)部變量*/x=y;y=temp;}swap函數(shù)的幾種錯誤形式(1/3)參數(shù)單向傳遞swap函數(shù)的幾種錯誤形式(2/3)參數(shù)單向傳遞voidSwap(int*p1,int*p2){
int*p;p=p1;/*p1,p2為內(nèi)部變量*/p1=p2;p2=p;}swap函數(shù)的幾種錯誤形式(2/3)參數(shù)單向傳遞swap函數(shù)的幾種錯誤形式(3/3)指針p沒有確切地址voidSwap(int*p1,int*p2){
int*p;/*指針p未初始化*/*p=*p1;*p1=*p2;*p2=*p;}swap函數(shù)的幾種錯誤形式(3/3)指針p沒有確切地址例7.3:打印出最高分及其學(xué)號voidFindMax(floatscore[],longnum[],intn,float*pMaxScore,long*pMaxNum){
inti; *pMaxScore=score[0]; *pMaxNum=num[0];
for(i=1;i<n;i++) {
if(score[i]>*pMaxScore) { *pMaxScore=score[i]; *pMaxNum=num[i]; } }}例7.3:打印出最高分及其學(xué)號voidFindMax例7.4:日期轉(zhuǎn)換問題任意給定某年某月某日,打印出它是這一年的第幾天已知某一年的第幾天,計(jì)算它是該年的第幾月第幾日
static
intdayTab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}};
例7.4:日期轉(zhuǎn)換問題任意給定某年某月某日,打印出它是這計(jì)算某年某月某日是這一年的第幾天/*函數(shù)功能:對給定的某年某月某日,計(jì)算出它是這一年的第幾天函數(shù)參數(shù):整型變量year、month、day,分別代表年、月、日函數(shù)返回值:這一年的第幾天*/intDayofYear(intyear,intmonth,intday){
inti,leap;
/*若year為閏年,則leap值為1,就用第2行元素dayTab[1][i]計(jì)算,
否則leap值為0,用第1行dayTab[0][i]計(jì)算*/ leap=((year%4==0)&&(year%100!=0))||(year%400==0);
for(i=1;i<month;i++) { day=day+dayTab[leap][i]; }
returnday;/*返回計(jì)算出的day的值*/}計(jì)算某年某月某日是這一年的第幾天/*函數(shù)功能:對給定的某年某計(jì)算某年的第幾天是該年的第幾月第幾日/*函數(shù)功能:對給定的某一年的第幾天,計(jì)算它是這一年的第幾月第幾日函數(shù)入口參數(shù):整型變量year,存儲年整型變量yearDay,存儲這一年的第幾天函數(shù)出口參數(shù):整型指針pMonth,指向存儲這一年第幾月的整型變量整型指針pDay,指向存儲第幾日的整型變量函數(shù)返回值:無*/voidMonthDay(intyear,intyearDay,int*pMonth,int*pDay){
inti,leap; leap=((year%4==0)&&(year%100!=0))||(year%400==0);
for(i=1;yearDay>dayTab[leap][i];i++) { yearDay=yearDay-dayTab[leap][i]; } *pMonth=i;/*將計(jì)算出的月份值賦值給pMonth所指向的變量*/ *pDay=yearDay;/*將計(jì)算出的日號賦值給pDay所指向的變量*/}計(jì)算某年的第幾天是該年的第幾月第幾日/*函數(shù)功能:對字符串(String)
與字符數(shù)組、字符指針字符串一串以'\0'結(jié)尾的字符在C語言中被看作字符串用雙引號括起的一串字符是字符串常量,C語言自動為其添加'\0'終結(jié)符C語言并沒有為字符串提供任何專門的表示法,完全使用字符數(shù)組和字符指針來處理字符數(shù)組每個(gè)元素都是字符類型的數(shù)組charstring[100];字符指針指向字符類型的指針char*p;數(shù)組和指針可以等同看待,上面三者本質(zhì)上是一回事字符串(String)
與字符數(shù)組、字符指針字符串字符指針變量與字符數(shù)組的區(qū)別定義方法不同
charstr[10];
char*ptr;賦值方法和含義不同
charstr[10];ptr=”china”;/*錯誤*/strcpy(str,”china”);/*正確*/
char*ptr;ptr=”china”;字符指針變量與字符數(shù)組的區(qū)別定義方法不同字符指針變量與字符數(shù)組的區(qū)別在定義一個(gè)數(shù)組時(shí),在編譯時(shí)即分配單元,有確定地址,而定義一個(gè)字符指針變量時(shí),如未對它賦初值,則其所指數(shù)據(jù)是不定的,因而使用是危險(xiǎn)的。例如,輸入字符串時(shí)charstr[10];scanf("%s",str);/*正確*/char*a;scanf("%s",a);/*錯誤*/
應(yīng)為:
char*a;
charstr[10];a=str;
scanf("%s",a);/*正確*/字符指針變量與字符數(shù)組的區(qū)別在定義一個(gè)數(shù)組時(shí),在編譯時(shí)即分配字符指針變量與字符數(shù)組的區(qū)別初始化含義不同
char*pstr=”china”;等價(jià)于
char*pstr;pstr=”china”;
charstr[14]=”china”;不等價(jià)于
charstr[14];str[]=”china”;字符指針是變量,而數(shù)組名是地址常量字符指針變量與字符數(shù)組的區(qū)別初始化含義不同例7.5:字符串拷貝方法1:用字符數(shù)組編程實(shí)現(xiàn)/*函數(shù)功能:字符串拷貝函數(shù)參數(shù):字符型數(shù)組srcStr,存儲源字符串字符型數(shù)組dstStr,存儲目的字符串函數(shù)返回值:無*/voidMyStrcpy(chardstStr[],charsrcStr[]){
inti=0;
while(srcStr[i]!='\0') { dstStr[i]=srcStr[i]; i++; } dstStr[i]='\0';}例7.5:字符串拷貝方法1:用字符數(shù)組編程實(shí)現(xiàn)例7.5:字符串拷貝下標(biāo):01234567891011HelloChina\0HelloChina\0from[i]to[i]下標(biāo)移動方向to[i]='\0'fromto結(jié)束拷貝ii++iHelloChina\0HelloChina\0*from*to指針移動方向指針移動方向*to='\0'tofrom++fromfromto++to例7.5:字符串拷貝下標(biāo):01例7.5:字符串拷貝方法2:用字符指針編程實(shí)現(xiàn)/*函數(shù)功能:字符串拷貝函數(shù)參數(shù):字符型指針srcStr,指向源字符串字符型指針dstStr,指向目的字符串函數(shù)返回值:無*/voidMyStrcpy(char*dstStr,constchar*srcStr){
while(*srcStr!='\0') { *dstStr=*srcStr; srcStr++; dstStr++; } *dstStr='\0';}例7.5:字符串拷貝方法2:用字符指針編程實(shí)現(xiàn)例7.6:計(jì)算實(shí)際字符個(gè)數(shù)方法1:用字符數(shù)組實(shí)現(xiàn)/*函數(shù)功能:計(jì)算字符串的長度函數(shù)參數(shù):字符型數(shù)組str,存儲字符串函數(shù)返回值:字符串的長度*/unsignedintMyStrlen(charstr[]){
inti
;
unsignedintlen=0;
for(i=0;str[i]!='\0';i++) { len++; }
return(len);}例7.6:計(jì)算實(shí)際字符個(gè)數(shù)方法1:用字符數(shù)組實(shí)現(xiàn)例7.6:計(jì)算實(shí)際字符個(gè)數(shù)方法2:用字符指針實(shí)現(xiàn)/*函數(shù)功能:計(jì)算字符串的長度函數(shù)參數(shù):字符型指針變量pStr,指向字符串函數(shù)返回值:字符串的長度*/unsignedintMyStrlen(char*pStr){
unsignedintlen=0;
for(;*pStr!='\0';pStr++) { len++; }
return(len);}例7.6:計(jì)算實(shí)際字符個(gè)數(shù)方法2:用字符指針實(shí)現(xiàn)指針、數(shù)組以及其它的類型混合基本數(shù)據(jù)類型int、long、char、short、float、double……指針是一種數(shù)據(jù)類型是從其它類型派生的類型XX類型的指針數(shù)組也是一種數(shù)據(jù)類型是從其它類型派生的類型每個(gè)元素都有一個(gè)類型任何類型都可以做指針或者數(shù)組的基礎(chǔ)類型它們自己也可以做彼此或自己的基礎(chǔ)類型指針、數(shù)組以及其它的類型混合基本數(shù)據(jù)類型指針與一維數(shù)組數(shù)組名就是一個(gè)指針只是不能修改這個(gè)指針的指向可以定義函數(shù)的參數(shù)為數(shù)組指針也可當(dāng)作數(shù)組名使用int*p,a[10];
p=a;數(shù)組元素的幾種等價(jià)引用形式a[i]*(a+i)p[i]*(p+i)60006001600260036004600560066007a[0]a[1]a[2]a[3]aa+1a+260006001600260036004600560066007a[0]a[1]a[2]a[3]app++p++指針與一維數(shù)組數(shù)組名就是一個(gè)指針6000a[0]aa+1a+輸入輸出數(shù)組的全部元素main(){
inta[10];
inti;
for(i=0;i<10;i++)scanf("%d",&a[i]);
for(i=0;i<10;i++)printf("%d",a[i]);}方法1:下標(biāo)法main(){
inta[10];
int*p,i;
for(p=a;p<(a+10);p++)scanf("%d",p);
for(p=a;p<(a+10);p++)printf("%d",*p);}方法2:指針法輸入輸出數(shù)組的全部元素main()方法1:下標(biāo)法main()例7.7:插入排序關(guān)鍵是:找到該插入的位置,然后依次移動插入位置及其后的所有元素騰出這一位置放入待插入的元素13579a[0]a[1]a[2]a[3]a[4]a[5]插入位置pos
x=4x插入前:③
②
①134579
x插入后:插入元素xa[0]a[1]a[2]a[3]a[4]a[5]例7.7:插入排序關(guān)鍵是:找到該插入的位置,然后依次移動例7.7:插入排序voidInseart(inta[],intn,intx){
inti,pos;
for(i=0;(i<n)&&(x>a[i]);i++) { } pos=i;
for(i=n-1;i>=pos;i--) { a[i+1]=a[i];/*向后移動*/ } a[pos]=x;/*插入元素x到位置pos*/}例7.7:插入排序voidInseart(inta[指針與二維數(shù)組一維數(shù)組a
a[1]
a[0][0]a[0][1]a[0][2]a[0][3]
a[1][0]a[1][1]a[1][2]a[1][3]
a[2][0]a[2][1]a[2][2]a[2][3]行地址列地址列地址列地址a[0]+0a[0]+1a[0]+2a[0]+3a[2]+0a[2]+1a[2]+2a[2]+3a[1]+0a[1]+1a[1]+2a[1]+3一維數(shù)組a[2]一維數(shù)組a[1]一維數(shù)組a[0]a[0]
a[2]
a+0&a[0]
a+1&a[1]
a+2&a[2]
指針與二維數(shù)組一維數(shù)組a指針與二維數(shù)組C語言將二維數(shù)組看作一維數(shù)組,其每個(gè)數(shù)組元素又是一個(gè)一維數(shù)組a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]aa[0]+0a+1a[1]+0a[0]+1a[0]+2&a[0][0]&a[1][0]&a[1][1]a[1]+1&a[1][2]&a[0][1]&a[0][2]
a[0][0] a[0] a[0][1] a[0][2] a[1][0] a[1] a[1][1] a[1][2]
a
a[1]+2inta[2][3];指針與二維數(shù)組C語言將二維數(shù)組看作一維數(shù)組,其每個(gè)數(shù)組元素又指針與二維數(shù)組一維數(shù)組a
a[1]
a[0][0]a[0][1]a[0][2]a[0][3]
a[1][0]a[1][1]a[1][2]a[1][3]
a[2][0]a[2][1]a[2][2]a[2][3]行地址列地址列地址列地址a[0]+0a[0]+1a[0]+2a[0]+3a[2]+0a[2]+1a[2]+2a[2]+3a[1]+0a[1]+1a[1]+2a[1]+3一維數(shù)組a[2]一維數(shù)組a[1]一維數(shù)組a[0]a[0]
a[2]
a+0&a[0]
a+1&a[1]
a+2&a[2]
指針與二維數(shù)組一維數(shù)組a例7.8任意輸入英文的星期幾,在查找星期表后輸出其對應(yīng)的數(shù)字。charweekDay[7][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};表7-1星期表的內(nèi)容0Sunday1Monday2Tuesday3Wednesday4Thursday5Friday6SaturdayweekDay[0]weekDay[1]weekDay[2]weekDay[3]weekDay[4]weekDay[5]weekDay[6]Sunday\0Monday\0Tuesday\0Wednesday\0Thursday\0Friday\0Saturday\0例7.8任意輸入英文的星期幾,在查找星期表后輸出其對應(yīng)的數(shù)例7.8#include<string.h>
main(){
inti,pos;
intfindFlag=0;
charx[10];
charweekDay[][10]={"Sunday","Monday","Tuesday", "Wednesday","Thursday","Friday","Saturday"}; printf("Pleaseenterastring:"); scanf("%s",x);
for(i=0;i<7&&!findFlag;i++) {
if(strcmp(x,weekDay[i])==0) { pos=i; findFlag=1; } }
if(findFlag) printf("%sis%d\n",x,pos);
else printf("Notfound!\n");}例7.8#include<string.h>指針與二維數(shù)組a代表二維數(shù)組的首地址,第0行的地址a+i代表第i行的地址*(a+i)即a[i]代表第i行第0列的地址*(a+i)+j即a[i]+j代表第i行第j列的地址*(*(a+i)+j)即a[i][j]代表第i行第j列的元素行地址轉(zhuǎn)變成列地址指針與二維數(shù)組a行地址轉(zhuǎn)變成列地址指針與二維數(shù)組元素a[i][j]的地址的幾種等價(jià)的引用方式&a[i][j]a[i]+j
*(a+i)+j
&(*(a+i))[j]元素a[i][j]的幾種等價(jià)的引用方式a[i][j]*(a[i]+j)
*(*(a+i)+j)
(*(a+i))[j]指針與二維數(shù)組元素a[i][j]的地址的幾種等價(jià)的引用方式指針與二維數(shù)組二維數(shù)組的指針——列指針int*p;p=*a;//用列地址初始化相對于數(shù)組起始地址的偏移量i*m+jfor(i=0;i<n;i++)
for(j=0;j<m;j++) printf("%d",*(p+i*m+j));a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]pp++指針與二維數(shù)組二維數(shù)組的指針——列指針a[0][0]a[1]指針與二維數(shù)組二維數(shù)組的指針——行指針int(*p)[3];p=a;//用行地址初始化for(i=0;i<n;i++)
for(j=0;j<m;j++) printf("%d",*(*(p+i)+j));a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]pp++指針與二維數(shù)組二維數(shù)組的指針——行指針a[0][0]a[1]例7.9:求最高分及其所在班級和學(xué)號intFindMax(int*p,intm,intn,int*pRow,int*pCol){
inti,j,max; max=p[0]; *pRow=0; *pCol=0;
for(i=0;i<m;i++) {
for(j=0;j<n;j++) {
if(p[i*n+j]>max){ max=p[i*n+j]; *pRow=i; *pCol=j;} } }
return(max);}例7.9:求最高分及其所在班級和學(xué)號intFindM指針數(shù)組元素均為指針類型數(shù)據(jù)的數(shù)組,稱為指針數(shù)組
定義形式為:
類型關(guān)鍵字*數(shù)組名[數(shù)組長度];例如char*pStr[5];
pStr[5]*char指針數(shù)組元素均為指針類型數(shù)據(jù)的數(shù)組,稱為指針數(shù)組pStr[例7.10:字符串按字典順序排序char
str[N][10]={"Pascal","Basic","Fortran","Java","VisualC"};
for(i=0;i<N-1;i++) {
for(j=i+1;j<N;j++) {
if(strcmp(str[j],str[i])<0) {
strcpy(temp,str[i]); strcpy(str[i],str[j]); strcpy(str[j],temp); } }}方法1:二維數(shù)組例7.10:字符串按字典順序排序charstr[N][1方法1排序前后strstrstrstrstrstrstrstrstrstr方法1排序前后strstrstrstrstrstrstrst例7.10:字符串按字典順序排序char
*ptr[N]={"Pascal","Basic","Fortran","Java","VisualC"};for(i=0;i<N-1;i++){
for(j=i+1;j<N;j++) {
if(strcmp(ptr[j],ptr[i])<0) {
temp=ptr[i]; ptr[i]=ptr[j]; ptr[j]=temp; } }}方法2:指針數(shù)組例7.10:字符串按字典順序排序char*ptr[N]方法2排序前后指針數(shù)組ptr字符串排序前Pascal\0Basic\0Fortran\0Java\0VisualC\0ptr[0]ptr[1]ptr[2]ptr[3]ptr[4]指針數(shù)組ptr字符串排序后Pascal\0Basic\0Fortran\0Java\0VisualC\0ptr[0]ptr[1]ptr[2]ptr[3]ptr[4]方法2排序前后指針數(shù)組ptr字符串排序指向指針的指針如果指針變量中保存的是另一個(gè)指針變量的地址,這樣的指針變量就稱為指向指針的指針多級指針實(shí)質(zhì)就是多級間接尋址(MultipleIndirection)定義形式:
類型關(guān)鍵字
**變量名;
指向指針的指針如果指針變量中保存的是另一個(gè)指針變量的地址,這例main(){
inti=5;
int*ip=&i;
int*ipp=&ip;
printf("i=%d,**ipp=%d\n",i,**ipp); **c=10; printf("i=%d,**ipp=%d\n",i,**ipp);}例main()例7.11main(){
inti;
char*ptr[]={"Pascal","Basic","Fortran","Java","VisualC"};
char**p; p=ptr;
for(i=0;i<5;i++){printf("%s\n",*p);p++;}}ptr[0]Pascalptr[1]ptr[2]ptr[3]BasicFortranJavaptr指針數(shù)組字符串nameVisualCptr[4]例7.11main()ptr[0]Pascalptr[1]命令行參數(shù)通過命令行參數(shù),使用戶可以根據(jù)需要來決定我們的程序干什么、怎么干main(intargc,char*argv[])當(dāng)你把main函數(shù)寫成這樣時(shí)argc的值為程序執(zhí)行時(shí)參數(shù)的數(shù)目(包括命令本身)argv[X]為指向每個(gè)參數(shù)的字符指針這兩個(gè)內(nèi)設(shè)形參用于接收命令行參數(shù)命令行參數(shù)通過命令行參數(shù),使用戶可以根據(jù)需要來決定我們的程序例7.12:演示命令行參數(shù)與main函數(shù)各形參之間的關(guān)系main(intargc,char*argv[]){
inti; printf("Theprogramnameis:%s\n",argv[0]);
if(argc>1) { printf("Theotherargumentsarefollowing:\n");
for(i=1;i<argc;i++) { printf("%s\n",argv[i]); } }}argv[0]echo.exeargv[1]ar
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【初中語文】第21課《望岳》教學(xué)課件2024-2025學(xué)年統(tǒng)編版語文七年級下冊
- 開啟小學(xué)新篇章
- 2024-2025學(xué)年人教版高二化學(xué)選擇性必修3配套課件 提升課時(shí)1 烴燃燒耗氧量以及烴原子共線、共面的判斷
- 咖啡調(diào)制技能指導(dǎo)(第二版) 題庫 -美式咖啡調(diào)制
- 輝煌成就與前路挑戰(zhàn)
- 高效應(yīng)聘手冊
- 星空科技創(chuàng)業(yè)計(jì)劃
- 幼兒園食品安全主題活動
- 大學(xué)生創(chuàng)業(yè)環(huán)境研究
- 人員借調(diào)合同范例
- 研究生實(shí)驗(yàn)報(bào)告模板(word可修改)
- 部編版語文市級公開教學(xué)講座《口語交際》培訓(xùn)課件
- 高中英語-新外研版必修一unit5-The-Monarchs-Journey-公開課reading課件
- 建設(shè)項(xiàng)目用地預(yù)審與選址意見課件講解
- DB44∕T 1049-2012 物業(yè)服務(wù) 綠化養(yǎng)護(hù)檢查規(guī)范
- 腹膜透析治療的護(hù)理-課件資料
- 國家開放大學(xué)《調(diào)劑學(xué)(本)》形考任務(wù)1-4參考答案
- 幼兒園小班繪本:《一步一步_走啊走》 PPT課件
- 《基礎(chǔ)和聲學(xué)》試習(xí)題庫(6套答案)
- 馬克思主義政治經(jīng)濟(jì)學(xué)課程講義
- SolidWorks、CAD三維建模練習(xí)習(xí)題圖
評論
0/150
提交評論