使用指针访问数组

时间:2013-08-30 05:40:40

标签: c arrays pointers structure

我在项目中遇到了以下代码段,并且不确定如何计算变量“响应”的值。在这里我们可以看到,pic_data包含两个一维数组,但“响应”访问单维数组作为二维数组。 任何人都可以解释这是如何工作的?

注意:下面的代码不是更大代码块的完整代码段。

#define MAX 100
#define MAXBUF 100

u32 response;
u32 index;

typedef struct {
    u16         flag;   
    u16         status;  
} __attribute__ ((packed)) register;

typedef struct
{
    register      *rq[MAX];
    u64            buf[MAXBUF];

}Data;

Data *pic_data;



void getres(Data *pic_data) {
    response = *((u32*)&(pic_data->rq[index][pic_data->buf[index]]));
}

1 个答案:

答案 0 :(得分:1)

该行没有访问2D数组,它正在访问一维指针数组,然后解除引用它的指针。

让我们把它分解成几步。从:

开始
response = *((u32*)&(pic_data->rq[index][pic_data->buf[index]]));

我们可以改写为:

register *r = pic_data->rq[index]; // figure out which element of 'rq' to use
u64 offset = pic_data->buf[index]; // figure out what offset to use from 'buf'
response = *(u32 *)&r[offset];     // get the right register and extract value
                                   // into a 32-bit word

编者注:register是保留字,不要将其用作类型名称。您的函数参数pic_data也会隐藏同名的全局变量。小心那里!