發布時間:2011-08-29 共2頁
在C語言中,有時候指針和數組等效,有的時候卻不然。
什么時候不同?
1. 數組名本身就代表一個地址。指針代表地址的地址。所以,指針、數組的定義和可能有的多處的聲明要嚴格匹配!不能將在一個地方定義的數組,在他處聲明為指針。反過來也不行!(詳見C專家p84)的
2. 指針和數組都可以在他們的定義中用字符串常量進行初始化。盡管看上去一樣,但底層的實現機制卻不同。定義指針時,編譯器不為指針所指向的對象分配空間,它只是分配指針本身的空間。除非在定義的同時賦給指針一個字符串常量進行初始化。例如:char *p = "breadrain"; 注意,只有字符串常量才如此,不要指望為浮點數之類的常量分配空間:float *pip=3.14; 此語句錯誤,無法通過編譯。(在ANSI C中,初始化指針時創建的字符串常量被定義為只讀。如果試圖通過指針修改這個字符串程序會出現未定義的行為)。數組也可以用字符串常量初始化,并且可以修改:char a[] = “breadrain“;
什么時候相同?
1. 表達式中的數組名被編譯器當做一個指向該數組第一個元素的指針。
2. 在函數參數的聲明中,數組名被編譯器當做指向該數組第一個元素的指針。
你要記住,在表達式中,指針和數組是可以互換的,因為它們在編譯器里的最終形式都是指針,并且都可以進行取下標操作。以為數組的下標操作是建立在指針的基礎上的。所有在函數調用時候傳遞給被調用函數的數組,在編譯的時都被編譯器改寫為指針,即使被調用函數的型參是否聲明為數組。當想把數組定義為函數的參數時,可以把它定義為數組,也可以定義為指針。不管選擇那種方法,在函數的內部事實上獲得的是一個指針!
課后練習(如果你預測的結果正確,說明你真正理解了C語言中的數組和指針):
代碼
1 #include <stdio.h>
2
3 char ga[] = "abcdefghi";
4
5 void my_array_func(char ca[10])
6 {
7 printf("sizeof array param = %#x \n", sizeof ca);
8 printf("addr of array param = %#x \n", &ca);
9 printf("addr of (ca[0]) = %#x \n", &(ca[0]));
10 printf("addr of (ca[1]) = %#x \n", &(ca[1]));
11 printf("++ca = %#x \n\n", ++ca);
12 }
13
14 void my_pointer_func(char *pa)
15 {
16 printf("sizeof ptr param = %#x \n", sizeof pa);
17 printf("addr of ptr param = %#x \n", &pa);
18 printf("addr of (pa[0]) = %#x \n", &(pa[0]));
19 printf("addr of (pa[1]) = %#x \n", &(pa[1]));
20 printf("++pa = %#x \n\n", ++pa);
21 }
22