http://liuyunfeng484.blog.163.com/blog/static/6683171520116195056299/
首先要知道在C程式中指針就是位址。
指針與數組之間有指針數組與數組指針兩種:
一:指針數組
先分析下面的例子:
typedef unsigned char U8; //定義U8來代替unsigned char
U8 *point[2]; //定義一個指針一維數組其3個元素為unsigned char類型指針
U8 *point[2]={&point[0],&point[1],&point[2]}; //裡面的三個元素是位址
分析上面的定義,在C語言中[ ]的優先級為1,*的優先級為2,這樣[ ]的優先級比*的要高,這樣就是先point[2]結合聲明一個數組名為point的數組,後再與*結合後為*point[2],其數組元數為unsigned char類型指針,這樣就可以知道U8 *point[2]就定義了一個指針數組,用來存放unsigned char類型位址,編譯器為該一維數組配置設定了3個sizeof(unsigned char *)的空間.
說白了指什數組就是用來存儲指針(位址)的數組。
二:數組指針
typedef unsigned char U8; //定義U8來代替unsigned char
U8 (*point)[2]; //先聲明了一個point指針,point指向了一個有三個unsigned char元素的一維數組。
分析上面的定義,在C語言中( )的優先級為1,[ ]的優先級也為1,這樣( )的優先級[ ]相等,這樣就是從左到右結合.就是先(*point)結合聲明一個point的指針,後再與[2]結合聲明一個數組指針後(*point)[2],其point指向3個數組元素,這樣就可以知道U8 (*point)[2]就定義了一個數組指針,編譯器為point配置設定了一個指針空間,在unsigned char中隻配置設定了一個位元組的空間 ,因為其不是一個數組隻是指向數組元素,是以編譯器不為其分得一個數組空間.
說白了數組指針就是指向數組的首位址。
三:數組指針的應用(在C51中)
在C51的編譯器中有下列定義:
typedef unsingned int U16;
typedef unsigned char U8;
#define IR_KEY 0x3DA9
#define XBYTE ((unsigned char volatile xdata *) 0)
u8 msIR_ReadByte(U16 u16RegIndex)
{
return XBYTE[u16RegIndex];
}
main()
{
U8 KEY;
KEY=msIR_ReadByte(IR_KEY);
printf("KEY==%bu\n",KEY);
}
上面宏定義XBYTE中有先把常量0強制轉換成在XDATA存儲區中指向XDATA存儲區的unsigned char指針,0為指針常量,它指向的位址是不可以變的為XDATA區的0X0000,也就是XDATA區的起始位址,當程式中調用msIR_ReadByte函數時,就有XBYTE[0X3DA9],通過宏代換為((unsigned char volatile xdata *) 0)[0X3DA9],就形成了一個數組指針。其中指針常量0指向其元素N,數組指針中數組名代表數組的首位址,也稱數組的基位址;數組元素的位址稱為偏移量,也叫偏移位址。此時的指針常量0就指向了數組的首位址,那麼其0X3DA9為其中一個元素的位址,要取這個元素的值就是[0+3DA9]的值,既首位址加偏移量。其中數組的[ ]是一個變地運算。此處引用一個數組元數用的是指針法,0是指向數組的指針變量,隻是此處指針變量是0,為指針常量