在使用陣列的時候,相信大多數人首先想到的是「陣列是從0開始的,陣列的下標必須大於或等於0」,但是在處理一些數值計算的問題的時候,很可能會遇到下標為負數的問題,比如,在做9/7浮點小波變換的時候會有:x(m) = x(-m) ,m<0,在這種情況下,當要迴圈迭代計算的時候,就需要判斷m是否為負數,這個還是有點麻煩的。
這個時候,如果我們知道m的最小值,比如-4的時候,就可以考慮直接讓陣列的下標為負數了,具體的操作是:為陣列x分配空間的時候,為其多分配4個位置,然後宣告乙個指標指向x+4,然後讓b(-i) = b(i) ,i屬於[1,4],這樣就可以在用到x的地方用b替代之,而不用檢查下標的值了。但是,在這麼做的時候一定要注意不要越界。
這種用法的根據是c語言對陣列和下標操作符的定義,c語言的陣列其實是指標,而下標運算子其實解釋成了指標加上偏移量,只是偏移量的單位是該指標的型別。
比如,int a[20][43],a[4][7]等價於a+4*43+7,這就可以解釋為什麼上面的b[-3]為什麼行得通了,b=x+4,則b[-3]等價於x+4-3,其實是陣列x的第二個元素。
關於下標運算子的更深的闡述可以看看
c語言陣列下標為負數
c語言中陣列的下標可以是負號,在 執行前不會對陣列是否下標越界 溢位等異常進行警告或處理,因此需人為干預。測試 include include int main int argc,char ar int p int offset if argc 2 offset atoi ar 1 else off...
陣列下標為0
長度為0的陣列 c語言的非標準用法之一 在標準c和c 中,長度為0的陣列是被禁止使用的。不過在gnu c中,存在乙個非常奇怪的用法,那就是長度為0的陣列,比如array 0 很多人可能覺得不可思議,長度為0的陣列是沒有什麼意義的,不過在這兒,它表示的完全是另外的一層意思,這個特性是不可移植的,所以,...
陣列下標越界
原理 因為c語言不會檢測陣列下標,所以如果我們給陣列乙個超出它大小的下標,就會照成陣列越界。如果是想陣列中寫入資料的話,就會造成資料寫入到不屬於陣列的地方,或者說如果讀取資料的話,就會讀取到別的地方的資料。因為陣列位址是自低往高增長,而棧的位址是自高向下降低,所以如果我們將陣列下標根據棧內的空間的分...