在看《linux设备驱动开发详解》时,有如下代码,中间代码省略:
struct globalmem_dev *globalmem_devp; /*设备结构体指针*/ globalmem_devp = kmalloc(2*sizeof(struct globalmem_dev), GFP_KERNEL); globalmem_setup_cdev(&globalmem_devp[0], 0); globalmem_setup_cdev(&globalmem_devp[1], 1);
#include <stdio.h> #include <stdlib.h> struct lc{ int a; int b; int c[5]; }; int main(void) { struct lc * lc; lc = malloc(2*sizeof(struct lc)); lc[0].a = 1; lc[1].a = 2; lc->b = 3; (lc+1)->b = 4; printf("lc[0].a = %d\n", lc[0].a); printf("lc[0].a = %d\n", lc[1].a); printf("lc->b = %d\n", lc->b); printf("(lc+1)->b = %d\n", (lc+1)->b); return 0; }
这里定义了一个结构体指针,分配了两倍于这种结构大小的空间,然后能过下标[]引用第一个或第二个结构。于是写如下测试代码:
编译执行,输出结果:
lc[0].a = 1 lc[1].a = 2 lc->b = 3 (lc+1)->b = 4
这个例子说明了指针、下标、指针自加自减的关系,下村lc[1]或lc+1,是当前指针lc指向加上lc所指向结构大小的偏移量,但不同的时,下标引用lc[1]得到的是下一个结构体,而lc+1得到的是指向下一个结构体的指针。