版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8講指針2第8講指針指針的概念指針變量的定義和初始化指針運(yùn)算符指針與數(shù)組指針數(shù)組程序設(shè)計(jì)舉例C語(yǔ)言程序設(shè)計(jì)指針的故事是“稀飯”(C_fans)最摯愛(ài)的武器很多“MissionImpossible”由指針完成大多數(shù)語(yǔ)言都有無(wú)數(shù)的“不可能”而C語(yǔ)言是“一切皆有可能”——李寧“ImpossibleisNothing”——adidas3指針指針的故事“該程序執(zhí)行了非法操作,即將關(guān)閉”這種錯(cuò)誤幾乎全是由指針和數(shù)組導(dǎo)致的黑客攻擊服務(wù)器利用的bug絕大部分都是指針和數(shù)組造成的某些用C的人,盡量避免使用指針4指針指針的故事5指針
某國(guó)情報(bào)機(jī)關(guān)最近一段時(shí)期接連損失了好幾名情報(bào)人員,經(jīng)過(guò)調(diào)查,發(fā)現(xiàn)是在自己內(nèi)部存在一名“鼴鼠”,但不知是誰(shuí)。不得已,買通了一名隱藏極深的雙重間諜進(jìn)行調(diào)查。很快,調(diào)查取得了重大突破,這名間諜成功地獲取了該“鼴鼠”的代號(hào)。因此情報(bào)局長(zhǎng)派遣一名經(jīng)驗(yàn)豐富的特工前去取回這條極其重要的情報(bào)。雙方約定的接頭地點(diǎn)在大廈的1101房間。1101大廈110211031104110521012102210321042105310131023103310431052103210331023102K指針指針的故事地址也是一種數(shù)據(jù):街道上的門牌號(hào)碼;同學(xué)錄上的通訊地址:××大學(xué)×號(hào)樓××房間。指針'K'…3102…2103110121033102字符數(shù)據(jù)chpqch的地址q的地址指針的故事尋址方式如何讀寫(xiě)內(nèi)存中的數(shù)據(jù)?通過(guò)變量的地址訪問(wèn)變量所在的存儲(chǔ)單元訪問(wèn)一個(gè)變量需要知道:(1)它的起始地址(2)它的數(shù)據(jù)類型對(duì)于內(nèi)存:物理上,以字節(jié)為單元邏輯上,以不同數(shù)據(jù)類型為單元。兩種尋址方式直接(尋址)訪問(wèn)直接按變量地址來(lái)存取變量?jī)?nèi)容的訪問(wèn)方式間接(尋址)訪問(wèn)通過(guò)指針變量來(lái)間接存取它所指向的變量的訪問(wèn)方式指針9指針的概念指針就是內(nèi)存對(duì)象的地址。內(nèi)存對(duì)象包括:變量,數(shù)組,函數(shù)等。C語(yǔ)言允許直接通過(guò)地址來(lái)處理數(shù)據(jù)。指針intx;x=23;內(nèi)存單元的地址一個(gè)無(wú)符號(hào)的整數(shù),就是指向變量的指針。變量名其實(shí)就是內(nèi)存單元的符號(hào)化名稱。內(nèi)存單元的內(nèi)容就是變量的值。FF00x23直接引用Directreference通過(guò)變量名直接引用變量占用的內(nèi)存單元。10指針變量指針變量就是保存指針(內(nèi)存地址)的變量。TheCProgrammingLanguage(K&R):Apointerisavariablethatcontainsthememoryaddress
of
anothervariable.指針intx=23;int*x_pointer;x_pointer=&x;FF00x23FFF0x_pointerFF00指針變量保存變量的地址。變量x_pointer的值是變量x的地址(指針)。目前,指針x_pointer指向變量x。間接引用Indirectreference通過(guò)指針變量間接引用變量占用的內(nèi)存單元。11指針變量指針變量的聲明類型說(shuō)明符*指針變量名;定義了一個(gè)指向整型變量的指針變量x_pointer*表示x_pointer是一個(gè)指針變量x_pointer的值是int*類型的指針,讀作:指向int型數(shù)據(jù)的指針指向整型對(duì)象的指針指針變量可以聲明為指向任何類型的數(shù)據(jù)(或?qū)ο螅┲羔榠nt*x_pointer;int*x_pointer,*y_pointer;char*charPtr;double*dPtr;注意所有指針變量保存的數(shù)據(jù)的類型是相同的,即一個(gè)內(nèi)存單元的地址,但是,它們指向的數(shù)據(jù)的類型可以不同。聲明多個(gè)指針時(shí),每個(gè)變量前都必須有*這三種數(shù)據(jù)類型的相同點(diǎn):它們都是指針類型,它們的變量存放的都是地址,長(zhǎng)度都是4個(gè)字節(jié);這三種數(shù)據(jù)類型的不同點(diǎn):它們是不同的數(shù)據(jù)類型,相互之間不能替代使用。例如,當(dāng)需要一個(gè)“pointertoint”類型的指針時(shí),不能用一個(gè)“pointertochar”類型的指針來(lái)代替。現(xiàn)在我們有了三種新的數(shù)據(jù)類型(指針類型):int* “pointertoint”double* “pointertodouble”char* “pointertochar”
基類型+指針類型符=新的數(shù)據(jù)類型(指針類型)(why?)指針變量13指針變量指針是一種變量,因而也具有變量的三個(gè)要素,但指針是一種特殊的變量,其特殊性表現(xiàn)在它的類型和取值上。具體而言:變量名:與一般的變量命名規(guī)則相同;
變量的值:是另一個(gè)變量的內(nèi)存地址;變量的類型:包括兩種類型,指針變量本身的類型,即指針類型,它的長(zhǎng)度為4個(gè)字節(jié);指針指向的變量的類型,指明了該變量的長(zhǎng)度。指針指針變量能否存放自己的地址?14指針變量的初始化一些問(wèn)題:
如何把變量x的地址存放在指針x_pointer
中
能否:原因:類型不匹配,2000為常量,x_pointer為
int*型修改:
指針變量指針Warning:Nonportable pointerconversion2000200420082012intx=20;int*x_pointer;x20?x_pointerx_pointer=2000;?2000從何而來(lái)?編程時(shí)并不知道變量的實(shí)際地址;x_pointer=(int*)2000;強(qiáng)制類型轉(zhuǎn)換200015我們想要做的事情:x_pointer
=x的內(nèi)存地址;變量的地址用取地址運(yùn)算符(&)獲得變量在內(nèi)存中的地址。我們寫(xiě)的語(yǔ)句:內(nèi)存對(duì)象的地址指針intx;scanf(“%d”,&x);x_pointer=&x
;取地址運(yùn)算符:&返回變量在內(nèi)存中的地址。&x的類型是
int*,即指向整型變量的指針類型。一般的,如果x的類型是T,則&x的類型為指向T型變量的指針類型。16取地址運(yùn)算符指針intx,*x_pointer;x=20;x_pointer=&x;x_pointer“指向”x;x的地址是x_pointer的值x_pointerx200020002000&x20fff017如何使用指針x_pointer
來(lái)訪問(wèn)或修改變量x的值我們想要做的事情:y=x_pointer所指向的變量的值;
或x_pointer所指向的變量?jī)?nèi)存單元=值;指針運(yùn)算符:**:指針運(yùn)算符(或稱“間接訪問(wèn)”運(yùn)算符)我們寫(xiě)的語(yǔ)句:指針運(yùn)算符指針inty;y=*x_pointer;*x_pointer=5;185指針運(yùn)算符:*返回指針變量所指向的對(duì)象的別名。
*
x_pointer的類型是
int。一般的,如果x_pointer的類型是指向T型變量的指針類型,則*
x_pointer的類型為T。指針運(yùn)算符指針intx,*x_pointer;inty;x=20;x_pointer=&x;y=*x_pointer
;*x_pointer=5;x_pointerx200020002000&x20fff0X的別名:*x_pointer520y19指針變量指針變量的初始化在聲明語(yǔ)句中為指針變量指定初值。指針變量可以被初始化為0,NULL或一個(gè)地址量。0和NULL是等價(jià)的(用NULL更好)NULL是在<stdio.h>等幾個(gè)頭文件中定義的符號(hào)常量,表示0指針intx,*p=&x;intx,*p=NULL;空指針:不指向任何對(duì)象一個(gè)其值為NULL的指針不同于一個(gè)未初始化的指針。一個(gè)指針在定義后,是未被初始化的,其值是隨機(jī)的,即可能指向某個(gè)無(wú)效的地址,此時(shí)若對(duì)它進(jìn)行訪問(wèn),將會(huì)出錯(cuò)。而NULL常量用來(lái)明確地說(shuō)明一個(gè)指針不指向任何有效的數(shù)據(jù)。20案例分析:指針運(yùn)算符指針運(yùn)算符指針#include<stdio.h>voidmain(){inta,*aPtr;a=7;
aPtr=&a;printf("Theaddressofais%p"
"\nThevalueofaPtris%p",&a,aPtr);printf("\n\nThevalueofais%d"
"\nThevalueof*aPtris%d",a,*aPtr);printf("\n\nShowingthat*and&areinversesofeachother."
"\n&*aPtr=%p"
"\n*&aPtr=%p",&*aPtr,*&aPtr);}21案例分析:指針運(yùn)算符指針運(yùn)算符運(yùn)行結(jié)果指針Theaddressofais1A58ThevalueofaPtris1A58Thevalueofais7Thevalueof*aPtris7Showingthat*and&areinversesofeachother.&*aPtr=1A58*&aPtr=1A58*和&是互反的指針變量的定義和初始化【例】使用指針變量在屏幕上顯示變量的地址值定義了指針變量pa,但pa并未指向a?如果指針指向一個(gè)非你控制的內(nèi)存空間并對(duì)該空間進(jìn)行訪問(wèn),將可能造成危險(xiǎn)指針變量的定義和初始化【例】使用指針變量在屏幕上顯示變量的地址值指針變量使用之前必須初始化Neveruseuninitializedpointers
指針變量的定義和初始化【例】使用指針變量在屏幕上顯示變量的地址值
指針變量的定義和初始化【例】使用指針變量在屏幕上顯示變量的地址值Pointershavenames,typesandvalues
指針變量的定義和初始化【例】使用指針變量在屏幕上顯示變量的地址值指針變量指向的數(shù)據(jù)類型稱為基類型指針變量只能指向同一基類型的變量指針變量的定義和初始化【例】使用指針變量在屏幕上顯示變量的地址值不能寫(xiě)成:int*pa,pb;
間接尋址運(yùn)算符【例】使用指針變量,通過(guò)間接尋址輸出變量的值pa0*pa&aa
間接尋址運(yùn)算符【例】使用指針變量,通過(guò)間接尋址輸出變量的值pa0*pa&aa9引用指針?biāo)赶虻淖兞康闹捣Q為指針的解引用(PointerDereference)
例輸入a和b兩個(gè)整數(shù),按先大后小的順序輸出a和b。解題思路:用指針?lè)椒▉?lái)處理這個(gè)問(wèn)題。不交換整型變量的值,而是交換兩個(gè)指針變量的值。
間接尋址運(yùn)算符#include<stdio.h>intmain(){int*p1,*p2,*p,a,b;
printf(“integernumbers:");
scanf(“%d,%d”,&a,&b);
p1=&a;p2=&b;
if(a<b){p=p1;p1=p2;p2=p;}
printf(“a=%d,b=%d\n”,a,b);
printf(“%d,%d\n”,*p1,*p2);
return0;}abp1p2p59&a&b成立#include<stdio.h>intmain(){int*p1,*p2,*p,a,b;
printf(“integernumbers:");
scanf(“%d,%d”,&a,&b);
p1=&a;p2=&b;
if(a<b){p=p1;p1=p2;p2=p;}printf(“a=%d,b=%d\n”,a,b);
printf(“%d,%d\n”,*p1,*p2);return0;}abp1p2p59&a&b&b&a#include<stdio.h>intmain(){int*p1,*p2,*p,a,b;printf(“integernumbers:");scanf(“%d,%d”,&a,&b);
p1=&a;p2=&b;
if(a<b){p=p1;p1=p2;p2=p;}printf(“a=%d,b=%d\n”,a,b);printf(“%d,%d\n”,*p1,*p2);return0;}abp1p2p59&a&b&b&a#include<stdio.h>intmain(){int*p1,*p2,*p,a,b;printf(“integernumbers:");scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(a<b){p=p1;p1=p2;p2=p;}printf(“a=%d,b=%d\n”,a,b);printf(“%d,%d\n”,*p1,*p2);return0;}abp1p2p59&a&b&b&a可否改為p1=&b;p2=&a;?35指針運(yùn)算指針可以參與以下運(yùn)算:賦值運(yùn)算給指針變量賦值關(guān)系運(yùn)算兩個(gè)指針之間的比較算術(shù)運(yùn)算加(減)一個(gè)整數(shù)兩個(gè)指針相減指針36指針運(yùn)算指針的賦值運(yùn)算可以把指針賦給同類型的指針變量。指針intx=10,*p,*q;p=&x;q=p;printf(“*q=%d",*q);*q=1010x2000p2000q200037指針運(yùn)算指針的賦值運(yùn)算把指針賦值給類型不同的指針變量時(shí)要進(jìn)行類型轉(zhuǎn)換。但void*類型的指針是一個(gè)例外。指針inta,*intPtr=&a;char*charPtr;charPtr=(char*)intPtr;void*voidPtr;voidPtr=intPtr;charPtr=voidPtr;void*通用指針代表任何指針類型不能間接引用*voidPtr=10;voidf(void*p);…f(ptr);常見(jiàn)的應(yīng)用形式38指針運(yùn)算指針的關(guān)系運(yùn)算比較兩個(gè)指針的值。指針p1<p2p1<=p2p1>p2p1>=p2p1==p2p1!=p22000p12002p2char*charPtr,*ptr;…charPtr>=(char*)2000…if(ptr!=0)…與同類型的指針常量比較常常與0比較39指針運(yùn)算指針的算術(shù)運(yùn)算自增自減(++,--)加上一個(gè)整數(shù)(+,+=,-,-=)兩個(gè)指針相減指針40指針運(yùn)算指針的算術(shù)運(yùn)算舉例指針int*vP1,*vP2;vP1=(int*)2000;vP2=vP1+2;數(shù)組vvP12000+2=20022000+2*4=2008vP2所指向的內(nèi)存對(duì)象的長(zhǎng)度sizeof(int)?vP1+2200020042008201241指針運(yùn)算指針的算術(shù)運(yùn)算舉例指針int*vP1,*vP2;vP1=(int*)2000;vP2=(int*)2008;數(shù)組vvP1vP2vP2和vP1之間內(nèi)存對(duì)象的個(gè)數(shù)?vP2-vP1
=(2008-2000)/sizeof(int)
=2指針的算術(shù)運(yùn)算在數(shù)組上使用才有意義200020042008201242指針與數(shù)組數(shù)組和指針關(guān)系密切。數(shù)組名是一個(gè)指針常量。數(shù)組元素指針:指向數(shù)組元素的指針。數(shù)組元素指針可以用來(lái)完成任何涉及數(shù)組下標(biāo)的操作。將bPtr的值置為數(shù)組b中的第一個(gè)元素的地址
bPtr=b;等價(jià)于
bPtr=&b[0];指針intb[5];int*bPtr;43指針與數(shù)組數(shù)組和指針關(guān)系密切。引用數(shù)組元素的表達(dá)式數(shù)組元素b[3]
可以用*(bPtr+3)
來(lái)引用3是偏移量這種表示法稱為指針偏移量表示法還可以用bPtr[3]
來(lái)引用稱為指針下標(biāo)表示法與b[3]
相同還可以用*(b+3)
來(lái)引用指針使用指針變量p指向數(shù)組a:圖5-4一維數(shù)組的指針?lè)ㄔL問(wèn)
inta[10],*p;p=a;inta[10],*p=a;或者寫(xiě)成:一維數(shù)組與指針
p+i指向元素a[i]使用指針?lè)ㄒ靡痪S數(shù)組的第i個(gè)元素的方法:1)*(p+i)訪問(wèn)元素a[i]。2)*(a+i)訪問(wèn)元素a[i]。
3)指向數(shù)組的指針變量也可以帶下標(biāo),即:p[i]與*(p+i)等價(jià),表示元素a[i]45指針與數(shù)組數(shù)組和指針關(guān)系密切。引用數(shù)組元素的表達(dá)式指針main(){inti,a[5]={1,2,3,4,5};for(i=0;i<5;i++)printf("%2d",a[i]);}下標(biāo)法main(){inti,a[5]={1,2,3,4,5};for(i=0;i<5;i++)printf("%2d",*(a+i));}地址法main(){inta[5]={1,2,3,4,5},*p;for(p=a;p<(a+5);p++)printf("%2d",*p);}指針?lè)?6指針與數(shù)組數(shù)組和指針互換使用時(shí)的注意事項(xiàng)數(shù)組名是一個(gè)指針常量。指針因?yàn)閍是數(shù)組名,即數(shù)組的首地址,它的值在程序運(yùn)行期間是固定不變的!是一個(gè)常量。錯(cuò)main(){inta[5]={1,2,3,4,5},*p;for(p=a;a<(p+5);a++)printf("%2d",*a);}47指針與數(shù)組數(shù)組和指針互換使用時(shí)的注意事項(xiàng)注意指針變量的值。指針要注意指針變量的當(dāng)前值。ppa[0]a[1]a[2]a[3]a[4]數(shù)組amain(){inti,a[5],*p;p=a;for(i=0;i<5;i++)scanf("%d",p++);for(i=0;i<5;i++,p++)printf("%d",*p);}錯(cuò)p=a;
例5-10
使用指針?lè)ǜ膶?xiě)例5-2。即輸入N個(gè)數(shù)據(jù)存入數(shù)組中,輸出其中的最大元素。方法一:通過(guò)數(shù)組名計(jì)算數(shù)組元素的地址,引用數(shù)組元素。#defineN10voidmain(){inti,imax,max,a[N];/*imax代表最大值元素 所在的位置*/printf("Enter%dNumbers\n",N);/*提示輸入 數(shù)據(jù)*/for(i=0;i<N;i++)scanf("%d",a+i);
一維數(shù)組與指針
max=a[0]; imax=0;/*假設(shè)第0元素就是最大元素*
for(i=1;i<N;i++){if(*(a+i)>max){
max=*(a+i);/*或者寫(xiě)為max=a[i]*/
imax=i;}printf("TheMaxNumbwera[%d]=%d\n",imax,max);}
一維數(shù)組與指針
方法二:使用指針變量作循環(huán)控件變量#defineN10main(){inti,imax,max,a[N],*p;
/*imax代表最大值 無(wú)素所在的位置*/printf("Enter%dNumbers\n",N);/*提示 輸入數(shù)據(jù)*/
for(p=a;p<a+N;p++)scanf("%d",p);
一維數(shù)組與指針
max=a[0];imax=0; /*假設(shè)第0元素就是最大元素*/p=a;
/*此語(yǔ)句不能少,因?yàn)樵谳斎霐?shù)據(jù)后,指針已 指向數(shù) 組外了*/
for(i=0;i<N;i++,p++)/*此語(yǔ)句可以寫(xiě)成
{ for(i=0;p<a+N;i++,p++)*/if(*p>max){
max=*p;
imax=i;}printf("TheMaxNumbwea[%d]=%d\n",imax,max);}
一維數(shù)組與指針
兩種方法的比較:
1)方法一與例5-2的下標(biāo)法執(zhí)行效率是相同的,C編譯系統(tǒng)是將a[i]轉(zhuǎn)換為*(a+i)處理,即先計(jì)算元素的地址。
2)方法二比方法一和下標(biāo)法執(zhí)行效率高,用指針變量直接指向元素,不必每次都重新計(jì)算地址,使用指針運(yùn)算(p++)指向下一個(gè)元素,這種有規(guī)律地改變地址值(p++)能大大提高程序執(zhí)行效率。
3)用下標(biāo)法比較直觀,能直接知道是第幾個(gè)元素。使用指針?lè)ǎ欢ㄒ喇?dāng)前指針指向哪個(gè)元素,否則可能得到意想不到的結(jié)果。
一維數(shù)組與指針
使用指針引用數(shù)組元素,應(yīng)注意以下2個(gè)問(wèn)題:
1)若指針p指向數(shù)組a,雖然p+i與a+i、*(p+i)與*(a+i)意義相同,但仍應(yīng)注意p與a的區(qū)別(a代表數(shù)組的首地址,是不變的;p是一個(gè)指針變量,可以指向數(shù)組中的任何元素),例如:for(p=a;a<(p+10);a++)/*錯(cuò)誤,因?yàn)閍代表數(shù)組 的首地址,是不變的,a++不合法*/printf("%d",*a)2)指針變量可以指向數(shù)組中的任何元素,注意指針變量的當(dāng)前值。
一維數(shù)組與指針
指向數(shù)組元素的指針的一些運(yùn)算設(shè)有定義“inta[10],*p=a;”,則對(duì)指向數(shù)組的指針變量的一些操作運(yùn)算如表5-1所示
一維數(shù)組與指針
例5-12
指向數(shù)組的指針變量的運(yùn)算示例。#include<stdio.h>voidmain(){inta[6]={2,4,6,8,10,12},*p;p=a+2;
/*輸出p所指向的元素,即a[2],讓p指向下一個(gè)元素,即a[3]*/printf("%d",*p++);
/*輸出p所指向元素的值,即a[3],讓p指向下一個(gè)元素,即a[4]*/printf("%d",*(p++));
/*讓p指向下一個(gè)元素,即a[5],輸出p所指向元素的值,即a[5]*/printf("%d",*++p);
/*輸出p所指向元素的值,即a[5],讓p所指向元素的值加1*/printf("%d",(*p)++); printf("%d",*p); /*輸出p所指向元素的值,即a[5]*/}
一維數(shù)組與指針
二維數(shù)組與指針
1.二維數(shù)組的地址例如有如下二維數(shù)組的定義:inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}按5.3.1節(jié)所述,二維數(shù)組a可理解為有三個(gè)元素(a[0]、a[1]、a[2])的一維數(shù)組,每一個(gè)元素又是一個(gè)有4個(gè)元素的一維數(shù)組。
例如:一維數(shù)組a[0]的元素為a[0][0],a[0][1],a[0][2],a[0][3]。即:
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]
在C語(yǔ)言中,二維數(shù)組在內(nèi)存中占一片連續(xù)存儲(chǔ)空間,元素的存放是按行排列的。即存放完一行之后順次放入第二行。二維數(shù)組的指針
1)二級(jí)指針常量。因?yàn)閿?shù)組名可以看成是由3個(gè)元素a[0]、a[1]、a[2]構(gòu)成的一維數(shù)組,每個(gè)元素指向該行的首地址。因此,二維數(shù)組名是一個(gè)二級(jí)指針常量。
2)一級(jí)指針常量。a[0]可以看成是由a[0][0]、a[0][1]、a[0][2]、a[0][3]構(gòu)成的一維數(shù)組,可以將a[0]這個(gè)特殊數(shù)組名理解為指向int類型的一級(jí)指針常量。a[1]與a[0]具有同樣性質(zhì),a[1]與a[0]的偏移量是一行元素的長(zhǎng)度。
二維數(shù)組a的指針如圖5-6所示(假設(shè)第一個(gè)元素的地址是0x2000)
二維數(shù)組與指針
二維數(shù)組a的指針。假設(shè)第一個(gè)元素的地址是0x2000)
二維數(shù)組與指針
說(shuō)明:
a+0表示第0行的首地址,與a[0]、或&a[0][0]的值相同,但意義及參與的運(yùn)算不同。a+1表示第1行元素的首地址,與a[1]、或&a[1][0]的值相同。a+2表示第2行元素的首地址,與a[2]、或&a[2][0]的值相同。
由于把a(bǔ)[0]、a[1]、a[2]看成一維數(shù)組,它們代表各自數(shù)組的首地址,即:a[0]相當(dāng)于&a[0][0],a[1]相當(dāng)于&a[1][0],a[2]相當(dāng)于&a[2][0]根據(jù)一維數(shù)組的表示方法,則有:a[0]+1:表示一維數(shù)組中第二個(gè)元素的地址,相當(dāng)于&a[0][1]。a[0]+2:表示一維數(shù)組中第三個(gè)元素的地址,相當(dāng)于&a[0][2]。a[1]+1:表示二維數(shù)組中第二個(gè)元素的地址,相當(dāng)于&a[1][1]。
二維數(shù)組與指針
注意:
a+0和a[0]的區(qū)別:雖然都表示第一行元素的首地址,但它們的含義是不同的。a+0是行指針,它的每一個(gè)增量單位是一行,a[0]后者是一個(gè)元素指針,它的增量單位是元素。*(a+0)相當(dāng)于a[0],實(shí)際上*(a+0)相當(dāng)于將行指針轉(zhuǎn)換成列指針(指向元素的指針)。已知某元素的指針后,可以用*運(yùn)算符訪問(wèn)該元素。例如:*(a[1]+2)=*(*(a+1)+2)=a[1][2]=13二維數(shù)組與指針
例5-14
輸出二維數(shù)組的相關(guān)地址數(shù)據(jù)和元素值#include<stdio.h>#definePF"%u,%u,%u,%u,%u\n"voidmain(){inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};printf(PF,a,*a,a[0],&a[0],&a[0][0]);printf(PF,a+1,*a+1,a[0]+1,&a[0]+1,&a[0][0]+1);printf("\n");printf(PF,a+1,*(a+1),a[1],&a[1],&a[1][0]);printf(PF,a+1+1,*(a+1)+1,a[1]+1,&a[1]+1,&a[1][0]+1);printf("\n");printf(PF,a+2,*(a+2),a[2],&a[2],&a[2][0]);printf("\n");printf("%d,%d\n",*(a[1]+1),*(*(a+1)+1));}65458,65458,65458,65458,6545865466,65460,65460,65466,65460程序的運(yùn)行結(jié)果如下:65466,65466,65466,65466,6546665474,65468,65468,65474,6546865474,65474,65474,65474,654746,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 擠壓模擬課程設(shè)計(jì)
- 銀行支行的行政后勤工作綜述
- 寵物服務(wù)員工作總結(jié)
- 港口貨物裝卸合同三篇
- 三年級(jí)科學(xué)學(xué)科的教學(xué)工作總結(jié)
- 門診護(hù)士年終總結(jié)
- 【八年級(jí)下冊(cè)歷史】期中達(dá)標(biāo)測(cè)試卷
- 2024年統(tǒng)計(jì)員年終工作總結(jié)篇
- 2024-2025學(xué)年北京門頭溝區(qū) 初三(上)期末物物理試卷(含答案)
- 分包采購(gòu)委托合同(2篇)
- 2025年云南昆明經(jīng)濟(jì)技術(shù)開(kāi)發(fā)區(qū)投資開(kāi)發(fā)(集團(tuán))有限公司招聘筆試參考題庫(kù)附帶答案詳解
- HSE基礎(chǔ)知識(shí)培訓(xùn)
- 安徽省蚌埠市2023-2024學(xué)年高一上學(xué)期期末考試 地理 含答案
- GB/T 5483-2024天然石膏
- 2024年度托管班二人合伙協(xié)議書(shū)3篇
- 山東中醫(yī)藥大學(xué)中西醫(yī)臨床(專升本)學(xué)士學(xué)位考試復(fù)習(xí)題
- 2024-2025學(xué)年九年級(jí)語(yǔ)文上冊(cè)部編版期末綜合模擬試卷(含答案)
- 鄉(xiāng)村振興暨干部素質(zhì)提升培訓(xùn)班學(xué)習(xí)心得體會(huì)
- IATF16949:2024標(biāo)準(zhǔn)質(zhì)量手冊(cè)
- 飼料加工混凝土施工合同
- 會(huì)議會(huì)務(wù)服務(wù)投標(biāo)方案投標(biāo)文件(技術(shù)方案)
評(píng)論
0/150
提交評(píng)論