陣列名a與陣列名取位址 a的差異

2021-07-13 08:57:46 字數 1673 閱讀 3673

老話有句說--差之毫釐,謬以千里。

人也分兩種,一種人是凡事盡善盡美型的,另一種人就是馬馬虎虎型的。

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...