版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第7章指針1第7章指針7.1指針與指針變量7.2指針的使用及運(yùn)算7.3指針與數(shù)組7.4指針與字符串7.5指針與函數(shù)7.6動態(tài)內(nèi)存7.7帶參數(shù)的main函數(shù)27.1指針與指針變量可以按對象(或變量)名稱直接訪問內(nèi)存單元,也可以通過指針間接訪問內(nèi)存單元。除非是使用動態(tài)內(nèi)存,僅在一個函數(shù)內(nèi)部操作內(nèi)存單元,一般不用指針間接訪問(能直接訪問為何不直接?)當(dāng)兩個函數(shù)相互之間要訪問數(shù)據(jù)時,由于函數(shù)內(nèi)部數(shù)據(jù)互不可視,只能通過指針間接訪問(直接訪問做不到了)37.1指針與指針變量因此僅在一個函數(shù)內(nèi)部用指針訪問是無意義的(唯一的意義是教學(xué))本章的指針有許多讓初學(xué)者頭疼的復(fù)雜形式和復(fù)雜概念,請牢記:之所以有如此多的復(fù)雜形式,是因?yàn)楹瘮?shù)參數(shù)傳遞具有如此多的復(fù)雜形式47.1.1地址和指針的概念程序中的數(shù)據(jù)對象總是存放在內(nèi)存中,在生命期內(nèi)這些對象占據(jù)一定的存儲空間,有確定的存儲位置。C語言將內(nèi)存單元抽象為對象,可以按名稱來使用這個對象。57.1.1地址和指針的概念實(shí)際上,每個內(nèi)存單元都有一個地址,以字節(jié)為單位連續(xù)編碼。編譯器將程序中的對象名轉(zhuǎn)換成機(jī)器指令能識別的地址,通過地址來存取對象值。67.1.1地址和指針的概念圖7.1變量的內(nèi)存形式inti,j,k;//定義整型變量doublef;//定義雙精度浮點(diǎn)型變量按對象名稱存取對象的方式稱為對象直接訪問。一個對象的地址稱為該對象的指針。通過對象地址存取對象的方式稱為指針間接訪問。77.1.2指針變量C語言將專門用來存放對象地址(即指針)的變量稱為指針變量,其數(shù)據(jù)類型為指針類型,定義形式如下:即在變量名前加一個星號(*)表示該變量為指針變量。例如:指針類型*指針變量名,......int*p1,*p2;//定義p1和p2為指針變量int*p,k;//定義p為指針變量,k為整型變量87.1.2指針變量圖7.2通過指針變量間接訪問通過指針變量,可以間接訪問(或間接存?。ο?。p是指針變量,它存儲整型變量i的地址4000,通過p知道i的地址,進(jìn)而找到變量i的內(nèi)存單元。97.1.2指針變量指向類型可以是C語言任意有效的內(nèi)置數(shù)據(jù)類型或自定義類型。由于指針變量的主要用途是通過它間接訪問別的對象的內(nèi)存單元,不同類型內(nèi)存單長度不同,元因此指向類型的說明是很重要的。107.1.2指針變量圖7.3指向類型的含義假定指針變量p的值是4000,下面三種寫法①char*p;②int*p;③double*p;117.1.2指針變量指向類型的不同表示指針變量所指向的對象的類型的不同,而非指針變量的不同。所有指針變量的內(nèi)存形式均是相同的。通常,編譯器為指針變量分配4個字節(jié)的存儲空間用來存放對象的地址,即指針變量的數(shù)據(jù)是地址的含義。由于地址值是大于等于零的,因此指針變量的數(shù)據(jù)習(xí)慣上按無符號整型數(shù)據(jù)對待。127.1.2指針變量純指針C語言提供一種特殊的指針類型void*,它可以保存任何類型對象的地址,即指針變量與地址值相關(guān),但不明確存儲在此地址上的對象的類型。void*指針變量仍然有自己的內(nèi)存單元,但它的指向?qū)ο蟛幻鞔_。void*p;137.1.2指針變量通常,void*指針只有幾種有限的用途:①與另一個指針進(jìn)行比較;②向函數(shù)傳遞void*指針或從函數(shù)返回void*指針;③給另一個void*指針賦值。需要注意,不允許使用void*指針操縱它所指向的對象,即不對void*指針作間接引用。147.2指針的使用及運(yùn)算獲取對象的地址可以通過取地址運(yùn)算(&)獲取對象的地址。157.2.1獲取對象的地址表7-1取地址運(yùn)算符運(yùn)算符功能目結(jié)合性用法&取地址單目自右向左&exprinta=20,*p;//定義指針變量p=&a;//指針變量p指向a圖7.4&運(yùn)算的含義167.2.1獲取對象的地址取地址運(yùn)算得到的指針不僅值為對象的地址,而且還以對象的數(shù)據(jù)類型作為指向類型,例如:inta;//&a得到指向int型的指針doublef;//&f得到指向double型的指針177.2.1獲取對象的地址例7.11#include<stdio.h>2intmain()3{4
inti=400;5printf("i=%d,&i=%x\n",i,&i);6
return0;7}187.2.1獲取對象的地址例7.11#include<stdio.h>2intmain()3{4inti=400;5printf("i=%d,&i=%x\n",i,&i);6return0;7}i=400,&i=12ff7c程序運(yùn)行屏幕197.2.2指針的間接訪問表7-2間接引用運(yùn)算符運(yùn)算符功能目結(jié)合性用法*間接引用單目自右向左*expr指針的間接訪問通過間接引用運(yùn)算(*)可以訪問指針?biāo)赶虻膶ο蠡騼?nèi)存單元207.2.2指針的間接訪問圖7.5*運(yùn)算的含義inta,*p=&a;a=100;//直接訪問a(對象直接訪問)*p=100;//*p就是a,間接訪問a(指針間接訪問)*p=*p+1;//等價(jià)于a=a+1211#include<stdio.h>2intmain()3{4inti=400,*p=&i;5printf("i=%d,&i=%x,i=%d\n",i,&i,*p);6return0;7}227.2.2指針的間接訪問【例7.2】已知:則①&*p1的含義是什么?②*&a的含義是什么?inta,b,*p1=&a,*p2;237.2.2指針的間接訪問圖7.6&*p1的含義p2=&*p1;//p1和p2均指向a247.2.2指針的間接訪問②*&a先計(jì)算&a得到變量a的地址,再計(jì)算“*(變量a的地址)”得到變量a,因此&*a與a等價(jià)。257.2.2指針的間接訪問例7.31#include<stdio.h>2intmain()3{4
inti=100,j=200;5
int*p1,*p2;6p1=&i,p2=&j;//p1指向i,p2指向j7
*p1=*p1+1;//等價(jià)于i=i+18p1=p2;//將p2的值賦值給p1,則p1指向j9
*p1=*p1+1;//等價(jià)于j=j+110
return0;11}267.2.2指針的間接訪問例7.35
int*p1,*p2;6p1=&i,p2=&j;//p1指向i,p2指向j7
*p1=*p1+1;//等價(jià)于i=i+18p1=p2;//將p2的值賦值給p1,則p1指向j9
*p1=*p1+1;//等價(jià)于j=j+1程序第5行定義了兩個指針變量p1和p2,尚未指向任何一個整型變量,至于指向哪一個整型變量,需要在其后的程序語句中指定。程序第6行的作用是將i和j變量的地址分別賦給p1和p2指針變量,則p1指向i和p2指向j。277.2.2指針的間接訪問例7.35
int*p1,*p2;6p1=&i,p2=&j;//p1指向i,p2指向j7
*p1=*p1+1;//等價(jià)于i=i+18p1=p2;//將p2的值賦值給p1,則p1指向j9
*p1=*p1+1;//等價(jià)于j=j+1程序第7行由于此時p1指向變量i,因此“*p1”的結(jié)果是i,所以“*p1=*p1+1”等價(jià)于“i=i+1”;第8行將p2的值賦給p1,則p1現(xiàn)在指向了變量j(原先指向i),第9行的“*p1=*p1+1”等價(jià)于“j=j+1”。287.2.2指針的間接訪問例7.35
int*p1,*p2;6p1=&i,p2=&j;//p1指向i,p2指向j7
*p1=*p1+1;//等價(jià)于i=i+18p1=p2;//將p2的值賦值給p1,則p1指向j9
*p1=*p1+1;//等價(jià)于j=j+1這段程序中的兩處“*p1=*p1+1”,代碼形式一樣但實(shí)際作用不同,取決于在執(zhí)行這個語句時p1具體指向了哪個變量。使用指針間接訪問,優(yōu)點(diǎn)是可以簡化程序形式和寫法,缺點(diǎn)是必須結(jié)合上下文分析才能判斷*p1究竟是哪個變量。297.2.2指針的間接訪問例7.41#include<stdio.h>2intmain()3{4
inta,b,*p,*p1,*p2;5p1=&a;//p1指向a6p2=&b;//p2指向b7scanf("%d%d",p1,p2);8
if(*p1>*p2){9p=p1,p1=p2,p2=p;10}11printf("a=%d,b=%d\n",a,b);//a和b未變12printf("min=%d,max=%d\n",*p1,*p2);13
return0;14}307.2.2指針的間接訪問例7.47scanf("%d%d",p1,p2);8
if(*p1>*p2){9p=p1,p1=p2,p2=p;10}11printf("a=%d,b=%d\n",a,b);//a和b未變12printf("min=%d,max=%d\n",*p1,*p2);第7行的作用是輸入a和b,原本為scanf("%d%d",&a,&b),由于p1的值是&a,p2的值是&b,所以兩種寫法結(jié)果相同;317.2.2指針的間接訪問例7.47scanf("%d%d",p1,p2);8
if(*p1>*p2){9p=p1,p1=p2,p2=p;10}11printf("a=%d,b=%d\n",a,b);//a和b未變12printf("min=%d,max=%d\n",*p1,*p2);第8行“*p1>*p2”等價(jià)于“a>b”,第9行交換p1和p2的值,經(jīng)過8、9行的比較交換后,p1指向較小的數(shù),p2指向較大的數(shù),因此*p1是較小的數(shù),*p2是較大的數(shù)。327.2.2指針的間接訪問圖7.7指針交換示意意義僅在于演示指針變量用法337.2.3指針變量的初始化與賦值可以在定義指針變量時對其初始化,一般形式為:指針類型*指針變量名=地址初值,......inta;int*p=&a;//p的初值為變量a的地址intb,*p1=&b;//正確,p1初始化時變量b已有地址值347.2.3指針變量的初始化與賦值取變量地址一定發(fā)生在該變量定義之后(這時才有地址),否則是錯誤的。例如:指針變量初始化時,地址初值必須是與指針變量同一指向類型的地址值,例如:int*p2=&c,c;//錯誤,p2初始化時尚未有c的地址值inta,*p1=&a;//正確doublef,*p2=&f;//正確int*p3=&f;//錯誤,&f的指向類型是double357.2.3指針變量的初始化與賦值指針變量可以進(jìn)行賦值運(yùn)算,例如:inta,*p1,*p2;p1=&a;//將a的地址值賦給p1p2=p1;//將p1的值賦給p2367.2.3指針變量的初始化與賦值指針變量賦值時要求左值和右值必須是相同的指向類型,C語言不會對不同指向類型的指針作隱式類型轉(zhuǎn)換。例如:inta,*p1,*p2;doublef,*p3;p1=&a;//正確p2=p1;//正確p3=&a;//錯誤,&a指向類型為int,p3指向類型為doublep3=&f;//正確p3=p1;//錯誤,p1指向類型為int,p3指向類型為double377.2.3指針變量的初始化與賦值由于指針數(shù)據(jù)的特殊性,其初始化和賦值運(yùn)算是有約束條件的,只能使用以下四種值:(1)0值常量表達(dá)式,即在編譯時可獲得0值的整型的const對象或常量0,例如:inta,z=0;constintnul=0;int*p1=a;//錯誤,地址初值不能是變量p1=z;//錯誤,整型變量不能作為指針,即使值為0p1=4000;//錯誤,整型數(shù)據(jù)不能作為指針p1=nul;//正確,指針允許0值常量表達(dá)式p1=0;//正確,指針允許0值常量表達(dá)式387.2.3指針變量的初始化與賦值(2)相同指向類型的對象的地址。例如:inta,*p1;doublef,*p3;p1=&a;//正確p3=&f;//正確p1=&f;//錯誤,p1和&f指向類型不相同397.2.3指針變量的初始化與賦值(3)對象存儲空間后面下一個有效地址,如數(shù)組下一個元素的地址。(4)相同指向類型的另一個有效指針。例如:intx,*px=&x;//正確int*py=px;//正確,相同指向類型的另一個指針doublez[10],*pz;py=px;//正確,相同指向類型的另一個指針pz=px;//錯誤,pz和px指向類型不相同pz=z;//正確,相同指向類型的數(shù)組指針pz=z+1;//正確,相同指向類型的數(shù)組下一個元素指針407.2.4指針的有效性指針是特殊的數(shù)據(jù),因此指針的運(yùn)算和操作要注意有效性問題。程序中的一個指針必然是以下三種狀態(tài)之一:①指向一個已知對象;②0值;③未初始化的、或未賦值的、或指向未知對象。417.2.4指針的有效性指針指向一個有確定存儲空間的對象(稱為已知對象),則該指針是有效的;即如果對該指針使用間接引用運(yùn)算,總能夠得到這個已知對象。指針理論上可以為任意的地址值,若一個指針不指向程序中任何已知對象,稱其指向未知對象。未知對象的指針是無效的,無效的指針使用間接引用運(yùn)算幾乎總會導(dǎo)致崩潰性的異常錯誤。427.2.4指針的有效性(1)如果指針的值為0,稱為0值指針,又稱空指針(nullpointer),空指針是無效的。(2)如果指針未經(jīng)初始化,或者沒有賦值,或者指針運(yùn)算后指向未知對象,那么該指針是無效的。int*p=0;*p=2;//空指針間接引用將導(dǎo)致程序產(chǎn)生嚴(yán)重的異常錯誤437.2.4指針的有效性一個指針還沒有初始化,稱為“野指針”(wildpointer)。嚴(yán)格的說,每個指針還沒有初始化之前都是“野指針”,大多數(shù)的編譯器都對此產(chǎn)生警告。例如:int*p;//p是野指針*p=2;//幾乎總會導(dǎo)致程序產(chǎn)生嚴(yán)重的異常錯誤,比如p的臟值//恰好是一個用戶的程序地址,或者恰好是系統(tǒng)程序的地址447.2.4指針的有效性一個指針曾經(jīng)指向一個已知對象,在對象的內(nèi)存空間釋放后,雖然該指針仍是原來的內(nèi)存地址,但指針?biāo)敢咽俏粗獙ο?,稱為“迷途指針”(danglingpointer)。例如:457.2.4指針的有效性char*p=NULL;//p是空指針,全局變量voidfun(){
charc;//局部變量p=&c;//指向局部變量c,函數(shù)調(diào)用結(jié)束后,c的空間釋放,p就成了迷途指針}voidcaller(){fun();
*p=2;//p現(xiàn)在是迷途指針}46迷途指針:char*fun(){
charc=0;//局部變量c+=1;returnp=&c;//指向局部變量c,函數(shù)調(diào)用結(jié)束后,c的空間釋放,p就成了迷途指針}voidcaller(){intx;x=*fun()+1;
//p現(xiàn)在是迷途指針}477.2.4指針的有效性野指針和迷途指針比起空指針更難發(fā)現(xiàn),因?yàn)槌绦驘o法檢測這個非0值的指針p究竟是有效的還是無效的,也無法區(qū)分這個指針?biāo)赶虻膶ο蟮牡刂肥且阎獙ο蟮倪€是未知對象的。487.2.5指針運(yùn)算指針運(yùn)算僅在指向數(shù)組時有意義。(1)指針加減整數(shù)運(yùn)算設(shè)p是一個指針(常量或變量),n是一個整型(常量或變量),則p+n的結(jié)果是一個指針,指向p所指向?qū)ο蟮暮竺娴牡趎個對象;而p-n的結(jié)果是一個指針,指向p所指向?qū)ο蟮那懊娴牡趎個對象。intx,n=3,*p=&x;p+1//指向存儲空間中變量x后面的第1個int型存儲單元p+n//指向存儲空間中變量x后面的第n(3)個int型存儲單元p-1//指向存儲空間中變量x前面的第1個int型存儲單元p-n//指向存儲空間中變量x前面的第n(3)個int型存儲單元497.2.5指針運(yùn)算例7.51#include<stdio.h>2intmain()3{4
intx,n=3,*p=&x;5printf("p=%x,p+1=%x,",p,p+1);6printf("p+n=%x,p-n=%x\n",p+n,p-n);7
return0;8}p=12ff7c,p+1=12ff80,p+n=12ff88,p-n=12ff70507.2.5指針運(yùn)算圖7.8指針加減運(yùn)算示意一般地,如果指針p所指向?qū)ο蟮念愋蜑門YPE,那么p±n的值為:p的地址值±n*sizeof(TYPE)517.2.5指針運(yùn)算(2)指針變量自增自減運(yùn)算設(shè)p是一個指針變量,其自增自減運(yùn)算包括p++、++p、p--、--p形式。527.2.5指針運(yùn)算intx,*p=&x;p++//運(yùn)算后表達(dá)式的值指向變量x,p指向變量x后面的第1個int型內(nèi)存單元++p//運(yùn)算后表達(dá)式的值和p均指向變量x后面的第1個int型內(nèi)存單元p--//運(yùn)算后表達(dá)式的值指向變量x,p指向變量x前面的第1個int型內(nèi)存單元--p//運(yùn)算后表達(dá)式的值和p均指向存儲空間中變量x前面的第1個int型內(nèi)存單元537.2.5指針運(yùn)算例7.61#include<stdio.h>2intmain()3{4
intx,*p1,*p;5p=&x,p1=p++;6printf("p++:&x=%x,p=%x,p++=%x\n",&x,p,p1);//地址輸出用十六進(jìn)制形式7p=&x,p1=++p;8printf("++p:&x=%x,p=%x,++p=%x\n",&x,p,p1);//地址輸出用十六進(jìn)制形式9
return0;10}547.2.5指針運(yùn)算圖7.9指針變量自增自減運(yùn)算示意p++:&x:12ff7c,p:12ff80,p++:12ff7c++p:&x:12ff7c,p:12ff80,++p:12ff80557.2.5指針運(yùn)算(3)兩個指針相減運(yùn)算設(shè)p1、p2是同一個指向類型的兩個指針(常量或變量),則p2-p1的結(jié)果為兩個指針之間對象的個數(shù),如果p2的地址值大于p1結(jié)果為正,否則為負(fù)。567.2.5指針運(yùn)算2.指針的關(guān)系運(yùn)算設(shè)p1、p2是同一個指向類型的兩個指針(常量或變量),則p2和p1可以進(jìn)行關(guān)系運(yùn)算,用于比較這兩個地址的位置關(guān)系。577.2.5指針運(yùn)算3.指針的類型轉(zhuǎn)換設(shè)p是一個指針(常量、變量或表達(dá)式),可以對p進(jìn)行顯式類型轉(zhuǎn)換,一般形式為:(轉(zhuǎn)換類型*)p587.2.5指針運(yùn)算例7.71#include<stdio.h>2intmain()3{4
shortx,*p=&x;5
unsignedcharhi,lo;6scanf("%d",&x);7lo=*((unsignedchar*)p);8hi=*((unsignedchar*)p+1);9printf("HI=%x,LO=%x\n",hi,lo);10
return0;11}597.2.5指針運(yùn)算圖7.10指針類型轉(zhuǎn)換示意0x3039IntelCPU變量存儲空間:小端法607.2.5指針運(yùn)算4.指針的賦值運(yùn)算指針可以進(jìn)行賦值運(yùn)算,前提是賦值運(yùn)算符兩邊的操作數(shù)必須是相同指向類型。例如:intx=10,*p1=&x,*p2;p2=p1;//p1和p2均是int*p2=&x;//&x和p2均是int*617.2.5指針運(yùn)算如果操作數(shù)不是相同的指向類型則不能進(jìn)行指針賦值,這時可以先進(jìn)行顯式類型轉(zhuǎn)換再賦值。例如:inta=10,*p;doubleb=20,*pf=&b;p=(int*)pf;//(int*)pf和p均是int*627.2.5指針運(yùn)算void*指針可以做關(guān)系運(yùn)算,表示兩個指針的地址值比較。void*指針可以指向其他任何類型,無需類型轉(zhuǎn)換。假定指針是有效的,可以將void*指針顯式類型轉(zhuǎn)換為其他類型,再使用間接引用。intx=10;doubley=20,*pf=&y;void*pv1;pv1=&x;//無需指針類型轉(zhuǎn)換printf("%d\n",*((int*)pv1));pv1=pf;//無需指針類型轉(zhuǎn)換printf("%lf\n",*((double*)pv1));637.2.6指針的const限定1.指向const對象的指針一個指針變量可以指向只讀型對象,稱為指向const對象的指針,定義形式為:即在指針變量定義前加const限定符,其含義是指針指向的對象是只讀的,換言之,不允許通過指針來改變所指向的const對象的值。const指向類型*指針變量,......;647.2.6指針的const限定constinta=10,b=20;constint*p;p=&a;//正確,p不是只讀的p=&b;//正確,p不是只讀的*p=42;//錯誤,*p是只讀的657.2.6指針的const限定把一個const對象的地址賦給一個非const對象的指針變量是錯誤的,例如:不能使用void*指針保存const對象的地址,而必須使用constvoid*指針保存const對象的地址,例如:constdoublepi=3.14;double*ptr=π//錯誤,ptr是非const指針變量constdouble*cptr=π//正確,cptr是const指針變量constintx=42;constvoid*cpv=&x;//正確,cpv是const指針變量void*pv=&x;//錯誤,x是const667.2.6指針的const限定允許把非const對象的地址賦給指向const對象的指針,例如:constdoublepi=3.14;constdouble*cptrf=π//正確doublef=3.14;//f是double型,f是非constcptrf=&f;//正確,允許將f的地址賦給cptrff=1.618;//正確,可以修改f的值*cptrf=10.1;//錯誤,不允許通過引用cptrf修改f的值677.2.6指針的const限定不能使用指向const對象的指針修改指向?qū)ο螅欢绻撝羔樦赶虻氖且粋€非const對象,可用其他方法修改其所指的對象。例如:doublef,*ptr=&f;constdouble*cptr=&f;f=3.14;//正確,f不是const,允許修改*cptr=3.14;//錯誤,cptr是const指針不允許修改*cptr*ptr=2.72;//正確,ptr不是const指針,允許修改*ptr687.2.6指針的const限定實(shí)際編程中,指向const的指針常用作函數(shù)的形參。將形參定義為指向const的指針,以此確保傳遞給函數(shù)的實(shí)參對象在函數(shù)中不被修改。697.2.6指針的const限定2.const指針一個指針變量可以是只讀的,稱為const指針,定義形式為:指向類型*const指針變量,......;707.2.6指針的const限定pc是指向int型對象的const指針。不能使pc再被賦值指向其他對象。任何企圖給const指針賦值的操作,即使給pc賦回同樣的值都會導(dǎo)致編譯錯誤。但可通過pc間接引用修改該對象的值。inta=10,b=20;int*constpc=&a;//pc是const指針pc=&b;//錯誤,pc是只讀的pc=pc;//錯誤,pc是只讀的pc++;//錯誤,pc是只讀的*pc=100;//正確,a被修改717.2.6指針的const限定3.指向const對象的const指針可以定義指向const對象的const指針,形式為:const指向類型*const指針變量,......;constdoublepi=3.14159;constdouble*constcpc=π
//cpc為指向const對象的const指針727.3指針與數(shù)組C程序員更偏愛使用指針來訪問數(shù)組元素,這樣做的好處是運(yùn)行效率高、寫法簡潔。737.3.1指向一維數(shù)組元素的指針一個對象占用內(nèi)存單元有地址,一個數(shù)組元素占用內(nèi)存單元同樣有地址。1.一維數(shù)組元素的地址數(shù)組由若干個元素組成,每個元素都占用內(nèi)存單元,因而每個元素都有相應(yīng)的地址,通過取地址運(yùn)算(&)可以得到每個元素的地址。inta[10];int*p=&a[0];//定義指向一維數(shù)組元素的指針p=&a[5];//指向a[5]747.3.1指向一維數(shù)組元素的指針數(shù)組對象可以看作是一個占用更大存儲空間的對象,它也有地址。C語言規(guī)定,數(shù)組名既代表數(shù)組對象,又是數(shù)組首元素的地址值,即a與第0個元素的地址&a[0]相同。例如:是等價(jià)的。①p=a;②p=&a[0];757.3.1指向一維數(shù)組元素的指針將數(shù)組的首地址看作是數(shù)組對象的地址。例如:數(shù)組名是地址值,是一個指針常量,因而它不能出現(xiàn)在左值和某些算術(shù)運(yùn)算中,例如:inta[10];int*p=a;//p指向數(shù)組ainta[10],b[10],c[10];a=b;//錯誤,a是常量不能出現(xiàn)在左值的位置c=a+b;//錯誤,a、b是地址值,不允許加法運(yùn)算a++;//錯誤,a是常量不能使用++運(yùn)算a>b//正確,表示兩個地址的比較,而非兩個數(shù)組內(nèi)容的比較767.3.1指向一維數(shù)組元素的指針2.指向一維數(shù)組元素的指針變量定義指向一維數(shù)組元素的指針變量時,指向類型應(yīng)該與數(shù)組元素類型一致,例如:inta[10],*p1;doublef[10],*p2;p1=a;//正確p2=f;//正確p1=f;//錯誤,指向類型不同不能賦值777.3.1指向一維數(shù)組元素的指針3.通過指針訪問一維數(shù)組元素由于數(shù)組元素是連續(xù)存儲的,其內(nèi)存地址是規(guī)律性增加的。根據(jù)指針?biāo)阈g(shù)運(yùn)算規(guī)則,可以利用指針及其運(yùn)算來訪問數(shù)組元素。設(shè)有如下定義:int*p,a[10]={1,2,3,4,5,6,7,8,9,10};p=a;//p指向數(shù)組a787.3.1指向一維數(shù)組元素的指針圖7.11指向一維數(shù)組的指針根據(jù)以上敘述,訪問一個數(shù)組元素a[i],可以用:①數(shù)組下標(biāo)法:a[i];②指針下標(biāo)法:p[i];③地址引用法:*(a+i);④指針引用法:*(p+i)。其中a是一維數(shù)組名,p是指向一維數(shù)組的指針變量且p=a。797.3.1指向一維數(shù)組元素的指針例7.81#include<stdio.h>2intmain()3{4
inta[10],i;5
for(i=0;i<10;i++)scanf("%d",&a[i]);6
for(i=0;i<10;i++)printf("%d",a[i]);7
return0;8}用多種方法遍歷一維數(shù)組元素:①下標(biāo)法。807.3.1指向一維數(shù)組元素的指針例7.81#include<stdio.h>2intmain()3{4
inta[10],i;5
for(i=0;i<10;i++)scanf("%d",a+i);6
for(i=0;i<10;i++)printf("%d",*(a+i));7
return0;8}用多種方法遍歷一維數(shù)組元素:②通過地址間接訪問數(shù)組元素。817.3.1指向一維數(shù)組元素的指針例7.81#include<stdio.h>2intmain()3{4
inta[10],*p;5
for(p=a;p<a+10;p++)scanf("%d",p);6
for(p=a;p<a+10;p++)printf("%d",*p);7
return0;8}用多種方法遍歷一維數(shù)組元素:③通過指向數(shù)組的指針變量間接訪問元素。827.3.1指向一維數(shù)組元素的指針第②種方法中,a+i為a[i]的地址,等價(jià)于&a[i],*(a+i)等價(jià)于a[i]。因此第①種方法和第②種方法完全一樣。第③種方法比第①、②種方法快,因?yàn)橹羔樧兞恐苯又赶驍?shù)組元素,不必每次重新計(jì)算元素地址。類似p++的自增運(yùn)算快于加法運(yùn)算,大大提高了數(shù)組元素訪問效率。837.3.1指向一維數(shù)組元素的指針4.?dāng)?shù)組元素訪問方法的比較(1)使用下標(biāo)法訪問數(shù)組元素,程序?qū)懛ū容^直觀,能直接知道訪問的是第幾個元素,例如a[3]是數(shù)組第3個元素(從0開始計(jì))。用地址法或指針法就不直觀,需要結(jié)合程序上下文才能判斷是哪一個元素。847.3.1指向一維數(shù)組元素的指針4.?dāng)?shù)組元素訪問方法的比較(2)下標(biāo)法與地址引用法運(yùn)行效率相同。實(shí)際上,編譯器總是將a[i]轉(zhuǎn)換為*(a+i)、&a[i]轉(zhuǎn)換為a+i處理的。即訪問元素前需要先計(jì)算元素地址。使用指針引用法,指針變量直接指向元素,不必每次都重新計(jì)算地址,能提高運(yùn)行效率。857.3.1指向一維數(shù)組元素的指針4.?dāng)?shù)組元素訪問方法的比較(3)a[i]和p[i]的運(yùn)行效率相同,但兩者還是有本質(zhì)的區(qū)別。數(shù)組名a是數(shù)組元素首地址,它是一個指針常量,其值在程序運(yùn)行期間是固定不變的。(4)將自增和自減運(yùn)算用于指針變量十分有效,可以使指針變量自動向前或向后指向數(shù)組的下一個或前一個元素。867.3.1指向一維數(shù)組元素的指針(5)需要注意指針變量各種運(yùn)算形式的含義。①*p++。②*(p++)和*(++p)不同。③(*p)++表示p所指向的元素加1。a.*(p++)等價(jià)于a[i++];b.*(++p)等價(jià)于a[++i];c.*(p--)等價(jià)于a[i--];d.*(--p)等價(jià)于a[--i]。877.3.2指向多維數(shù)組元素的指針1.多維數(shù)組元素的地址以二維數(shù)組為例,假設(shè)有定義inta[3][4],可以將數(shù)組a理解為由3個一維數(shù)組組成,即a由a[0]、a[1]、a[2]3個元素組成,其中每個元素又是一個一維數(shù)組,包含4個元素,例如a[0](一維數(shù)組)有4個元素a[0][0]、a[0][1]、a[0][2]、a[0][3]。887.3.2指向多維數(shù)組元素的指針圖7.12指向二維數(shù)組的指針897.3.2指向多維數(shù)組元素的指針圖7.12指向二維數(shù)組的指針907.3.2指向多維數(shù)組元素的指針圖7.13二維數(shù)組地址含義917.3.2指向多維數(shù)組元素的指針表7-3二維數(shù)組的地址形式地址形式含義等價(jià)地址a既代表二維數(shù)組對象,又是第0行地址,即指向一維數(shù)組a[0]&a[0][0]a[0]、*(a+0)、*aa[i]、*(a+i)既代表第0行(一維數(shù)組),又是第0行第0列元素的地址既代表第i行(一維數(shù)組),又是第i行第0列元素的地址&a[0][0]&a[i][0]a+i、&a[i]第i行地址&a[i][0]a[i]+j、*(a+i)+j第i行第j列元素的地址&a[i][j]927.3.2指向多維數(shù)組元素的指針例7.91#include<stdio.h>2intmain()3{4
inta[3][4]={1,2,3,4,5,6,7,8,9,10,11
,12},i=1,j=2;5printf("a=%x\t*a=%x\n",a,*a);6printf("a+0=%x\ta+1=%x\ta+2=%x\n",a+0,a+1,a+2);7
printf("&a[0]=%x\t&a[1]=%x\t&a[2]=%x\n",&a[0],&a[1],&a[2]);8printf("a[0]=%x\ta[1]=%x\ta[2]=%x\n",a[0],a[1],a[2]);9
printf("*(a+0)=%x\t*(a+1)=%x\t*(a+2)=%x\n",*(a+0),*(a+1),*(a+2));937.3.2指向多維數(shù)組元素的指針例7.910
printf("&a[0][0]=%x\t&a[1][0]=%x\t&a[2][0]=%x\n",&a[0][0],&a[1][0],&a[2][0]);11
printf("&a[i][0]=%x\t&a[i]=%x\t&a[i]+1=%x\n",&a[i][0],&a[i],&a[i]+1);12
printf("&a[i][0]=%x\ta[i]=%x\ta[i]+1=%x\n",&a[i][0],a[i],a[i]+1);13
printf("&a[i][j]=%x\ta[i]+j=%x\t*(a+i)+j=%x\n",&a[i][j],a[i]+j,*(a+i)+j);14
return0;15}947.3.2指向多維數(shù)組元素的指針a=12ff50 *a=12ff50a+0=12ff50 a+1=12ff60 a+2=12ff70&a[0]=12ff50 &a[1]=12ff60 &a[2]=12ff70a[0]=12ff50 a[1]=12ff60 a[2]=12ff70*(a+0)=12ff50 *(a+1)=12ff60 *(a+2)=12ff70&a[0][0]=12ff50 &a[1][0]=12ff60 &a[2][0]=12ff70&a[i][0]=12ff60 &a[i]=12ff60 &a[i]+1=12ff70&a[i][0]=12ff60 a[i]=12ff60 a[i]+1=12ff64&a[i][j]=12ff68 a[i]+j=12ff68 *(a+i)+j=12ff68957.3.2指向多維數(shù)組元素的指針2.指向多維數(shù)組元素的指針變量定義指向多維數(shù)組元素的指針變量時,指向類型應(yīng)該與數(shù)組元素類型一致,例如:inta[10][10],*p1=&a[0][0];doublef[3][4][5],*p2=&f[0][0][0];967.3.2指向多維數(shù)組元素的指針3.通過指針訪問多維數(shù)組元素假設(shè)有訪問一個二維數(shù)組元素a[i][j],可以用:(1)數(shù)組下標(biāo)法:a[i][j];(2)指針下標(biāo)法:p[i*M+j];(3)地址引用法:*(*(a+i)+j)或*(a[i]+j);(4)指針引用法:*(p+i*M+j)。inta[N][M],*p=&a[0][0];977.3.2指向多維數(shù)組元素的指針例7.101#include<stdio.h>2intmain()3{4
inta[3][4]={1,2,3,4,5,6,7,8,9,10,
11,12},*p;5
for(p=a[0];p<a[0]+12;p++){6printf("%2d",*p);7
if((p-a[0])%4==3)printf("\n");8}9
return0;10}987.3.2指向多維數(shù)組元素的指針由于多維數(shù)組的地址形式有多種,因此指針變量初始指向存在多種寫法,使得指針運(yùn)算后的指向是比較復(fù)雜的。例如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12},*p;int(*p1)[4];p=&a[2][2];//正確,p指向a[2][2]p=a[0]+5;//正確,p指向a[1][1]p=*(a+2)+4;//正確,p指向a[2][4]p=a;//錯誤,指向類型不相同a為指向第0行p=&a[1];//錯誤,指向類型不相同,&a[1]為指向第1行p1==&a[1];//正確·p=a+5;//錯誤,指向類型不相同,a+5指向第5行(無效地址)997.3.3數(shù)組指針C語言可以定義一個指針變量,其指向類型是一個數(shù)組(一維或多維),稱為數(shù)組指針,定義形式為:①指向一維數(shù)組的指針變量定義
指向類型(*指針變量名)[常量表達(dá)式],......②指向多維數(shù)組的指針變量定義
指向類型(*指針變量名)[常量表達(dá)式1][常量表達(dá)式2]…,......注意指針變量名必須括起來,使得(*)比([])先處理,說明定義是一個指針。否則因?yàn)椋╗])會比(*)優(yōu)先級高,變成定義數(shù)組了。1007.3.3數(shù)組指針上述語法的含義是:①定義一個指針變量,它指向如下形式的一維數(shù)組
元素類型數(shù)組名[常量表達(dá)式]②定義一個指針變量,它指向如下形式的多維數(shù)組
元素類型數(shù)組名[常量表達(dá)式1][常量表達(dá)式2]…int(*p1)[4];//定義指向一維數(shù)組的指針變量p1int(*p2)[3][4];//定義指向二維數(shù)組的指針變量p21017.3.3數(shù)組指針圖7.14數(shù)組指針的含義1027.3.3數(shù)組指針圖7.14數(shù)組指針的含義1037.3.3數(shù)組指針數(shù)組指針的實(shí)際意義是若p指向一個數(shù)組,則*p就是該數(shù)組。假設(shè)則*p就是數(shù)組a[0],而不是數(shù)組a[0]的元素。通過p訪問數(shù)組元素a[0][j]的寫法是注意*p必須包含括號,因?yàn)椋╗])的優(yōu)先級比(*)高。inta[3][4],(*p)[4],j=1;p=a;//*p是a[0],及int[4]的數(shù)組(*p)[j]=10;//等價(jià)于a[0][j]=10*(*p+j)=10;//等價(jià)于*(a[0]+j)=10;1047.3.3數(shù)組指針假設(shè)因?yàn)閜2指向一個有4個整型元素的一維數(shù)組。當(dāng)p2=a時,p2指向二維數(shù)組a的第0行。則p2+1指向下一行,即指向二維數(shù)組a的第1行,p2+i指向二維數(shù)組a的第i行,那么p2+i與a+i是等價(jià)的。顯而易見,*(p2+i)與*(a+i)、p2[i]與a[i]是等價(jià)的,它們均表示二維數(shù)組的第i行,而要表示元素a[i][j]可以用p[i][j]、*(a+i)[j]、*(p+i)[j]、*(*(a+i)+j)、*(*(p+i)+j)形式之一。實(shí)際編程中,引入數(shù)組指針可以將一個數(shù)組當(dāng)作“元素”來處理,能夠簡化多維數(shù)組的處理。inta[3][4],(*p2)[4];p2=a;1057.3.3數(shù)組指針例7.111#include<stdio.h>2intmain()3{4
inta[3][4]={1,2,3,4,5,6,7,8,9,10,
11,12},i,j;5
int(*p)[4]=a;6
for(i=0;i<3;i++){//行7
for(j=0;j<4;j++)printf("%2d",p[i][j]);8printf("\n");//每行末尾輸出換行9}10
return0;11}106#include<stdio.h>intmain(){ inti,j,k; intaa[2][3][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24}; int(*pp)[3][4]=aa;//&aa[0];//aa[0],aa[1]都是3行4列的數(shù)組元素
for(k=0;k<2;k++){ for(i=0;i<3;i++){//行 for(j=0;j<4;j++)printf("%-4d",pp[k][i][j]); printf("\n");//每行末尾輸出換行 } printf("\n");//每k行末尾輸出換行 }
return0;}1077.3.4指針數(shù)組一個數(shù)組,若其元素為指針類型,稱為指針數(shù)組,其定義的一般形式為:①一維指針數(shù)組的定義
指向類型*數(shù)組名[常量表達(dá)式],......②多維指針數(shù)組的定義
指向類型*數(shù)組名[常量表達(dá)式1][常量表達(dá)式2]…[常量表達(dá)式n],......108int*p[4];//一維指針數(shù)組int*s[3][4];//二維指針數(shù)組7.3.4指針數(shù)組其中p是一個一維數(shù)組,有4個元素,每個元素都是一個指向整型的指針類型;s是一個二維數(shù)組,有12個元素,每個元素都是一個指向整型的指針類型。注意指針數(shù)組“int*p[4];”與“int(*p)[4];”寫法的區(qū)別,后者是數(shù)組指針。實(shí)際編程中,使用指針數(shù)組可以方便地處理大批量指針數(shù)據(jù),例如若干字符串、多個存儲塊的處理等。1097.3.4指針數(shù)組指針數(shù)組的初始化實(shí)質(zhì)就是數(shù)組的初始化,例如:inta[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};int*s[4]={a[0],a[1],a[2],a[3]};1107.3.4指針數(shù)組圖7.15指針數(shù)組的含義1117.3.4指針數(shù)組指針數(shù)組的每個元素既可以按數(shù)組方式來訪問,又可以用指針的方式來訪問。下面是通過指針數(shù)組s的元素訪問二維數(shù)組a的典型形式:(1)s[0]:指向a[0][0];(2)*s[0]:等價(jià)于a[0][0];(3)s[i]+j:指向a[i][j];(4)*(s[i]+j)、*(*(s+i)+j)、s[i][j]:等價(jià)于a[i][j]。需要注意,由于s是數(shù)組名,因此s不是左值,不能做自增自減運(yùn)算等。1127.3.4指針數(shù)組s=a[0];//錯誤,s不能作為左值s[0]=a[0];//正確,s[0]元素是變量可以作為左值s[0]=a+1;//錯誤,指向類型不相同s[0]是int*,a+1是行指針(一維數(shù)組指針)s[0]=a;//錯誤,指向類型不相同s[0]是int*,a是行指針(一維數(shù)組指針)s=s+1;//錯誤,s不能作為左值s++;//錯誤,s不能做自增運(yùn)算1137.3.4指針數(shù)組例7.121#include<stdio.h>2intmain()3{4
inta[4][4]={1,2,3,4,5,6,7,8,9,10,11,
12,13,14,15,16};//二維數(shù)組5
inti,j,*s[4]={a[0],a[1],a[2],a[3]};6
for(i=0;i<4;i++){7
for(j=0;j<4;j++)8printf("%2d",s[i][j]);9printf("\n");10}11
return0;12}1147.3.5指向指針的指針作為指針變量的內(nèi)存單元也有地址。顯然,存放指針變量地址的變量還是一個指針變量,是指向指針類型的指針變量,稱為指向指針的指針,即二級指針變量(二級指針)。其定義形式為:指針類型**指針變量名,......指針類型*……*指針變量名,......1157.3.5指向指針的指針普通對象、一級指針變量、二級指針變量可以同時定義,例如:二級指針變量或多級指針變量的使用、運(yùn)算等操作與一級指針變量相同。inta,*p,**pp;//定義普通對象,一級指針變量,二級指針變量1167.3.5指向指針的指針假設(shè)已知指針變量p的初值為整型變量a的地址,指針變量pp的初值為指針變量p的地址。則有:(1)*p:間接引用運(yùn)算的結(jié)果為a;(2)*pp:間接引用運(yùn)算的結(jié)果為p;(3)**pp:等價(jià)于*(*pp),兩次間接引用運(yùn)算的結(jié)果為a;(4)pp變量的值是指針變量p的地址;(5)p變量的值是整型變量a的地址。inta=20,*p=&a,**pp=&p;1177.3.5指向指針的指針圖7.16指針的指針的含義1187.3.5指向指針的指針例7.131#include<stdio.h>2intmain()3{4
inta=20,*p=&a,**pp=&p;5printf("a=%d\t*p=%d\t**pp=%d\n",a,*p,**pp);6printf("&a=%x\tp=%x\t*pp=%x\n",&a,p,*pp);7printf("&p=%x\tpp=%x\t&pp=%x\n",&p,pp,&pp);8
return0;9}1197.3.5指向指針的指針程序某次運(yùn)行結(jié)果如下:a=20 *p=20 **pp=20&a=12ff7cp=12ff7c*pp=12ff7c&p=12ff78pp=12ff78&pp=12ff741207.3.5指向指針的指針為指針變量賦值或初始化時,指針級別不能混淆,即一級指針變量只能取得普通對象的地址,二級指針變量只能取得一級指針變量的地址,以此類推,否則指向類型不一致。例如:pp的指向類型為“int*”,而&a和p的指向類型為“int”。inta=10,*p=&a,**pp=&a;//pp=&a錯誤pp=&a;//錯誤pp=p;//錯誤1217.3.5指向指針的指針實(shí)際編程中,指向指針的指針通常和指針數(shù)組結(jié)合在一起使用,一般用作函數(shù)參數(shù)。假設(shè)已知則通過二級指針訪問一維指針數(shù)組s的典型形式為:①pp=s、pp=&s[0]:二級指針pp指向一維指針數(shù)組s的首元素地址;②pp=s+i、pp=&s[i]、pp+i:二級指針pp指向一維指針數(shù)組s[i]地址;③*(pp+i)、pp[i]:等價(jià)于s[i]。inta[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};int*s[4]={a[0],a[1],a[2],a[3]};int**pp=s;//二級指針指向一維指針數(shù)組1227.3.5指向指針的指針而通過二級指針訪問一維指針數(shù)組s再間接訪問二維數(shù)組a的典型形式為:①*(pp+i)、pp[i]:指向a[i][0];②**(pp+i)、*pp[i]、*(pp[i]+0)、pp[i][0]:等價(jià)于a[i][0]③*(pp+i)+j、pp[i]+j:指向a[i][j];④*(*(pp+i)+j)、*(pp[i]+j)、pp[i][j]:等價(jià)于a[i][j];1237.3.5指向指針的指針例7.141#include<stdio.h>2intmain()3{4
inta[4][4]={1,2,3,4,5,6,7,8,9,10,
11,12,13,14,15,16};//二維數(shù)組5
int*s[4]={a[0],a[1],a[2],a[3]};6
inti=2,j=3,**pp=s;7printf("%x\t%x\t%x\n",&a[i][0],*(pp+i),pp[i]);8printf("%d\t%d\t%d\n",a[i][0],**(pp+i),pp[i][0]);9printf("%x\t%x\t%x\n",&a[i][j],*(pp+i)+j,pp[i]+j);1247.3.5指向指針的指針例7.1410printf("%d\t%d\t%d\n",a[i][j],*(*(pp+i)+j),pp[i][j]);11
return0;12}程序運(yùn)行結(jié)果如下:12ff6012ff6012ff6099912ff6c12ff6c12ff6c1212121257.3.5指向指針的指針圖7.17多級指針的含義1267.3.5指向指針的指針圖7.17多級指針的含義1277.3.5指向指針的指針圖7.17多級指針的含義1287.4指針與字符串可以利用一個指向字符型的指針處理字符數(shù)組和字符串,其過程與通過指針訪問數(shù)組元素相同。使用指針可以簡化字符串的處理,是程序員處理字符串常用的編程方法。1297.4.1指向字符串的指針可以定義一個字符數(shù)組,用字符串常量初始化它,例如:系統(tǒng)會在內(nèi)存中創(chuàng)建一個字符數(shù)組str,且將字符串常量的內(nèi)容復(fù)制到數(shù)組中,并在字符串末尾自動增加一個結(jié)束符'\0'。charstr[]="CLanguage";1307.4.1指向字符串的指針圖7.18字符串的數(shù)組形式C語言允許定義一個字符指針,初始化時指向一個字符串常量,一般形式為:char*字符指針變量=字符串常量,......1317.4.1指向字符串的指針圖7.19指向字符串的指針這里雖然沒有定義字符數(shù)組,但在程序全局?jǐn)?shù)據(jù)區(qū)中仍為字符串常量分配了存儲空間,而且在字符串末尾自動增加一個結(jié)束符'\0'。顯然,這個字符串常量是有地址的。初始化時,p存儲了這個字符串首字符地址4000,而不是字符串常量本身,稱p指向字符串。1327.4.1指向字符串的指針可以在程序語句中,用字符串常量賦值給字符指針變量p。例如:字符指針變量p除指向字符串常量外,還可以指向字符數(shù)組。例如:char*p;p="CLanguage";//正確"……"字符串常量既是字符數(shù)組,又表示字符串首地址,兩者均是char*charstr[]="CLanguage",*p=str;//p指向字符串的指針1337.4.1指向字符串的指針通過字符指針可以訪問字符串。例如:charstr[]="CLanguage",*p=str;//p指向字符串的指針printf("%s\n",p);//輸出:CLanguageprintf("%s\n",p+2);//輸出:Languageprintf("%s\n",&str[7]);//輸出:age1347.4.1指向字符串的指針通過字符指針遍歷字符串。char*p1,*p="CLanguage";//p指向字符串的首地址p1=p;//p變化前先將字符串的首地址保存到p1中while(*p1!='\0')printf("%c",*p1++);1357.4.1指向字符串的指針例7.151#include<stdio.h>2intmain()3{4
charstr[100],*p=str;5scanf("%s",str);//輸入字符串6
while(*p)p++;//指針p指向到字符串結(jié)束符7printf("strlen=%d\n",p-str);8
return0;9}1367.4.1指向字符串的指針例7.151#include<stdio.h>2intmain()3{4charstr[100],*p=str;5scanf("%s",str);//輸入字符串6while(*p)p++;//指針p指向到字符串結(jié)束符7printf("strlen=%d\n",p-str);8return0;9}strlen=10程序運(yùn)行屏幕JavaScript↙1377.4.1指向字符串的指針圖7.20指針相減的含義1387.4.1指向字符串的指針請記住,指針可以指向數(shù)組,使得數(shù)組的訪問多了一種途徑,但指針并不能替代數(shù)組來存儲大批量數(shù)據(jù)。1397.4.2指針與字符數(shù)組的比較1.存儲內(nèi)容不同字符數(shù)組能夠存放字符串所有字符和結(jié)束符,字符指針僅存放字符串的首地址。即定義字符數(shù)組,系統(tǒng)會為其分配指定長度的內(nèi)存單元,而定義指針變量,系統(tǒng)只分配4個字節(jié)的內(nèi)存單元用于存放地址。chars[100]="Computer";char*p="Computer";1407.4.2指針與字符數(shù)組的比較2.運(yùn)算方式不同字符數(shù)組s和字符指針p盡管都是字符串的首地址,但s是數(shù)組名,是一個指針常量,不允許做左值和自增自減運(yùn)算。而p是一個指針變量,允許做左值和自增自減運(yùn)算。作為地址值,s在程序運(yùn)行期間不會發(fā)生變化,而p是可變的。chars[100]=“Computer”;//char*p="Computer";//*p=&“Computer”;1417.4.2指針與字符數(shù)組的比較3.賦值操作不同字符數(shù)組s可以進(jìn)行初始化,但不能使用賦值語句進(jìn)行整體賦值,只可以按元素來賦值。字符指針既可以進(jìn)行初始化,也可以使用賦值語句。s="C++";//錯誤s++;//錯誤s[0]='C';//正確p="C++";//正確*p=‘C’;//錯誤,常量字符串不能修改p++;//正確1427.4.2指針與字符數(shù)組的比較例7.161#include<stdio.h>2intmain()3{4
char*p="VisualBasic";5
inti=0;6
while(p[i])printf("%c",p[i++]);7
return0;8}143#include<stdio.h>voidfun(char*p){ *p='C';}intmain(){ //charstr[]="VisualBasic"; char*p="VisualBasi
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024融資租賃合同書之公寓租賃合同
- 2024年度監(jiān)理工程師職責(zé)履行合同
- 2024年中介參與下的二手房買賣定金合同
- 2024年度軟件開發(fā)與維護(hù)技術(shù)服務(wù)合同
- 2024年建筑工地瓦工承包合同
- 商品房購房合同協(xié)議書
- 技術(shù)合同 技術(shù)許可合同樣本
- 2024某大學(xué)人文社科科研項(xiàng)目合同書
- 2024借名購房合同協(xié)議范本
- 2024年離婚協(xié)議書格式要求
- 軍事訓(xùn)練模擬系統(tǒng)的效能評估
- 分層次教學(xué)與個性化輔導(dǎo)計(jì)劃
- 基于物聯(lián)網(wǎng)的農(nóng)業(yè)無人機(jī)高效配送方案
- 毛細(xì)支氣管炎護(hù)理查房課件
- EHS(環(huán)境健康安全)管理制度
- GB/T 10476-2024尿素高壓冷凝器技術(shù)條件
- 2024-2030年中國金融BPO行業(yè)市場發(fā)展分析及投資前景與策略研究報(bào)告
- 二年級《公共安全教育》全冊教學(xué)設(shè)計(jì)
- 風(fēng)力發(fā)電項(xiàng)目施工方案
- (2024年)傳染病培訓(xùn)課件
- 實(shí)驗(yàn)室安全準(zhǔn)入教育(通識A課程)學(xué)習(xí)通超星課后章節(jié)答案期末考試題庫2023年
評論
0/150
提交評論