指標和陣列 C專家程式設計筆記

2021-09-06 03:37:49 字數 1029 閱讀 1996

對於編譯器而言,乙個陣列就是乙個位址,乙個指標就是乙個位址的位址。

什麼時候陣列和指標是相同的:

1、表示式中的陣列名(與宣告不同)被編譯器當作乙個指向該陣列第乙個元素的指標(在表示式中,指標和陣列是可以互換的,因為它們在編譯器裡的最終形式都是指標,並且都可以去下標操作.例對陣列的引用如a[i]在編譯時總是被編譯器改寫成*(a+i)的形式);

2、下標總是與指標的偏移量相同;

3、在函式引數的宣告中,陣列名被編譯器當作指向該陣列第乙個元素的指標。

另外,對第一點的解釋:存在幾個極少見的例外,就是把陣列當作乙個整體來使用。

如下列情況:

1、陣列作為sizeof的運算元-顯然 此時需要的是整個陣列的大小,而不是指向第乙個元素的大小;

2、使用&操作符取陣列的位址(原因:乙個陣列就是乙個位址,乙個指標就是乙個位址的位址);

3、陣列是乙個字串(或寬字串)常量初始值。

編譯器自動把下標值的步長調整到陣列元素的大小。

對起始位址執行加法操作之前,編譯器會負責計算每次增加的步長。這就是為什麼指標總是有型別限制,每個指標只能指向同一種型別的原因所在-因為編譯器需要知道對指標進行解除引用操作時應該取幾個位元組,以及每個下標的步長應取幾個位元組。

步長計算方法:偏移量乘以每個陣列元素所佔位元組數,計算結果就是偏移陣列起始位址的實際位元組數。步長因子常常是2的乘方(如int是4個位元組,double是8個位元組)這樣編譯器在計算時就可以使用快速的左移位運算,而不是相對緩慢的加法運算。

c語言把陣列下標改寫成指標偏移量的根本原因是是真和偏移量是底層硬體所使用的基本模型。亦即是,在底層硬體中,都是使用指標來訪問資料的(如前面說的,編譯器都會把改寫成指標形式)。

對於多維陣列的方位ca[i][j],編譯為*(*(ca+i)+j)。

只有字串常量才可以初始化指標陣列,指標陣列不能由非字串的型別直接初始化。

int (*ga)[20] 是被翻譯成乙個指向20個元素的的int陣列的指標,而不是乙個20個指標元素的陣列。

也可以參考本博博文多維陣列(陣列的陣列)及指針對其訪問

C程式設計 指標和陣列

1.a nsi c 使用型別void 代替char 作為通用指標型別,即乙個指向void型別的指標可以存放任何型別的指標,但它不能間接引用其自身 2.指標和整數之間不能相互轉換,但0是唯一的例外 常量0可以賦值給指標,指標也可以與常量0比較。程式中常用常量null代替0,符號常量null定義在標準標...

《C語言筆記 指標陣列和陣列指標》

一,從字面意思來理解指標陣列和陣列指標 1,指標陣列 實質是乙個陣列,這個陣列裡存放的元素是指標。2,陣列指標 實質是乙個指標,這個指標指向乙個陣列。二,分析指標陣列和陣列指標的表示式 int p 5 int p 5 int p 5 1,先說說一般規律。int p p是乙個指標 int p 5 p是...

《C專家程式設計》讀書筆記之 指標與陣列

陣列並非指標 c初學者都會認為陣列與指標是相同的,的確在很多情況下是可以這樣認為,但是這是有條件的 先看下面宣告 int a 100 然後在引用 extern int a 然後程式會報錯。讓我們先了解宣告和定義的區別 1.宣告相當於普通的宣告 它所說的並非自身,而是描述其他地方建立的物件,可以出現多...