能力值:
( LV5,RANK:70 )
|
-
-
2 楼
指针数组傻傻分不清楚!
|
能力值:
( LV4,RANK:40 )
|
-
-
3 楼
话说 你都把我给绕晕了 回去翻下C\C++的书 看看指针、数组这一块吧 你没理解透
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
这个东西,下个断点看一下值,跟一下就出来了,没必要太纠结,假设,F[0]是指针数组变量, F[0]的值是指向函数的变量,该变量的值就是函数地址,即*F[0]等价于取函数地址值,后面括号是调用了
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
ms两种写法都行的。。。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
[QUOTE=chenjimind;1140570]static NTSTATUS (*fcntab[])(PDEVICE_EXTENSION pdx, PIRP Irp) =
{
DefaultPnpHandler,
DefaultPnpHandler,
HandleRemov...[/QUOTE]
假设不加*,那就是static NTSTATUS (fcntab[])(PDEVICE_EXTENSION pdx, PIRP Irp);
再假设不用数组,或者数组个数是1,反正就只是存一个函数,那还可以这样定义:
static NTSTATUS (fcntab)(PDEVICE_EXTENSION pdx, PIRP Irp);
那我就要问你了,你定义的是函数指针,还是函数呢?
更关键是,这都成声明了,而不是定义。(声明和定义的区别就不用我说了吧)
本意是我们要找块空间,存放函数的地址,这块空间大小sizeof(DWORD_PTR),其实你定义个DWORD_PTR *Fun是可以的,上面的定义只不过是除了分配空间外同时定义了函数类型而已。
说说两种定义的不同,char Var[], char *PtrVar[],区别在哪儿?Var[0]只有一个字节,而PtrVar[0]却占用4个字节。前面是定义了char类型变量,后面是定义了指向char类型的指针变量,说白了,Var[0]实现了这个变量,而PtrVar[0]却要指向Var[0]才有效(PtrVar[0]=&Var[0])。
你的问题也如此,如果你定义(假设可以定义,呵呵,实际上不能这么写)了
static NTSTATUS (fcntab[])(PDEVICE_EXTENSION pdx, PIRP Irp);
那你是定义了N个函数,而不是N个函数指针啊。
至于调用,(*fcntab[fcn])(pdx, Irp)和(fcntab[fcn])(pdx, Irp)在微软编译器中,是一样的,你想想,如果fcntab[fcn]是一个DWORD指针,那么*fcntab[fcn]就是个DWORD值,但如果fcntab[fcn]是一个函数指针,那*fcntab[fcn]有何意义,能取出整个函数?微软编译器中,这两个同等对待。
(*fcntab[fcn])(pdx, Irp);
(fcntab[fcn])(pdx, Irp);
是一样的。
|
能力值:
( LV4,RANK:50 )
|
-
-
7 楼
楼上解释的很清楚。
|
|
|