天天看點

C語言的指針數組與數組指針關系

  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,為指針常量

繼續閱讀