老話有句說--差之毫釐,謬以千里。
人也分兩種,一種人是凡事盡善盡美型的,另一種人就是馬馬虎虎型的。
int main(int argc, char *argv)
;int *ptr = (int*)(&a+1);
printf("%d %d",*(a+1),*(ptr-1));
getchar();
return 0;
}上面這段**的輸出為 2 5
關鍵是下面這句:
int *ptr = (int*)(&a+1);
對陣列a取位址的含義是----int (*p)[5]
指向a[5]陣列的指標;
雖然a=&a,但是含義是不相同的。
所以,&a+1是整個指標向前移動乙個
陣列的單位。
ptr
因此,輸出為2 5;
同理對於二維陣列也是一樣的;
int main(int argc, char *argv)
;int b[2][5] = ;
int *ptr = (int*)(&a+1);
int *ptrb = (int*)(&b+1);
printf("%d %d",*(a+1),*(ptr-1));
printf("\n");
printf("%d",*(ptrb-1));
getchar();
return 0;
}b的輸出為10;
與之相對應之前第一遍做這道題時候的測試**:
/*面試寶典p78--陣列名與&陣列名的區別*/
#ifdef test_p78
int main()
;int *ptr = (int*)(&a+1);
printf("%d,%d\n",*(a+1),*(ptr-1));
getchar();
}#endif
#ifdef test_p78_1
int main()
#endif
輸出為:
3276360
3276380
3276400【輸出為4*2*5=40+首位址3276360】
3276408
3276408
3276412
3276428
3276412
---------------204
回顧整個學習的過程可以發現,從第一次做題,留下了疑問點,或者說沒有及時的複習,
導致再次遇到這種題目的時候依然會解錯。
當時留下的疑問點是二維陣列名b取位址+1為什麼是b[1]呢?
這個說法是面試寶典上面的乙個錯誤。
然而這個錯誤會讓人對自己的理解產生懷疑。
特別是當對&a的含義是:int(*p)[5]不夠篤定的時候。
為什麼不篤定,是因為對優先順序int *p[5]與int (*p)[5]的理解和記憶不夠嫻熟;
那麼該怎麼辦呢?
首先,這是建立在邏輯推理上的理解記憶鎖鏈,優點是一旦打通整個
流程,那麼記憶是很牢固的。缺點是如果某個環節出現了問題,會導致整個
記憶理解混亂和不確定。所以,關鍵是重複複習。
學習的過程中從一維到二維的問題聯想是可取的,是深入思考的一種表現,是
尋求一般原理的探知精神的體現。當遇到問題時,及時的查資料,提問,方法要多樣化
對於問題的討論和溝通是解決疑問的有效手段。
陣列名和陣列名取位址
在c中,在幾乎所有使用陣列的表示式中,陣列名的值是個指標常量 也就是陣列第乙個元素的位址。它的型別取決於陣列元素的型別 如果它們是int型別,那麼陣列名的型別就是 指向int的常量指標 在以下兩種場合下,陣列名並不是用指標常量來表示,就是當陣列名作為sizeof操作符和單目操作符 的運算元時。siz...
陣列名和陣列名取位址
1 int a 10 2 int p a 3 int q 10 a 第二個為指向陣列的指標.a只是a 0 的位址,a 1就是a 1 的位址了,a是整個a 10 的首位址,是以整個陣列為角度來看,雖然它與a 0 的值相同,但是 a 1就已經增加了10個int型別的位元組的長度了.1 include 2...
陣列名和陣列名取位址的區別
以下 會列印出什麼樣的日誌呢?cpp view plain copy include int a 2 int main 本機 linux 結果輸出 a 0x804a014 a 0x804a014 a 1 0x804a018 a 1 0x804a01c 沒錯,上面i 和 ii列印出來的位址是一樣的,i...