(3)指針和數組
在c中指針和數組似乎有著千絲萬縷的關系。其實它們不是一回事:指針是指針,數組是數組,兩者不相同。
說它們有關系,不過是因為常見這樣的代碼:
int main() { int array[] = {1,2,3,4,5}; int n = sizeof(array) / sizeof(int); int *p = array; int i; for (i = 0; i < n; i++) printf("p[%d]...%d\n", i, p[i]); system("pause"); return 0; }運行
在上面的代碼中,指針和下標運算符的結合使用,給人一種指針和數組一樣的感覺。
本質是:數組名是一個指向數組起始元素的常量指針。這也是數組和指針的唯一聯系!
之所以可以使用 p[i] 來訪問數組中的元素,是因為在編譯器中 p[i] 被解釋為 *(p+i),這仍然是指針的功能。對編譯器而言,用p[i]表達*(p+i)的含義是沒有意義的,它只是為了讓人看著舒服,用著方便。這是語法糖<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPqO6PC9wPgo8cD4gICAgcFtpXcrHKihwJiM0MztpKbXEvPK1pdC0t6ijrMq1vMrJz6Os1sHJ2bbU09qx4NLrxvfAtMu1o6xbXdXi0fm1xNTLy+O3+83qyKu/ydLUsru05tTaoaM8L3A+CjxwPiAgICC/ycrHttTT2sjLwODAtMu1o6wqKHAmIzQzO2kptcTQtLeo1Nq94rbByc+xyL3PwKfE0aOs0LTG8MC00rLC6bezKLz8yOvBv7TzKaGj0vK0y6OsY9Pv0dTS/cjrW13Uy8vjt/uhozwvcD4KPHA+ICAgIL7Nz/HV4tH5o6zV4tCpvfa99srHzqrBy8jDyMvA4Mjd0tfA7b3itvjS/cjrtcS5psTco6y1xMi3v8nS1MjDztLDx7jQyty1vbHgs8zT79HUtcTM8MPbzra1wCjI3dLX18XK1imjrNPQyrHO0sPHs8bV4tCpuabE3M6q0++3qMzHKHN5bnRheCBzdWdhciC78tXfIHN5bnRhY3RpYyBzdWdhcimhozwvcD4KPHA+0tTJz9Wq19ShttX3t/5j1rjV66G3o6y96LTLzca89tXisb7K6aGjyunW0NK71eu8+9GqtdjWuLP2o7rWu9PQ1NrJ+cP30+++5NbQo6xbXbLFse2078r91+m1xLqs0uWjrNTase2078q91tCjrFtd0+vK/dfpzt652KOhPC9wPgo8cD7X3L3hxvDAtL7NysejrL+0JiMyMDI4NDvK/dfptcTTw7eoo7pwW2ldo6zG5Mq1yscqKHAmIzQzO2kptcTT77eozMejrHDI1Mi7ysfWuNXro6zT68r91+myos7eudjPtaGjPC9wPgo8cD48YnI+CjwvcD4KPHA+1rjV67rNyv3X6bXEsrvNrNautKajrLu5v8nS1LTTz8LD5rXEwP3X07+0s/Y8L3A+CjxwPjwvcD4KPHByZSBjbGFzcz0="brush:java;">void fun(int *array)
{
printf(" sizeof(array)...%d\n", sizeof(array));
}
int main()
{
int array[] = { 1, 2, 3, 4, 5 };
printf(" sizeof(array)...%d\n", sizeof(array));
fun(array);
return 0;
}運行
從運行結果看,指針和數組確實不同。這揭示了c語言中傳遞數組時的規則:傳遞過去的是地址,是指向數組起始元素的地址。之所以這樣,基於兩點; 那麼為什麼int(*)[2]表示的是數組指針呢?這需要透徹理解c的聲明語法,後序講解。
總結:只有在函數形參中,僅有這一種情況,聲明的數組,如 int array[]會被看作是指針。其它情況下,指針與數組並無聯系。
還有一點,對於 int array[5];array表示指向數組起始元素的指針,那麼&array又是什麼呢?實驗下:
int main()
{
int array[] = { 1, 2};
printf(" array...%p\n", array);
printf(" &array...%p\n", &array);
printf("&array+1...%p\n", &array+1);
return 0;
}
運行
分析實驗結果:0031FCEC與0031FCE4相差8,而sizeof(array)就是8。
結論就是:array和&array都是指針,但類型不同。array的類型是int*,而&array的類型是int(*)[2]。array是指向普通int類型的指針;&array是數組指針,該數組元素是int類型的,且數組大小是2。
至於array和&array兩者的值是一樣的,應該很好理解。