問題
在對陣列的操作中,經常分不清&a, &a[0] 和a各表示什麼。先說&a[0]和&a到底有什麼區別呢?
a[0]是乙個元素,a是整個陣列,雖然&a[0]和&a的值一樣,但其意義不一樣。前者是陣列首元素的首位址,而後者是陣列的首位址。
#include int main()
; int *ptr = (int*)(&a + 1);
printf("%d,%d\n", *(a + 1), *(ptr - 1));
return 0;
}
列印出來的值是多少呢?這裡主要是考查關於指標加減操作的理解。
對指標進行加1 操作,得到的是下乙個元素的位址,而不是原有位址值直接加1。所以,
乙個型別為t 的指標的移動,以sizeof(t) 為移動單位。因此,對上題來說,a 是乙個一
維陣列,陣列中有5 個元素; ptr 是乙個int 型的指標。
&a + 1: 取陣列a 的首位址,該位址的值加上sizeof(a) 的值,即&a + 5*sizeof(int),也
就是下乙個陣列的首位址,顯然當前指標已經越過了陣列的界限。
(int *)(&a+1): 則是把上一步計算出來的位址,強制轉換為int * 型別,賦值給ptr。
回到上面的問題:
1) a是陣列的首位址, 所以a+1 是陣列下一元素的首位址,即a[1]的首位址, 所以*(a + 1)
輸出2。
2) 因為指標ptr的值為&a + 5*sizeof(int),並且ptr 是int * 型別,所以ptr - 1的值為&a + 5 * sizeof(int) - 1 *sizeof(int), 即指向a[4]的位址,*(ptr - 1)
輸出5。
下面列印了部分變數的值,比較直觀:
&a[0]: bfee6b6c
&a: bfee6b6c
a: bfee6b6c
&a + 1: bfee6b80
ptr - 1: bfee6b7c
可見,&a[0], &a, a 三者的值相同(意義不同); &a + 1與&a 差5個位元組, 即5 * sizeof(int);
陣列和指標的區別(a和 a以及 a 0 的區別)
一 一維陣列 這裡記住陣列的首位址和陣列首元素的位址是不一樣的,雖然他們的值是一樣的,但是代表的意思不一樣 陣列 int a 5 a是陣列的共五個整形資料的記憶體的名字,是一塊連續的位址的名字 a代表首元素的位址同 a 0 是一樣的 所以a 1代表的是第二個元素的位址 a則是整個記憶體空間的位址,所...
php中0和false的區別
在php中判斷boolean值是經常要用到的,想if語句,for語句,這些條件的執行很大一部分都是靠boolean來判斷的,很多時候false也等於0,當我們要返回的值中含有0的時候,例如對數字的查詢就要注意了,可以用 來判斷是否完全相等,php 測試boolean 0 false num 0 bt...
陣列中a和 a的區別
include int main void int ptr int a 1 a代表整個陣列的位址,1應該加上sizeof a 的長度,所以ptr指向a 5 位置處。printf d d n a 1 ptr 1 a代表陣列首元素的位址,1應該加上sizeof a 0 所以a 1指 向a 1 處。ret...