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

下載本文檔

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

文檔簡介

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

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

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

故數(shù)組中的多個變量雖然必須單獨訪問,但是因為它們的地址相連,因此可以用指針來操作。

對數(shù)組中幾個關(guān)鍵符號(aa[0]&a&a[0])的理解:

以inta[10]為例

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

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

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

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

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

做右值時表示a[0]的值

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

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

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

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

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

int*p=a;

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

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

或者也可以采用p[i]來訪問數(shù)組,p[i]==a[i]

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

1.指針數(shù)組

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

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

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

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

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

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

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

inta=1;

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

intp;

//這是一個普通的整型變量

int*p;

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

intp[3];

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

int*p[3];

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

int(*p)[3];

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

int**p;

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

解引用:

*p=10;

<1>.int*p;

//指針類型是int*

<2>.char*p;

//指針類型是char*

<3>.int**p;

//指針類型是int**

<1>.int*p;

//指針指向的類型是int

<2>.

char*p;

//指針指向的類型是char

<3>.int**p;

//指針指向的類型是int*

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

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

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

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

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

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

f=&func;

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

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

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

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

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

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

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

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

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

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

指針可能的取值

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

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

對指針進行初始化或賦值只能使用以下四種類型的值:

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

(2)類型匹配的對象的地址。

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

(4)同類型的另一個有效指針。

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

void*指針

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

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

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

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

一、解引用操作生成左值

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

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

三、指針和引用的比較

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

四、指向指針的指針

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

五、C++還支持對這兩個指針做減法操作:

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

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

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

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

加法操作兩邊用圓括號括起來是必要的。如果寫為:

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

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

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

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

八、指針和const限定符

指向const對象的指針

const限定了cptr指針?biāo)赶虻膶ο箢愋停⒎莄ptr本身。也就是說,cptr本身并不是const。

不能使用void*指針保存const對象的地址,而必須使用constvoid*類型的指針保存const對象的地址:

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

九、const指針

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

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

C風(fēng)格字符串的標(biāo)準(zhǔn)庫函數(shù)(要使用這些標(biāo)準(zhǔn)庫函數(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)庫函數(shù)不會檢查其字符串參數(shù)

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

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

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

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

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

int*p=a;

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

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

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

溫馨提示

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

評論

0/150

提交評論