C指針與數(shù)組的混合運算(補充指針的內(nèi)容)_第1頁
C指針與數(shù)組的混合運算(補充指針的內(nèi)容)_第2頁
C指針與數(shù)組的混合運算(補充指針的內(nèi)容)_第3頁
C指針與數(shù)組的混合運算(補充指針的內(nèi)容)_第4頁
C指針與數(shù)組的混合運算(補充指針的內(nèi)容)_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、本文不是一篇初學(xué)者讀者文章,本文不會對基本的指針概念等作介紹,本文是針對本人的關(guān)于指針的一篇補充性文章,本文重點在于介紹指針與數(shù)組的計算,讓讀者學(xué)會怎樣計算指針,讓讀者不再被指針和數(shù)組所困火,希望本文會給你帶來一定的幫助。本文內(nèi)容完全屬于個人見解,其中難免有誤解之處,望指出更正。指針的計算1、指針與數(shù)組(對指針的透徹理解)1、兩條基本準(zhǔn)則:a、首先要明白,指針運算符的作用,我用一言以概之,你在哪里使用都不會錯。指針運算符*的作用是求出*后面所指地址里的值。因此只要*后面的變量表示的是一個地址就可以使用*運算符,來求出這個地址中的值,你不用管這個地址的表示形式是怎樣的,只要是地址就可以使用*來求

2、出地址中的值。b、 這個運算符的的運算法則是,把左側(cè)的地址加上 內(nèi)的偏移量然后再求指針運算,注意有 運算符的地方就有個隱含的指針,比如x2表示的就是將指針x偏移2個單位量后再求指針運算。也就說x2與*(x+2)是相等的。2、對數(shù)組的講解:a、對數(shù)組名的理解:大家都知道數(shù)組名是一個指針,但是這個指針是一個常量,也就是說不能改變他所指向的地址,比如你不能把另一個變量的地址賦給數(shù)組名,比如a=&i; 其中a是數(shù)組名,這就是錯誤的。再比如char a11; a=”hy”;這也是錯誤的,因為a是數(shù)組名是常量,不能把字符串常量”hy”的首地址賦給數(shù)組名以此來改變數(shù)組名所指向的地址,這是很多人容易范

3、的錯誤,要把字符串賦給數(shù)組應(yīng)是這樣char a11=”hy”; 這是初始化,初始化不會改變數(shù)組名所指向的地址。b、一維數(shù)組我們基本上都是這樣理解一維數(shù)組的數(shù)組名的,即一維數(shù)組的數(shù)組名表示的是數(shù)組的首地址,比如一維數(shù)組a11中的數(shù)組名a就表示數(shù)組的首地址。首先在這里要明白,這種理解是錯誤的,因為數(shù)組名不是表示的是數(shù)組的首地址,他是表示的數(shù)組中第一個元素的地址,因此數(shù)組名a其實表示的是&a0的地址,而表示數(shù)組的首地址的是&a,因為a表示的是一個包含有4個元素的一維數(shù)組,因此&a表示的就是一個包含有4個元素的一維數(shù)組的地址,也就是說&a的地址中包含了4個元素。注意:a

4、和&a表示的地址是相同的,使用輸出語句可以很明顯的看到。也就是說數(shù)組中第一個元組的地址和數(shù)組的首地址是相等的,但是他們的意義卻有很大不同,在后面的計算中你將會看到。c、二維數(shù)組:比如二維數(shù)組b34,我們首先從一維開始分析,眾所周知b0,b1分別表示的是二維數(shù)組中第一行第一個元素和第二行第一個元素的地址,也就是說b0是與&b00等價的,b1是與&b10等介的。因此數(shù)組名b就與&b0等價的,因為b0包含有4個元素,因此數(shù)組名b或者&b0表示的是二維數(shù)組中第一行所包含的一維數(shù)組的地址,說簡單一點,就是說二維數(shù)組名是二維數(shù)組中第一行的行地址。因此二維數(shù)組名b所包

5、含的地址中包含有二維數(shù)組中第二維中元素的個數(shù)的一維數(shù)組,也就是b的地址中包含一個含有4個元素的一維數(shù)組的地址(也就是所謂的數(shù)組的數(shù)組了)。d、N維數(shù)組:通過上面對一二維數(shù)組的語言描術(shù),可以總結(jié)一些規(guī)律(因為維數(shù)大于3的數(shù)組就難以用語言來描術(shù),只能通過數(shù)學(xué)計算來解決地址問題):1:數(shù)組名a是與&a0等價的,不管是多少維數(shù)組,這條規(guī)律都是必定的。2:a(中括號中的下標(biāo)省掉,只要括號中的下標(biāo)不超過界限都適合本規(guī)律)只要不是表示的最后一維,也就是說他表示的是地址而不是具體的元素,則a都與&a0等價的。e、為什么我們要把a解釋為&a0:在計算時你就會看到,a并不是表示的真正的地址

6、,而&a0才是表示的真正的地址,也就是說對于a1+1不等于a2,因為a1并不是表示的具體的地址,因為他所表示的地址是&a10,因此a1+1=&a10+1=&a11,我們看到了,只有把a表示為&a0才能和后面的整數(shù)直接相加,這一點非常重要,一定要記住。2、指針和 的混合計算法則(以下假設(shè)b為二維數(shù)組b34):1、首先要明白,指針運算符的作用,我用一言以概之,你在哪里使用都不會錯。指針運算符*的作用是求出*后面所指地址里的值。因此只要*后面的變量表示的是一個地址就可以使用*運算符,來求出這個地址中的值,你不用管這個地址的表示形式是怎樣的,只要是地址就可以使用

7、*來求出地址中的值。2、 這個運算符的的運算法則是,把左側(cè)的地址加上 內(nèi)的偏移量然后再求指針運算,注意有 運算符的地方就有個隱含的指針,比如x2表示的就是將指針x偏移2個單位量后再求指針運算。也就說x2與*(x+2)是相等的。3、對于b1這樣的地址,一定要表示為&b10再進行偏移計算,比如對于b1+1,這不是直接在對b1加1,也就是b1+1不等于b2,因為b1表示的是第二行行1個元素的地址,對其加1,應(yīng)該表示的是第二行第二個元素的地址,也就是&b11,而b2則表示的是第二行第一個元素的地址,因此錯誤,所以在計算時應(yīng)把b1轉(zhuǎn)換為&b10之后,才能直接進行地址的偏移,也就是

8、說b1+1=&b10+1=&b11,這樣才能得到正確的結(jié)果,并且不會出錯。4、對于有小括號的地方,一定不要省略小括號。比如(&b1)1與&b11將表示的是不同的結(jié)果,第二個是顯然的,對于第一個(&b1)1=*(&b1)+1)=*(&b1+1)=*(&b2)=b2,可以看到,表示的是第3行第1個元素的地址,因此這兩個的結(jié)果是顯然不一樣的。因此對于(b+1)1這樣的運算,不能省略小括號,即(b+1)1=(&b1)1=*(&b1)+1)=*(&b1+1)=*(&b2)=b2,如果省略了小括號,則是(b+1

9、)1=&b11,這將是不易發(fā)現(xiàn)的錯誤。因此這是兩個完完全全不同的符案。5、對于指針,只要指針指向了數(shù)組,不管他是多少重指針,都可以使用這些計算法則。注意:對于有指針運算符*和下標(biāo)運算符的混合運算時,最好使用計算表達式的方式采用數(shù)學(xué)的方法來得出正確的結(jié)論,因為用語言來描術(shù)這類的綜合運算,彎過來彎過去的很容易出錯,如果用數(shù)學(xué)方式,結(jié)合C中的運算符優(yōu)先級來運算,只要弄懂指針的首地址,然后從優(yōu)先級高的運算符開始運算,這樣得到的結(jié)果是不會出錯的。比如,對于(*(b+1)1其中b是二維數(shù)組b34。如果用語言去描術(shù)很容易出錯,如果掌握好下面的數(shù)學(xué)計算方法,然后逐步計算,就很容易得出正確答案,而且簡單

10、易懂,只要把數(shù)組b表示的地址弄懂,也就是b=&b0,然后再計算,就很容易得到答案了。下面先用語言描術(shù)一些基本理論,然后再講解具體的計算方法。下面講解一些示例(假設(shè)b為二維數(shù)組b34):例1:*(b+1)=*(&b0+1)=*(&b1)=b1例2:*(*(b+1)+1)=*(*(&b0+1)+1)=*(*(&b1)+1)=*(b1+1)=*(&b10+1)=*(&b11)=b11例3:(*(b+1)1=(*(&b0+1)1=(*(&b1)1=(b1)1=*(b1)+1) /把b1拆分為*(b+1);=*(&b10+1

11、)=*(&b11)=b11例4:(b+1)1=(&b0+1)1=(&b1)1=*(&b1+1)=*(&b2)=b2例5:*(b+1)1=*(&b0+1)1=*(&b1)1=*(*(&b1+1) /注意 運算符優(yōu)先級比*指針運算符高,把以應(yīng)先計算(&b1)1=*(&b1+1)=*(*(&b2)=*(b2)=*(&b20)=b20方法2:*(b+1)1=*(b+1)+1)=*(b+2)=*(*(b+2)=*(*(&b0+2)=*b2=b20例6:(*(b+1)5=(*(&b1)5=(b1

12、)5=*(b1+5)=*(&b10+5)=*(&b15)=b153、對于多重指針的計算。比如int a11=0; int *p1=a; int *p=&p1; 注意,因為int *p=&p1與int *p; p=&p1相同,可以看到p=&p1因此在計算的時候,只有出現(xiàn)p的地方,都可以把其替換為&p1,同理p1=a;因此可以把p1替換為a,最后可以把p替換為&a來計算,這樣的話,在對多重指針的計算時就比較簡單了。比如*p+1=*(&a)+1=a+1=&a0+1=&a1,同理p+1=&a+1;當(dāng)然&am

13、p;a+1將是一個不明確的地址,這樣看實際情況來處理。如果a不是數(shù)組,而是一個整型常量,比如int a;則不存在指針的相加減運算,因為對整型變量的地址偏移,必定會得到一個不明確的地址。指針指向整數(shù)變量(其他非數(shù)組變量也是類似的)只能有p+0這樣的運算,只要p+1就會偏移到不確定地址。4、對于指針數(shù)組的計算int *p4對于指針數(shù)組的計算可以采用二維數(shù)組的計算法則:比如int *p4,則*p+1=*(&p0)+1=p0+1=&p00+1=&p01;因此*p+1表示的是指針p0所指向的第2個元素的地址,但要注意,如果p0不是指向的數(shù)組,則這是錯誤的表達式,比如p0=&

14、;i; 其中變量i是int型的,則*p+1將會是一個不可預(yù)測值的地址,使用*(*p+1)將得到一個不可預(yù)測的值,如果p0指向的是一個一維數(shù)組,比如p0=a; 其中a是一個一維數(shù)組,則*p+1表示的就是數(shù)組a中的第2個元素(下標(biāo)為1),使用*(*p+1)將會輸出這個值。因此&p01應(yīng)把p0整體理解為一個指針,你也可以把p0使用不是數(shù)組類型的指針來代替,比如q,則p01就是q1,然后再來看q是指向的什么。因此對于指針數(shù)組同樣可以使用上面的法則進行計算,但要把計算之后的結(jié)果p進行相應(yīng)的簡單理解,即,應(yīng)把p理解為是一個指針。5、數(shù)組指針與二維數(shù)組講解:下面我們將以y4=1,2,3,4這個一維數(shù)

15、組為例來層層講解,指針和數(shù)組的關(guān)系。1、數(shù)組指針:定義形式為:int (*p)4;表示定義了一個指向多維數(shù)組的指針,即指針p指向的是一個數(shù)組,這個數(shù)組有4個元素,對這個指針p的賦值必須是有4個int元素的數(shù)組的地址,即只要包含有四個元素的數(shù)組的地址都能賦給指針p,不管這個數(shù)組的行數(shù)是多少,但列數(shù)必須為4。即int y4,x224;都可以賦給指針p。賦值方式為p=&y或p=x,對于&y和二維數(shù)組數(shù)組名前面已講過,&y中的地址是一個包含有4個元素的一維數(shù)組的地址,二維數(shù)組名x也是一個含有4個元素的一維數(shù)組的地址,因此可以這樣賦值。而這樣賦值將是錯誤的p=y,或者p=x0;

16、因為y和x0的地址只包含一個元素,他們不包含一個數(shù)組,因此出錯。2注意()必須有,如果沒有的話則,int *p4;則是定義了一個指針數(shù)組,表示每個數(shù)組元素都是一個指針,即p2=&i;指向一個int型的地址,而*p2則表示p2所指向的元素的值。3初始化數(shù)組指針p:a、當(dāng)把int y4賦給指針p時p=y將是錯誤的,正確的方式為p=&y因為這時編譯器會檢查賦給指針p的元素是否是含有四個元素的數(shù)組,如果是就能正確的賦值,但語句p=y中的y代表的是數(shù)組y4第一行第一列的元素的地址也就是&y0的地址,因此y指向的地址只有一個元素,而指針p要求的是有4個元素的數(shù)組的地址,因此語句p=

17、y將出錯。而&y也表示的是一個地址,但&y包含了數(shù)組y4的第一行的所有元素,在這里&y包含有4個元素,因此p=&y才是正確的賦值方法,在這里要注意,數(shù)組的某行的行地址是第本行的第一個元素的地址是相同的。b、把x224賦給指針p有幾種方法,方法一:p=x;我們這樣來理解該條語句,首先x0表示的是二維數(shù)組x224的第1行第一列元素的地址,這個地址包含一個元素,這是顯而易見的,而數(shù)組名x也表示一個地址,但這個地址包含的是一個數(shù)組(即數(shù)組的數(shù)組),這個數(shù)組是包含4個元素的數(shù)組,這4個元素就是數(shù)組x第一行的4個元素,也就是說x表示的是數(shù)組x224的第1行的行地址,即數(shù)組名

18、x就包含了數(shù)組x224第1行的4個元素,因此這種賦值方式是正確的。這時指針p就相當(dāng)于是數(shù)組名一樣,比如p21訪問的就是數(shù)組x的第3行的第2個元素。c、方法二:p=x+1或者p=&x1;注意必須要有地址運算符&,同理語句&x1表示的是數(shù)組x224第2行的行地址,因為x1表示的是數(shù)組x224第的第2行第1列的元素的地址,因此&x1表示的就是數(shù)組x的第2行的行地址,因為&x1這個地址包含了一個數(shù)組,這個數(shù)組的起始地址是從x1這個地址開始的,這,即數(shù)組x224中x1這一行的4個元素。在這一行中包含了4個元素。這時指針p的起始地址是&x1,所以p01不再是訪問的x的第一行第二個元素,而是訪問的x的第二行第二個元素。d、注意,再次提示,數(shù)組的某行的行地址是與本行的第一個元素的地址是相同的。4、數(shù)組指針的計算數(shù)組指針的計算與上面介紹的指針與數(shù)組的計算法則相同,但計算之后表示成的二維數(shù)組形式p12要注意看指針p的起始地址是哪一行,然后才能確定輸出哪個元素,比如p起始地址是二維數(shù)組的第1行,則p12表示的是第2行第3個元素,但若p指向的是二維數(shù)組的第二行(也就是起始地址在二維數(shù)組第2行),則這時p12就表示的是第3行第3個元素了。6、int (&p)4引用int (&a

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論