寫這篇文章的主要目的就是為了記錄下來平常我們用數組的時候不是很注意的問題!?。?/p>
- 下標越界
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;
}
|
上面這個程序會輸出b[10]=3;但是只要我們細心就可以發(fā)現,b[10]其實只包括了從b[0]~b[9]。那么這里的b[10]不就是越界了
嘛?。?!這個錯誤會讓緊接著b這個數組之后的內存被強行賦值為3!這當然是應該避免的了。但是由于標準的C++代碼不限制下標越界,雖然這樣做可以使代碼
的運行速度加快,效率提高,但是這會很容易地修改其他變量的值,而且不容易發(fā)現。解決辦法只有一個:我們應該經常留意數組的下標值是否在合理的范圍之內。 p.s. 由于本人用的是vs2008,貌似它會在運行的時候報錯,如下圖:

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

- 如何將數組傳遞給一個函數
在寫程序的時候,我們不可避免的會用到數組和函數,而且更常見的是在函數中隊數組進行一個操作。比如說求平均值啊之類的。而在C++中,規(guī)定了是不能將整
個數組傳遞給一個函數的,因為數組一般都非常大,如果我們在函數中還要賦值一個數組的副本,那內存開銷就會很大,這也就太對不起內存了。那怎么辦呢?其
實,我們只需要傳遞給函數數組第一個元素的地址,即數組名,然后就可以在這個函數中由這個數組名找到該數組,然后就可以對該數組進行操作了。傳遞數組名一
共有三種方式:
void func( int a[])
{
}
void func( int a[10])
{
}
void func( int *a)
{
}
|
由于上面這3種方法都告訴了編譯器將要受到一個指向整型變量的指針(原因:參見第二個黑點 ^_^),因此這三種方法都木有問題!下面,我們用一個程序來說明如何將數組傳遞到一個函數中:
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;
}
|
該程序的輸出為:

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