![指針與數(shù)組的總結(jié)_第1頁(yè)](http://file4.renrendoc.com/view14/M02/12/1B/wKhkGWab85-AexXjAAH70vGcr-M373.jpg)
![指針與數(shù)組的總結(jié)_第2頁(yè)](http://file4.renrendoc.com/view14/M02/12/1B/wKhkGWab85-AexXjAAH70vGcr-M3732.jpg)
![指針與數(shù)組的總結(jié)_第3頁(yè)](http://file4.renrendoc.com/view14/M02/12/1B/wKhkGWab85-AexXjAAH70vGcr-M3733.jpg)
![指針與數(shù)組的總結(jié)_第4頁(yè)](http://file4.renrendoc.com/view14/M02/12/1B/wKhkGWab85-AexXjAAH70vGcr-M3734.jpg)
![指針與數(shù)組的總結(jié)_第5頁(yè)](http://file4.renrendoc.com/view14/M02/12/1B/wKhkGWab85-AexXjAAH70vGcr-M3735.jpg)
版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年頭孢他啶項(xiàng)目可行性研究報(bào)告
- 農(nóng)網(wǎng)配電營(yíng)業(yè)工習(xí)題(附答案)
- 管理學(xué)原理復(fù)習(xí)題(附答案)
- 2025年新高考藝術(shù)生數(shù)學(xué)突破講義 專(zhuān)題24 立體幾何基礎(chǔ)提分小題
- 贛州師范高等專(zhuān)科學(xué)?!冻踔薪處煿ぷ鲗?shí)務(wù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 四川國(guó)際標(biāo)榜職業(yè)學(xué)院《房屋建筑學(xué)課程設(shè)討》2023-2024學(xué)年第二學(xué)期期末試卷
- 現(xiàn)代制作藝術(shù)中的科技美學(xué)探討
- 農(nóng)村養(yǎng)殖申請(qǐng)書(shū)范文
- 南開(kāi)大學(xué)《廣告學(xué)概論》2023-2024學(xué)年第二學(xué)期期末試卷
- 吉安職業(yè)技術(shù)學(xué)院《軟件工程和軟件測(cè)試基礎(chǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- LED大屏技術(shù)方案(適用于簡(jiǎn)單的項(xiàng)目)
- 城市自來(lái)水廠(chǎng)課程設(shè)計(jì)
- 重慶市2024年小升初語(yǔ)文模擬考試試卷(含答案)
- 2024智慧城市數(shù)據(jù)采集標(biāo)準(zhǔn)規(guī)范
- Lesson 6 What colour is it(教學(xué)設(shè)計(jì))-2023-2024學(xué)年接力版英語(yǔ)三年級(jí)下冊(cè)
- 歷年國(guó)家二級(jí)(Python)機(jī)試真題匯編(含答案)
- 第五單元任務(wù)二《準(zhǔn)備與排練》教學(xué)設(shè)計(jì) 統(tǒng)編版語(yǔ)文九年級(jí)下冊(cè)
- 虧損企業(yè)減虧專(zhuān)項(xiàng)治理方案
- 《垃圾發(fā)電廠(chǎng)爐渣處理技術(shù)規(guī)范》
- 設(shè)計(jì)質(zhì)量、進(jìn)度、服務(wù)保證措施
- 2024北京海淀高三一模英語(yǔ)試卷(含參考答案)
評(píng)論
0/150
提交評(píng)論