程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 娓娓道來c指針 (3)指針和數組

娓娓道來c指針 (3)指針和數組

編輯:關於C語言

娓娓道來c指針 (3)指針和數組


(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語言中傳遞數組時的規則:傳遞過去的是地址,是指向數組起始元素的地址。之所以這樣,基於兩點;

從效率上考慮,若是把整個數組賦值過去,太耗時,也耗空間。還不如傳地址過去,使用同一份內容。在c語言設計之初,賦值操作就僅限於基本類型(char、int、float……),而數組是聚合類型。 這給我們的編程啟示是:傳遞數組時,不要忘了把數組大小也傳遞過去。否則,函數那邊由於不知道數組大小,極易越界。應這樣設計函數 void fun(int *array, int n),n是數組大小。 還有一點需要指出,即使函數被設計成void fun(int array[], int),array依然被看成是指針。也就是說即使數組帶了長度,如 int array[5],該長度也會被編譯器忽略掉。一句話:形參中的數組統統看成指針。
總結:只有在函數形參中,僅有這一種情況,聲明的數組,如 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兩者的值是一樣的,應該很好理解。

那麼為什麼int(*)[2]表示的是數組指針呢?這需要透徹理解c的聲明語法,後序講解。





  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved