驱动中的C语言指针与下标

  在看《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得到的是指向下一个结构体的指针。

原文地址:https://www.cnblogs.com/lucheng/p/2832211.html