今天不討論高大上的東西,真就只說一個小知識點:數組啥時候變指針? 答案是:除了初始化和sizeof之外,一律會變指針。
以一個簡單的int型數組爲例:
int a[5] = {1, 2, 3, 4, 5};
那麼,當我們在程序中使用a時,它的真面目如下:
int a[5] = {1, 2, 3, 4, 5}; // 此時a是數組
sizeof(a); // 此時a是數組
int *p = a+2; // 此時a是指針
function(a, 2); // 此時a是指針
printf("%d\n", a[1]); // 此時a是指針
上面的例子,就是爲了重複說明開始第一段的結論而已,再來一遍:除了初始化和sizeof之外,C語言的任何數組都將一律被視爲指針來處理。
當然,要補充的一點是:既然數組大多數情況都會被當做指針,那你好歹要說清楚是什麼指針呀,是的這非常關鍵。這個問題的答案是:數組都將一律被視爲一個指向其首元素的指針,換句話講,大多數情況下,數組都等價於其首元素的地址,因此上面的代碼完全等價於:
int *p = &a[0]+2;
function(&a[0], 2);
printf("%d\n", (&a[0])[1]);
最後,諸位看官請注意,以上結論,針對的是任何數組a,並不僅僅是int型數組,甭管是多維數組、指針數組、函數指針數組、數組指針數組…… 不管它有多複雜,結論都是一樣的。