C語言指標 指標與陣列

2021-07-09 06:35:56 字數 2221 閱讀 3088

1、指標與一維陣列

2、指標與二維陣列

3、指標陣列與陣列指標

指標裡面最難的一種就是指標與陣列了,對於指標和二維陣列來說這裡面的關係比較複雜。牽涉到編譯器的原理和編譯過程。

1、指標與一維陣列

指標是指向乙個記憶體的位址,一維陣列的陣列名代表一塊記憶體(這個陣列)的首位址,和陣列首元素的位址一樣,但陣列名不等價與首元素的位址,陣列名代表一整塊位址,不僅僅是乙個元素。指標和陣列名都和位址有關係,這兩個有什麼區別呢?

如果僅僅是使用上來說,陣列名不能再被賦別的位址,因為它可以理解為是乙個指標常量(指向位址的內容可以修改,指向的位址無法修改),也可以理解為陣列名僅僅是乙個標號,在編譯的過程中,並沒有分配記憶體空間,只存在於符號表裡。

除了這些,正常使用時它和指標在使用上就沒有區別了。(編譯時,編譯器不會對指標訪問陣列越界處理,而通過陣列名越界會出錯)

總結:a作為右值時的等同於&a[0],表示陣列首元素的位址,而不是陣列的首位址,這僅僅是代表,並沒有乙個地方來儲存這個位址,也就是說編譯器並沒有為陣列a分配一塊記憶體來儲存其位址,這一點就與指標有很大的差別。但是在對資料的操作上可以認為大致等價。

2、指標與二維陣列

說這個複雜,其實也不太複雜,複雜就複雜在這裡有二維指標的概念。

同樣的,陣列名代表二維陣列的首位址,是一整塊記憶體的首位址。

訪問方式可以是**p *p[i] p[i][j]三種方式這裡p同樣可以換成陣列名

區別和上面差不多,只不過在將二維陣列名賦值給指標時,不能採用**p=a這種形式。

#include

int main(void);

//int (*ptr)[2]=a;

int*ptr[2]=;

//int

**ptr=(int

**)a;//有問題

3、指標陣列與陣列指標

這個也是最容易混淆的概念,當面對的是二維陣列是,這兩個作用一樣,都可以來接收二維陣列。

陣列指標:存放指標的陣列

指標陣列:指向陣列的指標

#include

int main(void);

int (*ptr)[3]=a;//指標陣列

//int

*ptr[2]=;//陣列指標

C語言指標陣列與陣列指標

初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...

C語言指標 指標與陣列

一 指標的運算 指標可以進行三種運算 1.指標加上整數 如果指標p指向陣列a i 那麼指標p j 指向a i j 前提是a i j 存在!2.指標減去整數 如果指標p指向陣列a i 那麼指標p j 指向a i j 前提 a i j 存在!3.兩個指標相加減 兩指標必須指向同一變數!否則運算沒有意義的...

C語言 陣列指標與指標陣列區別

陣列指標 也稱行指標 int p n 優先及高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。int a 3 2 int p 2 p a p 該語句執行後,也就是p p 1,p跨過a 0 指向了a 1 所以...