天天看点

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,为指针常量

继续阅读