一、數(shù)組作為函數(shù)參數(shù):
int sum_arr(int arr[],int n);
注意,arr實(shí)際上并不是數(shù)組,而是一個(gè)指針!C++將數(shù)組名解釋為其第一個(gè)元素的地址,因此函數(shù)傳遞的是地址。也可以這樣聲明函數(shù)頭:
int sum_arr(int * arr,int n);
在C++中,當(dāng)且僅當(dāng)用于函數(shù)原型或函數(shù)頭中,int * arr和int arr[]的含義才相同。通常,當(dāng)指針指向數(shù)組的第一個(gè)元素時(shí),采用數(shù)組表示法;當(dāng)指針指向一個(gè)獨(dú)立的值時(shí),采用指針表示法。
數(shù)組名與指針對(duì)應(yīng)的利弊:
首先,將數(shù)組地址作為參數(shù)可以節(jié)省復(fù)制整個(gè)數(shù)組所需的時(shí)間和內(nèi)存。如果數(shù)組很大,則使用拷貝的系統(tǒng)開(kāi)銷(xiāo)將非常大,另一方面,使用原始數(shù)據(jù)增加了破壞數(shù)據(jù)的危險(xiǎn)性。
二、數(shù)組保護(hù)
由于函數(shù)參數(shù)傳遞是值傳遞,若將數(shù)組作為參數(shù),實(shí)際上是傳遞地址,形參將是地址的拷貝,對(duì)其指向的數(shù)據(jù)進(jìn)行操作將訪問(wèn)原數(shù)組,而不是其拷貝。
由于會(huì)增加破壞原始數(shù)組的危險(xiǎn)性,為防止函數(shù)中無(wú)意修改了數(shù)組內(nèi)容,可在聲明形參時(shí)用const限定:
int sum_arr(const int arr[],int n);
表明,arr指向的是常量數(shù)組,不可以使用arr對(duì)數(shù)據(jù)進(jìn)行修改,即為只讀。解釋為const int * arr更好理解。
三、使用數(shù)組區(qū)間:采用兩個(gè)指針,并遵照“超尾”原則,即對(duì)于數(shù)組而言,標(biāo)記數(shù)組結(jié)尾的參數(shù)將是指向最后一個(gè)元素后面的指針,例如如下函數(shù)定義:
int sum_arr(const int * begin,const int * end)
{
const int * pt;
int total = 0;
for(pt = begin;pt!=end;pt++)
total = total + *pt;
return total;
}
四、指針與const
兩種情況:讓指針指向一個(gè)常量對(duì)象,可以防止使用該指針來(lái)修改所指向的值。此時(shí),并不意味著指向的值實(shí)際上就是一個(gè)常量,只是對(duì)指針而言,這個(gè)值是個(gè)常量。這個(gè)值可以通過(guò)變量本身修改值,但不能通過(guò)指針去修改:
const int * pt = &age;//此時(shí)*pt是常量
另一種情況是,指針本身是常量,可以防止改變指針指向的位置:
int * const ps = &age;//此時(shí)ps是常量
C++禁止將const值的地址賦給非const指針。這樣將可以通過(guò)非const指針修改const值。
原則:盡可能在數(shù)組作為參數(shù)時(shí)使用const:
1、避免無(wú)意間修改數(shù)據(jù)導(dǎo)致錯(cuò)誤;
2、使用const使得函數(shù)能夠處理const和非const實(shí)參,否則只能接受非const數(shù)據(jù)。
五、二維數(shù)組
ar2[r][c] == *(*(ar2+r)+c)
六、函數(shù)指針:分層設(shè)計(jì),方便切換等作用
1、獲取函數(shù)地址:傳遞函數(shù)名
2、聲明函數(shù)指針:
double pam(int);
double (*pf)(int);
pf = pam;
或直接:double (*pf)(int) = pam;
3、通過(guò)指針調(diào)用函數(shù):將(*pf)看作函數(shù)名,如:
double y = pf(5);
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注