c語言中的指標和陣列

2021-07-16 17:05:37 字數 3563 閱讀 6091

最近在複習c語言,看了c primer plus 這本書,對其中難以理解的陣列和指標有一些自己小小的體會,現記錄下來。

指標和一維陣列:

#include int urn[5] = ;

int main(void)

// 輸出結果如下:

/*pointer value, dereferenced pointer, pointer address:

ptr1 = 00407000, *ptr1 = 100, &ptr1 = 0061ff08

adding an int to a pointer:

ptr1 + 4 = 00407010, *(ptr1 + 3) = 400

value after ptr1++:

ptr1 = 00407004, *ptr1 = 200, &ptr1 = 0061ff08

value after ptr2--:

ptr2 = 00407004, *ptr2 = 200, &ptr2 = 0061ff04

pointers reset to original values.

ptr1 = 00407000, ptr2 = 00407008

subtracting one pointer from another.

ptr1 = 00407000, ptr2 = 00407008

, ptr2 - ptr1 = 2

subtracting an int from a pointer.

ptr3 = 00407010, ptr3 - 2 = 00407008

*/

其中使我更加深刻的理解了指標與陣列配合的工作機制:

1,最基本的,一維陣列名就是它的首位址,當以陣列為實際引數傳遞給其他函式時,其他函式的形式參量實際就是指向陣列元素的指標型別,而此時傳遞實際引數時,就可以直接傳遞陣列名。

2,可以對指向陣列元素的指標做增量運算,(可以使用自增運算子),因為指標本身是變數

3,當對指向陣列的指標做加法運算時(加乙個常數時),表示的是這個常數與指標所指的資料型別相乘後加到原始位址上

4,也可以做減法運算,可以減去乙個整數,結論同上;也可以減去指向同一陣列中較小的指標,注意不要越界,剩下的整數即為這個陣列中兩個指標指向元素之間的距離,注意並不一定是實際距離,這個距離指的是元素的個數。

指標和多維陣列:

#include int main(void)

, , , };

printf(" zippo = %p, zippo + 1 = %p.\n", zippo, zippo + 1); // 列印二維陣列名的內容(即其所指向的位址)

printf(" zippo[0] = %p, zippo[0] + 1 = %p.\n", zippo[0], zippo[0] + 1);

printf(" *zippo = %p, *zppo + 1 = %p.\n", *zippo, *zippo + 1);

printf(" zippo[0][0] = %d\n", zippo[0][0]);

printf(" *zippo[0] = %d\n", *zippo[0]);

printf(" **zippo = %d\n", **zippo);

printf(" zippo[2][1] = %d.\n", zippo[2][1]);

printf("*(*(zippo + 2) + 1) = %d.\n", *(*(zippo + 2) + 1));}/*

zippo = 0061fef0, zippo + 1 = 0061fef8.

zippo[0] = 0061fef0, zippo[0] + 1 = 0061fef4.

*zippo = 0061fef0, *zppo + 1 = 0061fef4.

zippo[0][0] = 2

*zippo[0] = 2

**zippo = 2

zippo[2][1] = 3.

*(*(zippo + 2) + 1) = 3.

*/

指標和多維陣列這裡主要討論二維陣列,相較於一維陣列,二維陣列麻煩多了,而且一不小心就被繞進去,當初也是花了很多時間才稍有理解。

由上面**即輸出結果可得

1, zippo 和 zippo[0] 和 *zippo 中所儲存的位址值是一樣的。 但我知道這不是一種巧合,因為zippo是二維陣列名,實際上它儲存的內容是含有兩個int型元素的陣列的位址,而zippo[0],

實際上,它儲存的是乙個int型數的位址,用符號表示即 zippo = &zippo[0], zippo[0] = &zippo[0][0], 所以zippo儲存的是兩個整數大小的物件的,而zippo[0]實際上    儲存的是乙個整數大小的物件的位址,但是由兩個int型數和乙個int型數組成的陣列都開始於同一位址,所以zippo才會和zippo[0]中所儲存的位址是同乙個。

2,  由於zippo相當於指向了含有兩個int型元素陣列,所以當想要訪問zippo[0][0],即整個二維陣列的第乙個元素時,需要用 **zippo。

原因如下:

zippo = &zippo[0], 所以*zippo = *&zippo[0] 即 *zippo = zippo[0],

然而實際上zippo[0]中存放的也是位址,只不是是乙個int型數的位址,所以此時 *zzipo只能訪問到乙個int型數的位址。

所以由 zippo[0] = &zippo[0][0] 可得 *zippo[0] = zippo[0][0],而*zippo[0] = **zippo,

所以可得**zippo = zippo[0][0];

這樣才訪問到了二維陣列中第乙個元素的內容。

3, 由第一點,因為zippo是二維陣列名,實際上它儲存的內容是含有兩個int型元素的陣列的位址,而zippo[0],實際上,它儲存的是乙個int型數的位址,用符號表示即 zippo = &zippo[0], zippo[0] = &zippo[0][0],                      所以zippo儲存的是兩個整數大小的物件的,而zippo[0]儲存的是乙個整數大小的物件的位址,所以才有了下面zippo + 1 的內容比 zippo 的內容大 ox8。相應的(zippo[0] + 1)比zippo[0]大 ox4;

總結:實際上,zippo的內容是&zippo[0],而zippo[0]的內容是&zippo[0][0],他們或許本來應該不一樣的,zippo可以說是乙個指向指標的指標,而zippo[0]  只是乙個簡單的指向乙個int元素的指標,但是關鍵的地方是,zippo中存放的內容和zippo[0]中存放的內容相等,也就是說他們實際上指向的是同一塊區域,這是為什麼? 是因為二維陣列的開始就是第一行第一列的那個元素,也就是zippo[0][0]的位址,無論多少重指標指向它,所得的內容還是這個元素的位址,(即使是zippo[0][0][0],zippo[0][0][0][0]還是同乙個元素),所以實際上zippo[0]在某種程度上來說就是zippo[0][0],但因為它是第一行的陣列的陣列名,所以它裡面的元素是&zippo[0][0]而已。

C語言中的指標和陣列

指標和陣列關係密切。不帶下標的陣列名實際上就是指向陣列第乙個元素的指標。char p 0 以下兩句完全等價 p,p 0 換言之,也就是 p p 0 為真,因為陣列第一元素的位址也就是陣列的位址。觀察下面程式,p1和p2實際指向同乙個記憶體位址。在指向某陣列元素的指標上加或減去乙個整數,就可以指向另乙...

C語言中的指標和陣列

下面的內容節選自由我所執筆的會議記錄。對於本文的不足之處,各位可以提出自己的看法。q1 指標和陣列到底是怎麼一回事?a 指標和陣列有本質的不同。指標就是乙個記憶體位址,在32位系統下,乙個指標永遠佔4個位元組 陣列是一塊連續的記憶體空間,我們從乙個已定義的陣列中可以獲得陣列大小以及這塊連續記憶體空間...

C語言中指標和陣列

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