指針與數(shù)組的總結(jié)_第1頁(yè)
指針與數(shù)組的總結(jié)_第2頁(yè)
指針與數(shù)組的總結(jié)_第3頁(yè)
指針與數(shù)組的總結(jié)_第4頁(yè)
指針與數(shù)組的總結(jié)_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

指針與數(shù)組的總結(jié)第1篇指針與數(shù)組的總結(jié)第1篇首先,從內(nèi)存角度來(lái)理解數(shù)組:

從內(nèi)存角度講,數(shù)組變量就是一次分配多個(gè)變量,而且這多個(gè)變量在內(nèi)存中的存儲(chǔ)單元是依次相連接的。

例如,我們分開(kāi)定義多個(gè)變量(inta,b,c,d;)和一次定義一個(gè)數(shù)組(inta[4];)這兩種方法都定義了4個(gè)int型的變量,且這4個(gè)變量都是獨(dú)立的成單個(gè)使用的。它們的不同點(diǎn)是,單獨(dú)定義時(shí)a、b、c、d在內(nèi)存中的地址不一定相連,但定義成數(shù)組后,數(shù)組中的4個(gè)元素地址肯定是依次相連的。

故數(shù)組中的多個(gè)變量雖然必須單獨(dú)訪(fǎng)問(wèn),但是因?yàn)樗鼈兊牡刂废噙B,因此可以用指針來(lái)操作。

對(duì)數(shù)組中幾個(gè)關(guān)鍵符號(hào)(aa[0]&a&a[0])的理解:

以inta[10]為例

1.a就是數(shù)組名

c語(yǔ)言規(guī)定不能整體操作數(shù)組,要獨(dú)立到單個(gè)元素操作,所以a不能做左值。

a做右值表示數(shù)組首元素的首地址(首地址就是起始地址,就是4個(gè)字節(jié)中最開(kāi)始第一個(gè)字節(jié)的地址)。a做右值等同于&a[0]。

2.a[0]表示數(shù)組的首元素

做左值時(shí)表示a[0]對(duì)應(yīng)的內(nèi)存空間(連續(xù)4個(gè)字節(jié))

做右值時(shí)表示a[0]的值

3.&a就是數(shù)組名a取地址

&a不能做左值,做右值時(shí)表示整個(gè)數(shù)組的首地址。

4.&a[0]就表示a[0]的首地址

當(dāng)&a[0]做右值時(shí)等同于&a

現(xiàn)在我們定義有:inta[4]={1,2,3,4};

int*p=a;

則指針p就指向數(shù)組a首元素的首地址,(p+i)就是訪(fǎng)問(wèn)數(shù)組a中下標(biāo)為i的元素的首地址,*(p+i)就是該元素的內(nèi)容。也可以用(數(shù)組名+偏移量)即

(a+i)來(lái)表示元素地址。

或者也可以采用p[i]來(lái)訪(fǎng)問(wèn)數(shù)組,p[i]==a[i]

指針數(shù)組與數(shù)組指針

1.指針數(shù)組

由指針變量組成的數(shù)組。定義:int*p[n];

若要將二維數(shù)組賦給一指針數(shù)組:

指針數(shù)組p的每個(gè)元素存放數(shù)組a的每一行元素的首地址

2.數(shù)組指針(也稱(chēng)行指針)

指向數(shù)組的指針,即數(shù)組首元素地址的指針。定義int(*p)[n];

若要指向一個(gè)二維數(shù)組:

指針與數(shù)組的總結(jié)第2篇

inta=1;

int*p=&a;//指針p指向了a的地址,p里保存了a的地址

intp;

//這是一個(gè)普通的整型變量

int*p;

//首先從P處開(kāi)始,先與*結(jié)合,所以說(shuō)明P是一個(gè)指針,然后再與int結(jié)合,說(shuō)明指針?biāo)赶虻膬?nèi)容的類(lèi)型為int型.所以P是一個(gè)返回整型數(shù)據(jù)的指針

intp[3];

//首先從P處開(kāi)始,先與[]結(jié)合,說(shuō)明P是一個(gè)數(shù)組,然后與int結(jié)合,說(shuō)明數(shù)組里的元素是整型的,所以P是一個(gè)由整型數(shù)據(jù)組成的數(shù)組

int*p[3];

//首先從P處開(kāi)始,先與[]結(jié)合,因?yàn)槠鋬?yōu)先級(jí)比*高,所以P是一個(gè)數(shù)組,然后再與*結(jié)合,說(shuō)明數(shù)組里的元素是指針類(lèi)型,然后再與int結(jié)合,說(shuō)明指針?biāo)赶虻膬?nèi)容的類(lèi)型是整型的,所以P是一個(gè)由返回整型數(shù)據(jù)的指針?biāo)M成的數(shù)組

int(*p)[3];

//首先從P處開(kāi)始,先與*結(jié)合,說(shuō)明P是一個(gè)指針然后再與[]結(jié)合(與_()_這步可以忽略,只是為了改變優(yōu)先級(jí)),說(shuō)明指針?biāo)赶虻膬?nèi)容是一個(gè)數(shù)組,然后再與int結(jié)合,說(shuō)明數(shù)組里的元素是整型的.所以P是一個(gè)指向由整型數(shù)據(jù)組成的數(shù)組的指針

int**p;

//首先從P開(kāi)始,先與*結(jié)合,說(shuō)是P是一個(gè)指針,然后再與*結(jié)合,說(shuō)明指針?biāo)赶虻脑厥侵羔?然后再與int結(jié)合,說(shuō)明該指針?biāo)赶虻脑厥钦蛿?shù)據(jù).由于二級(jí)指針以及更高級(jí)的指針極少用在復(fù)雜的類(lèi)型中,所以后面更復(fù)雜的類(lèi)型我們就不考慮多級(jí)指針了,最多只考慮一級(jí)指針.

解引用:

*p=10;

<1>.int*p;

//指針類(lèi)型是int*

<2>.char*p;

//指針類(lèi)型是char*

<3>.int**p;

//指針類(lèi)型是int**

<1>.int*p;

//指針指向的類(lèi)型是int

<2>.

char*p;

//指針指向的類(lèi)型是char

<3>.int**p;

//指針指向的類(lèi)型是int*

指針與數(shù)組的總結(jié)第3篇

***注意:“返回值類(lèi)型”說(shuō)明函數(shù)的返回類(lèi)型,“(指針變量名)”中的括號(hào)不能省,括號(hào)改變了運(yùn)算符的優(yōu)先級(jí)。若省略整體則成為一個(gè)函數(shù)說(shuō)明,說(shuō)明了一個(gè)返回的數(shù)據(jù)類(lèi)型是指針的函數(shù),后面的“形參列表”表示指針變量指向的函數(shù)所帶的參數(shù)列表。例如:

intfunc(intx);/*聲明一個(gè)函數(shù)*/

int(*f)(intx);/*聲明一個(gè)函數(shù)指針*/

f=func;/*將func函數(shù)的首地址賦給指針f*/

或者使用下面的方法將函數(shù)地址賦給函數(shù)指針:

f=&func;

1、定義一個(gè)函數(shù)指針;

2、將函數(shù)指針指向一個(gè)函數(shù);

3、調(diào)用這個(gè)函數(shù)指針?biāo)赶虻暮瘮?shù)。

指針與數(shù)組的總結(jié)第4篇數(shù)組中的各元素在內(nèi)存中是連續(xù)分布的,要想訪(fǎng)問(wèn)數(shù)組中某一元素,那么就必須知道其地址。

在一維數(shù)組中,數(shù)組A的元素A[i]的地址&A[i]=A+L*i,其中A為數(shù)組的標(biāo)識(shí)符(數(shù)組名),也可以用A來(lái)代表數(shù)組的首地址,L為數(shù)組A的數(shù)據(jù)類(lèi)型,由此可見(jiàn),對(duì)于一維數(shù)組,只需要知道數(shù)據(jù)類(lèi)型大小和索引i,就可以知道A[i]的地址,從而就可以訪(fǎng)問(wèn)A[i]了,這也是為什么一維數(shù)組的定義可以不指定數(shù)組大小,也不會(huì)妨礙數(shù)組元素的訪(fǎng)問(wèn)。

二維數(shù)組,實(shí)際上也是一維數(shù)組,只不過(guò)這個(gè)一維數(shù)組的每個(gè)元素都是一個(gè)一維數(shù)組。因此,將二維數(shù)組的每一行看做一個(gè)元素,很容易可以知道二維數(shù)組中各元素在內(nèi)存中是按行優(yōu)先進(jìn)行連續(xù)存儲(chǔ)的,如定義數(shù)組A[3][4],那么它在內(nèi)存中的存儲(chǔ)情況如下:

由此也可得到二維數(shù)組中元素A[i][j]的地址為&A[i][j]=A+L*(C*i+j),其中A為二維數(shù)組A的標(biāo)識(shí)符(數(shù)組名),也就是數(shù)組的首地址,L為數(shù)組元素的數(shù)據(jù)類(lèi)型,C為二維數(shù)組的列數(shù)。由此可見(jiàn),要知道二維數(shù)組中某一元素的地址,就必須知道數(shù)據(jù)類(lèi)型大小以及二維數(shù)組的列數(shù),這樣最終才能實(shí)現(xiàn)對(duì)二維數(shù)組元素的訪(fǎng)問(wèn),這也是為什么二維數(shù)組的定義必須指定列數(shù)。

指針與數(shù)組的總結(jié)第5篇建議:盡量避免使用指針和數(shù)組

指針和數(shù)組容易產(chǎn)生不可預(yù)料的錯(cuò)誤。其中一部分是概念上的問(wèn)題:指針用于低級(jí)操作,容易然生與繁瑣細(xì)節(jié)相關(guān)的(bookkeeping)錯(cuò)誤。其他錯(cuò)誤則源于使用指針的語(yǔ)法規(guī)則,特別是聲明指針的語(yǔ)法。

許多有用的程序都可不使用數(shù)組或指針實(shí)現(xiàn),現(xiàn)代C++程序采用vector類(lèi)型和迭代器取代一般的數(shù)組、采用string類(lèi)型取代C風(fēng)格字符串。

指針可能的取值

一個(gè)有效的指針必然是以下三種狀態(tài)之一:保存一個(gè)特定對(duì)象的地址;指向某個(gè)對(duì)象后面的另一對(duì)象;或者是0值。若指針保存0值,表明它不指向任何對(duì)象。未初始化的指針是無(wú)效的,直到給該指針賦值后,才可使用它。

指針初始化和賦值操作的約束

對(duì)指針進(jìn)行初始化或賦值只能使用以下四種類(lèi)型的值:

(1)0值常量表達(dá)式。

(2)類(lèi)型匹配的對(duì)象的地址。

(3)另一對(duì)象之后的下一地址。

(4)同類(lèi)型的另一個(gè)有效指針。

把int型變量賦給指針是非法的,盡管此int型變量的值可能為0。

void*指針

C++提供了一種特殊的指針類(lèi)型void*,它可以保存任何類(lèi)型對(duì)象的地址:

----void*表明該指針與一地址值相關(guān),但不清楚存儲(chǔ)在此地址上的對(duì)象的類(lèi)型。

----void*指針只支持幾種有限的操作:與另一個(gè)指針進(jìn)行比較;向函數(shù)傳遞void*指針或從函數(shù)返回void*指針;給另一個(gè)void*指針復(fù)制。

----不允許用void*指針操縱它所指向的對(duì)象。

一、解引用操作生成左值

二、關(guān)鍵概念:給指針賦值或通過(guò)指針進(jìn)行賦值

對(duì)于初學(xué)指針者,給指針賦值和通過(guò)指針進(jìn)行賦值這兩種操作的差別確實(shí)讓人費(fèi)解。謹(jǐn)記區(qū)分的重要方法是:如果對(duì)左操作數(shù)進(jìn)行解引用,則修改的是指針?biāo)赶虻闹?;如果沒(méi)有使用解引用操作,則修改的是指針本身的值。

三、指針和引用的比較

第一個(gè)區(qū)別在于引用總是指向某個(gè)對(duì)象:定義引用時(shí)沒(méi)有初始化是錯(cuò)誤的。第二個(gè)重要區(qū)別則是復(fù)制行為的差異:給引用賦值修改的是該引用所關(guān)聯(lián)的對(duì)象的值,而并不是使引用與另一個(gè)對(duì)象關(guān)聯(lián)。引用一經(jīng)初始化,就始終指向同一個(gè)特定對(duì)象(這就是為什么引用必須在定義時(shí)初始化的原因)。

四、指向指針的指針

指針本身也是可用指針指向的內(nèi)存對(duì)象。指針占用內(nèi)存空間存放其值,因此指針的存儲(chǔ)地址可存放在指針中。

五、C++還支持對(duì)這兩個(gè)指針做減法操作:

結(jié)果是4,這兩個(gè)指針?biāo)赶虻脑亻g隔為4個(gè)對(duì)象。兩個(gè)指針減法操作的結(jié)果是標(biāo)準(zhǔn)庫(kù)類(lèi)型ptrdiff_t的數(shù)據(jù)。與size_t類(lèi)型一樣,ptrdiff_t也是一種與機(jī)器相關(guān)的類(lèi)型,在cstddef頭文件中定義。size_t是unsigned類(lèi)型,而ptrdiff_t則是signed_t整型。

允許在指針上加減0,使指針保持不變。如果一指針具有0值,則在該指針上加0仍然是合法的,結(jié)果得到另一個(gè)值為0的指針。也可以對(duì)兩個(gè)空指針做減法操作,得到的結(jié)果仍是0。

六、解引用和指針?biāo)阈g(shù)操作之間的相互作用

在指針上加一個(gè)整型數(shù)值,其結(jié)果仍然是指針。允許在這個(gè)結(jié)果上直接進(jìn)行解引用操作,而不必先把它賦給一個(gè)新指針:

加法操作兩邊用圓括號(hào)括起來(lái)是必要的。如果寫(xiě)為:

意味著對(duì)ia進(jìn)行解引用,獲得ia所指元素的值ia[0],然后加4。

七、計(jì)算數(shù)組的超出末端指針

C++允許計(jì)算數(shù)組或?qū)ο蟮某瞿┒说牡刂?,但不允許對(duì)此地址進(jìn)行解引用操作。而計(jì)算數(shù)組超出末端位置之后或數(shù)組首地址之前的地址都是不合法的。

可使用此超出末端指針的當(dāng)做一個(gè)哨兵,如同在vector中使用的end變量一般,用于輸出和遍歷數(shù)組,這是一個(gè)好習(xí)慣

八、指針和const限定符

指向const對(duì)象的指針

const限定了cptr指針?biāo)赶虻膶?duì)象類(lèi)型,而并非cptr本身。也就是說(shuō),cptr本身并不是const。

不能使用void*指針保存const對(duì)象的地址,而必須使用constvoid*類(lèi)型的指針保存const對(duì)象的地址:

不能使用指向const對(duì)象的指針修改基礎(chǔ)對(duì)象,然而如果該指針指向的是一個(gè)非const對(duì)象,可用其他方法修改其所指的對(duì)象。

九、const指針

C++語(yǔ)言還提供了const指針——本身的值不能修改:

指向const對(duì)象的const指針,既不能修改所指對(duì)象的值,也不允許修改指針的指向。

C風(fēng)格字符串的標(biāo)準(zhǔn)庫(kù)函數(shù)(要使用這些標(biāo)準(zhǔn)庫(kù)函數(shù),必須包含相應(yīng)的C頭文件:cstring)

strlen(s)strcmp(s1,s2)strcat(s1,s2)

strcpy(s1,s2)strncat(s1,s2,n)strncpy(s1,s2,n)

注意:這些標(biāo)準(zhǔn)庫(kù)函數(shù)不會(huì)檢查其字符串參數(shù)

永遠(yuǎn)不要忘記字符串結(jié)束符null,調(diào)用者必須確保目標(biāo)字符串具有足夠的大小

如果必須使用C風(fēng)格字符串,則使用標(biāo)準(zhǔn)庫(kù)函數(shù)strncat和strncpy比strcat和strcpy函數(shù)更安全

對(duì)大部分的應(yīng)用而言,使用標(biāo)準(zhǔn)庫(kù)類(lèi)型string,除了增強(qiáng)安全性外,效率也提高了,因此應(yīng)該盡量避免使用C風(fēng)格字符串。

指針與數(shù)組的總結(jié)第6篇一維數(shù)組指針的定義方式如下:

inta[4]={1,2,3,4};

int*p=a;

這里定義了一個(gè)指針變量p,它指向一個(gè)整型變量,而a實(shí)際上也就是a的第一個(gè)元素a[0]的地址,因此p就指向了數(shù)組的第一個(gè)元素a[0]。那么p+1等于什么呢?實(shí)際上,p+1在數(shù)值上也就等于a+1,因此,p+1其實(shí)就是a[1]的地址,p+i就是a[i]的地址,這樣,就可以通過(guò)*(p+i)來(lái)訪(fǎng)問(wèn)a[i]的值了。如圖所示:

由此可以得出,對(duì)于一維數(shù)組的數(shù)組指針p,數(shù)組名p實(shí)際上是指向數(shù)組第一個(gè)元素的指針,即p為int*類(lèi)型,由于其指向int型數(shù)據(jù),因此(p+i)就相當(dāng)于在p的基礎(chǔ)上偏移了i*sizeof(int)的地址大小,就等于數(shù)組第i個(gè)元素的地址(i=0,1,2....)。

指針與數(shù)組的總結(jié)第7篇在理解訪(fǎng)問(wèn)數(shù)組的指針之前,我們不得不先理解另一個(gè)問(wèn)題:如果定義一個(gè)數(shù)組A,按前面所說(shuō),A就是數(shù)組第一個(gè)元素的首地址,那么A+1是什么意思呢?我在第一次遇到這個(gè)問(wèn)題的時(shí)候,第一反應(yīng)是A既然表示的是地址,那么A+1自然就是地址+1了呀!然而事實(shí)并非如此,我們先來(lái)做個(gè)測(cè)試如圖

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論