版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度智能化魚塘承包經(jīng)營一體化服務(wù)合同4篇
- 2025年度農(nóng)業(yè)化肥環(huán)保技術(shù)研發(fā)與應(yīng)用合同4篇
- 二零二五年度工業(yè)廠房出租與綠色建筑運營合同
- 2025年度美甲店技師星級評定及獎勵合同
- 2025年度個人二手房交易合同模板智能家居改造版2篇
- 2025年度南京環(huán)保項目污染治理工程承包合同4篇
- 2025年度美術(shù)館東館館舍租賃藝術(shù)展覽策劃與推廣合同4篇
- 二零二五年度農(nóng)業(yè)科技研發(fā)農(nóng)副業(yè)承包合同書模板4篇
- 2025年度農(nóng)家樂房屋租賃合同及可持續(xù)發(fā)展承諾協(xié)議4篇
- 2025年度門診部醫(yī)療廢物處理設(shè)施運營管理合同
- 藥娘激素方案
- 提高靜脈留置使用率品管圈課件
- GB/T 10739-2023紙、紙板和紙漿試樣處理和試驗的標(biāo)準(zhǔn)大氣條件
- 《心態(tài)與思維模式》課件
- C語言程序設(shè)計(慕課版 第2版)PPT完整全套教學(xué)課件
- 行業(yè)會計比較(第三版)PPT完整全套教學(xué)課件
- 值機業(yè)務(wù)與行李運輸實務(wù)(第3版)高職PPT完整全套教學(xué)課件
- 高考英語語法填空專項訓(xùn)練(含解析)
- 危險化學(xué)品企業(yè)安全生產(chǎn)標(biāo)準(zhǔn)化課件
- 《美的歷程》導(dǎo)讀課件
- 心電圖 (史上最完美)課件
評論
0/150
提交評論