對陣列位址的理解
1.陣列別名本身是乙個指標,對資料取下表實際上是先通過下表取指標,然後通過指標取值
arr指向陣列頭的指標
[n]->取得指標後對其進行n位偏移後作 * 對指標取值的操作
2.陣列本身是被編譯器做了優化的,arr是存放陣列第乙個元素的指標,那麼&arr應該是指向這個指標的指標,然而編譯器對其進行了優化,&arr會直接返回arr的值,從而使得本來是指向指標的指標返回了指向陣列第乙個元素的指標
所以有結論&arr == &arr[0] == arr
為了證明這個,可以看以下**
得到列印結果如下int
main()
;int i =0;
for(i =
0; i <
4; i++
)int
* arr_p = a;
printf
("通過指標取得陣列指向元素的值是%d\n"
,*arr_p)
;printf
("陣列第乙個元素的位址是%p\n"
, arr_p)
;printf
("陣列第乙個元素的位址指標的位址是%p\n"
,&arr_p)
;printf
("直接取陣列第乙個元素的位址指標的位址是%p\n"
,&a)
;return0;
}
第0個元素是1從加粗的結果可以看出第1個元素是2
第2個元素是3
第3個元素是4
通過指標取得陣列指向元素的值是1
陣列第乙個元素的位址是000000000061fe00
陣列第乙個元素的位址指標的位址是000000000061fdf8
直接取陣列第乙個元素的位址指標的位址是000000000061fe00
陣列指標真的就是指向第乙個元素的
陣列第乙個元素的指標和對陣列本身取位址得到的結果竟然是一樣的
用乙個變數存下這個指標,再對指標取位址,得到的結果卻是另乙個位址,所以有
arr_p = a
a = &a
&arr_p!=&a
最後得出結論,陣列的別名是乙個記憶體位址,它指向陣列第乙個元素,他有自己的記憶體位址並且不同於陣列第乙個元素的記憶體位址,編譯器對&a操作做了優化處理使得它只能返回第一元素的記憶體位址,跟這個類似的機制還有函式指標。
3.陣列位址在記憶體裡是連續的
列印的結果如下:arr_p++
;printf
("通過指標取得陣列指向元素的值是%d\n"
,*arr_p)
;
通過指標取得陣列指向元素的值是2可以看出記憶體位址只是位移了一次,然後指標就指向了第二個元素
4.因為陣列位址在記憶體裡是連續的,所以,我們可以把陣列看作是一條線,指標加1和減1就是在這條線上左右滑動,類似於
當我++,則
當我–,則
當然,每次++和–實際上移動了多少位和指標型別有關(實際上指標的型別最大的作用也就取值和控制步長)
所以陣列可與看作是連續記憶體首位的指標。反向思維一下,指標也可以看作是一段連續的記憶體,當成是乙個陣列
在上圖中,如果p、p1、p2在記憶體中的位址也是連續的,那就又可以組成陣列pa[3] = 。這裡pa又成了指向乙個陣列頭部的指標,與之前不同的是,這個陣列的構成元素是一連串的指標,他們的記憶體位址是連續的。所以這裡的p的實際型別應該是int *,啊這,這不就是2級指標了嗎,從幾何上理解,這個是乙個處於記憶體中的面,比陣列的線提公升了乙個維度。以此類推,**指標 int * * * 完全可以看作是乙個三位陣列,在幾何上的表現應該是乙個立方體。
C語言中的陣列 指標陣列 陣列指標
1 include 2 3 int main 4 執行結果 0xbfeefda9 0xbfeefdaa 0xbfeefdab12 70xbfeefda9 0xbfeefdaa 0xbfeefdab12 7以上執行結果可以得出如下結論 char str 3 1 str i strr i 2 str i...
C語言裡的指標型別轉換
當我們初始化乙個指標或給乙個指標賦值時,賦值號的左邊是乙個指標,賦值號的右邊是乙個指標表示式。在我們前面所舉的例子中,絕大多數情況下,指標的型別和指標表示式的型別是一樣的,指標所指向的型別和指標表示式所指向的型別是一樣的。例 1 float f 12.3 2 float fptr f 3 int p...
C語言指標陣列和陣列指標
初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...