C語言陣列居然有 1 下標?

2021-09-19 08:13:12 字數 869 閱讀 3625

1.背景

最近在查閱**(c)時出現類似「a[-1]」的操作,以過往的經驗,覺得是非法的訪問陣列操作,第一反應就是不存在這樣的語句,連編譯都通不過。實質上,這是完全沒問題的語句,編譯和執行都是不存在問題,當然也可能與編譯器相關。

void fun(char *a)

2.a[-1]涵義

2.1 案例分析

「」一般用於陣列下標訪問,而陣列下標是從0開始,所以a[-1]的語句一眼看上去比較彆扭。對於上面函式,a是函式fun的形參,a為指標(位址),上面函式呼叫時,列印的就結果應該是傳入實參的首位址存放的內容。假如傳入字串str=「abcd」,則列印結果為「a」。

2.2 涵義

a[-1]表示區a當前位址相前偏移1個位址內容。當然,前提有效位址範圍,如果a指向首位址,則a[-1]會訪問越界位址,導致意想不到的後果。因此,a[-1]中的「-1」表示的是位址偏移的意思,即相當於*( a - 1 )同理可以有a[-2]、a[-3]、a[-n]。

2.3 a[+1]

a="abcdef";*a = 'a';

則a[+1] = 'b';

a[+2] = 'c';

假如*a=『c』;

則a[+1] = 'd';

a[+2] = 『e』;

從上述可以發現,當a指向首位址(相對)時,a[+1]與常規的陣列下標訪問a[1]的作用是相同的。

3.總結

對於非常用的寫法,需要了解,但建議還是堅持通俗易懂的語句,提高程式可讀性。

C語言陣列練習1

1.通過輸入一系列商品的 求出總商品的 include void main printf 所有商品的合計費用 2f n total 2.輸入學生學號與成績,並顯示出來。include void main printf n 學員的學號及其兩面三刀個學期的成績為 printf n t學號 t第一學期 t...

c語言 陣列學習總結(1)

陣列 array 就是一些列具有相同型別的資料的集合。c語言陣列屬於構造資料型別。乙個陣列可以分解為多個陣列元素,這些陣列元素可以是基本資料型別或是構造型別。因此按陣列元素的型別不同,陣列又可分為數值陣列 字元陣列 指標陣列 結構陣列等各種類別。陣列的定義 datatype arrayname le...

C語言 陣列與指標有哪些區別?

陣列與指標是不等價的,如 陣列名的指向不可以改變,而指向陣列的指標是可以改變的。請看如下 include int main void p a char i 陣列遍歷方式一 for i 0 i 5 i 陣列遍歷方式二 for i 0 i 5 i return 0 陣列遍歷方式二 使用陣列名自增遍歷陣列...