Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7691
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 62
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-29 15:58
个人简介

只做我喜欢做的事

文章分类
文章存档

2015年(5)

我的朋友

分类: C/C++

2015-03-29 20:04:05

 

C指针理解

 

C语言规定:可以给一个指针变量直接赋值为0(即空操作符NULL),这时表示它是一个空指针,不指向任何数据对象

 

*(p++)*(++p)作用不同,前者是先取出*p的值,然后使用p1;后者先使p1,再取*p,若p初值为a,若输出*(p++)得到a[0]的值,而输出*(++p),得到a[1]的值

 

 

 

char * func(char *p);          // 定义了一个函数

char * (*pf)(char *p);         // 定义了一个函数指针,这个指针指向一个函数

char * (*a[5])(char *p);       /定义了一个函数指针数组,里面存放的是指向函数的指针

char * (*(*pf)[5])(char *p);   // 定义了一个函数指针数组指针

// 实际上就是一个指针,只不过这个指针指向了一个数组,这个数组里面存放的是指向函数的指针

 

 

 

typedef int (init_fnc_t)(void);

// 这里定义了一个新的数据类型init_fnc_t,这个数据类型的参数为空,返回值为int的函数

 

init_fnc_t *init_squence[] =

{

arch_cpu_init

board_early_init_f

...

};

把它分解为:

init_fnc_t *init_squence[x];

init_squence[] =

{

arch_cpu_init

board_early_init_f

...

};

 

init_fnc_t *init_squence[x]; 还原为:int (*init_squence[x])(void);  // 定义了个函数指针数组

 

int_fnc_f **int_fnc_ptr还原为:int (**int_fnc_ptr)(void);

 

因为int *a[5];  等效于  int **p; 所以int_fnc_ptr = init_squence;

 

 

数据结构之链表操作

static PT_VideoMem g_ptVideoMemHead;   /* 定义个头指针 */

for (...) {

/* 分配显存当然还有加上描述该显存的结构体 */

    ptNew = malloc(sizeof(T_VideoMem + iVMSize));

...

    /* 放入链表 */

    ptNew->ptNext = g_ptVideoMemHead;

    g_ptVideoMemHead = ptNew;  /* 头指针指向新加入的结构体 */

}

/* (1) g_ptVideoMemHead一开始为空所以第一次循环ptNew->ptNext = NULL  */

/* (2) 这一步是用来改变头指针的指向的 */

 

**************************************************************************


 

 

双向链表:

 

***********************************************************

结构体数组:

struct usb_device_id {

    __u16       match_flags;

    __u16       idVendor;

    ...

};

struct usb_driver {

    const char *name;

    int (*probe) (struct usb_interface *intf,

              const struct usb_device_id *id);

    const struct usb_device_id *id_table;

    unsigned int no_dynamic_id:1;

   

};

struct uvc_driver uvc_driver = {

        .name       = "uvcvideo",

        .probe      = uvc_probe,

        .disconnect = uvc_disconnect,

        .id_table   = uvc_ids,

        .supports_autosuspend = 1,

};

 

static struct usb_device_id uvc_ids[] = {

    /* LogiLink Wireless Webcam */

    { .match_flags      = USB_DEVICE_ID_MATCH_DEVICE

                | USB_DEVICE_ID_MATCH_INT_INFO,

      .bInterfaceSubClass   = 1,

      .bInterfaceProtocol   = 0,

      .driver_info      = UVC_QUIRK_PROBE_MINMAX },

    /* Genius eFace 2025 */

    { .match_flags      = USB_DEVICE_ID_MATCH_DEVICE

                | USB_DEVICE_ID_MATCH_INT_INFO,

      .bInterfaceSubClass   = 1,

      .bInterfaceProtocol   = 0,

      .driver_info      = UVC_QUIRK_PROBE_MINMAX },

    /* Microsoft Lifecam NX-6000 */

    { .match_flags      = USB_DEVICE_ID_MATCH_DEVICE

                | USB_DEVICE_ID_MATCH_INT_INFO,

      .bInterfaceSubClass   = 1,

      .bInterfaceProtocol   = 0,

      .driver_info      = UVC_QUIRK_PROBE_MINMAX },

   

};

 

未完待续.........

阅读(505) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

挖东衣宇2015-04-16 16:36:06

支持,求更新!