C語言中指標和陣列分析 下

2021-08-19 14:18:06 字數 2638 閱讀 7778

--事物的難度遠遠低於對事物的恐懼!

陣列名可以當做常量指標使用,那指標是否也可以當做陣列名來使用呢?為了說明這個問題,我們先來看看陣列的兩種訪問方式,對於陣列int array[5] = ;訪問方式有:

-下標形式: array[1] = 2;

-指標形式:*(array + 1) = 2;

兩種訪問方式的比較:

-指標以固定增量在陣列中移動是,效率高於下標訪問形式

-指標增量為1且硬體具有硬體啊增量 模型時,效率更高

-指標 形式與下標下標形式的轉換:

a[n] -> *(a + n) -> *(n + a) -> n[a]

雖然說理論上指標形式訪問比下標形式效率更高,但是現代編譯器的優化率已經相當高,指標與下標兩種訪問形式效率已經相當了,但是下標訪問形式更利於**的可讀性和可維護性。

知道了陣列的兩種訪問方式,我們來看看下邊的**:

#include int main()

; int* p = a;

int i = 0;

for(i=0; i<5; i++)

for(i=0; i<5; i++)

printf("\n");

for(i=0; i<5; i++)

for(i=0; i<5; i++)

return 0;

}

執行的輸出結果為,從輸出結果來看,陣列確實可以通過指標和下標兩種方式去訪問:

下邊來看乙個比較容易出錯也比較有意思的知識點:對於乙個陣列 int array[5],array 和&array有什麼區別?

-array為陣列首元素的位址

-&array為整個陣列的位址

-array 與 &array的值相同,但是代表的意義不同,主要區別在於它們的指標運算

為了更深的理解上邊的內容,下邊以一段**來展示:

#include int main()

; int* p1 = (int*)(&a + 1);

int* p2 = (int*)((int)a + 1);

int* p3 = (int*)(a + 1);

printf("%d, %d, %d\n", p1[-1], p2[0], p3[1]);

return 0;

}//以上**,下邊那個輸出是正確的?

// a. 陣列下標不能是負數,程式無法執行

// b. p1[-1]將輸出隨機數,p2[0]輸出2, p3[1]輸出3

// c. p1[-1]將輸出亂碼, p2[0]和p3[1]輸出2

下邊我們來編譯執行一下:

從輸出結果來看,好像三個選項都沒有符合的,下邊我們來逐一分析下:

- 第乙個輸出:由於我們是將&a + 1 賦值給p1指標,所以p1指標就指向了陣列的末端,那麼p[-1] -> *(p-1)是不是就指向前乙個陣列元素呢?也就是值為5的那個元素,對沒錯,就是這樣的,現在理解了嗎?

- 第二個輸出:陣列名a代表首元素的位址,但是我們做了(int)a + 1這樣的處理,實際就是將首元素的位址轉換成普通整數,普通整在加1,就是很普通的數值運算,假如a = 0xaabbccd0,那麼(int)a + 1 -> 0xaabbccd1,以這個值作為記憶體位址去取值,得到的肯定是隨機數或亂碼。

- 第三個輸出:這個比較容易理解,p3指向陣列元素a[1], p3 + 1就指向陣列元素a[2],得到的值也就是3。

下邊我們來說說陣列引數

-陣列作為函式引數時,編譯器將其編譯成對應的指標

void fun(int a) -> void fun(int *a)

void fun(int a[5]) -> void fun(int *a)

即陣列作為函式引數時,函式內部是不知道陣列的大小的,所以一般情況下,函式傳入陣列引數的同時,需要另外定義乙個引數來標示陣列大小。

總結:

-陣列名和指標僅僅是可以互動使用,陣列名不是指標,指標的本質也不是陣列

-陣列名是陣列首元素的位址,不是陣列的位址

-函式的陣列引數退化為指標

C語言中指標和陣列分析 上

事物的難度遠遠低於對事物的恐懼!這章我們來分析下指標和陣列,在前兩章我們談了陣列和指標,我們知道 陣列的本質 陣列是一段連續的記憶體空間 陣列的空間大小為sizeof array type array size 陣列名可看做指向陣列第乙個元素的常量指標 那麼我們來看乙個問題 對於乙個陣列 int a...

C語言中指標和陣列

首先,明確乙個概念,指標是什麼,一旦提到這個老生常談且富有爭議性的話題,那真是1000個人有1000種看法。在國內的很多教材中,給出的定義一般就是 指標就是位址 從初步理解指標的角度來說,這種說法是最容易理解的,但是這種說法明顯有它的缺陷所在。指標就是位址 這種說法相當於 指標 字面值位址 或者說乙...

C語言中指標和陣列的區別

看 c專家程式設計 一書,看到陣列與指標並不相同一章,遂做了一段測試 include include int main void 輸出 可以看到這樣的輸出,結果很顯然 第乙個輸出的值,0028ff24,應該是符號表中p的位址。第二個值,00403000,是位址0028ff24中儲存的值,也就是指標p...