寫這篇文章的主要目的就是為了記錄下來平常我們用數(shù)組的時(shí)候不是很注意的問題!?。?/p>
- 下標(biāo)越界
1 2 3 4 5 6 7 8 | #include <iostream>
using namespace std;
int main()
{
int b[10];
b[10]=3;
cout<< "b[10]=" <<b[10]<<endl;
}
|
上面這個(gè)程序會輸出b[10]=3;但是只要我們細(xì)心就可以發(fā)現(xiàn),b[10]其實(shí)只包括了從b[0]~b[9]。那么這里的b[10]不就是越界了
嘛?。?!這個(gè)錯(cuò)誤會讓緊接著b這個(gè)數(shù)組之后的內(nèi)存被強(qiáng)行賦值為3!這當(dāng)然是應(yīng)該避免的了。但是由于標(biāo)準(zhǔn)的C++代碼不限制下標(biāo)越界,雖然這樣做可以使代碼
的運(yùn)行速度加快,效率提高,但是這會很容易地修改其他變量的值,而且不容易發(fā)現(xiàn)。解決辦法只有一個(gè):我們應(yīng)該經(jīng)常留意數(shù)組的下標(biāo)值是否在合理的范圍之內(nèi)。 p.s. 由于本人用的是vs2008,貌似它會在運(yùn)行的時(shí)候報(bào)錯(cuò),如下圖:

- 輸出數(shù)組名
假如我們聲明的數(shù)組為a,那么編譯器就會自動生成一個(gè)指向該數(shù)組的指針,而且該指針保存的是數(shù)組第一個(gè)元素的內(nèi)存地址。相當(dāng)于程序中添加這樣一行代碼:int *a=&a[0];程序如和輸出如下圖:

- 如何將數(shù)組傳遞給一個(gè)函數(shù)
在寫程序的時(shí)候,我們不可避免的會用到數(shù)組和函數(shù),而且更常見的是在函數(shù)中隊(duì)數(shù)組進(jìn)行一個(gè)操作。比如說求平均值啊之類的。而在C++中,規(guī)定了是不能將整
個(gè)數(shù)組傳遞給一個(gè)函數(shù)的,因?yàn)閿?shù)組一般都非常大,如果我們在函數(shù)中還要賦值一個(gè)數(shù)組的副本,那內(nèi)存開銷就會很大,這也就太對不起內(nèi)存了。那怎么辦呢?其
實(shí),我們只需要傳遞給函數(shù)數(shù)組第一個(gè)元素的地址,即數(shù)組名,然后就可以在這個(gè)函數(shù)中由這個(gè)數(shù)組名找到該數(shù)組,然后就可以對該數(shù)組進(jìn)行操作了。傳遞數(shù)組名一
共有三種方式:
void func( int a[])
{
}
void func( int a[10])
{
}
void func( int *a)
{
}
|
由于上面這3種方法都告訴了編譯器將要受到一個(gè)指向整型變量的指針(原因:參見第二個(gè)黑點(diǎn) ^_^),因此這三種方法都木有問題!下面,我們用一個(gè)程序來說明如何將數(shù)組傳遞到一個(gè)函數(shù)中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include<iostream>
float Average( const float *, int );
int main()
{
float a[100],average,num=100;
int i,total=100;
for (i=0;i<100;++i)
{
a[i]=num;
num++;
}
average= Average(a,total);
std::cout<< "100-199的平均值為" <<average<<std::endl;
return 0;
}
float Average( const float *a, int total)
{
int i;
float sum=0.0,b;
for (i=0;i<total;++i)
{
sum=sum+a[i];
}
b=sum/total;
return b;
}
|
該程序的輸出為:

- 刪除堆中的數(shù)組
如果我們利用new在堆中聲明了一個(gè)數(shù)組,比如說下面這句話聲明了一個(gè)有1000個(gè)area對象組成的數(shù)組,而通過調(diào)用關(guān)鍵字new操作符來把整個(gè)數(shù)組創(chuàng)建在堆中:
area *one= new area[1000];
|
而刪除數(shù)組one的時(shí)候我們需要調(diào)用下面這句話:
這句話表示刪除數(shù)組中的每個(gè)對象。所以說,在堆中刪除一個(gè)數(shù)組十分簡單,我們只需要輸入delete[],然后再后面加上數(shù)組名就可以了。但是,應(yīng)該注意的一點(diǎn)是:千萬不要寫成delete one;或者是delete one[]。因?yàn)?strong>[]表示我們刪除的是一個(gè)數(shù)組,如果你忘記輸入[],那么刪除的只是one[0]。這樣就會帶來內(nèi)存泄露哈??!特別注意!??!
|