分类: C/C++
2015-03-29 20:04:05
C指针理解
C语言规定:可以给一个指针变量直接赋值为0(即空操作符NULL),这时表示它是一个空指针,不指向任何数据对象
*(p++)与*(++p)作用不同,前者是先取出*p的值,然后使用p加1;后者先使p加1,再取*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 },
};
未完待续.........