C语言的指针数组与数组指针关系

首先要知道在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,为指针常量

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值