精品理论电影在线_日韩视频一区二区_一本色道精品久久一区二区三区_香蕉综合视频

老調重談:C語言中的指針和數組

發布時間: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

百分百考試網 考試寶典

立即免費試用