1.首先看普通指针参数传递.
int n = 0;
void func(int *n)
{
*n = 1;
}
func(&n);
之后n的值变成了1
注意点:
(1)参数类型是 (int*)类型,函数实际可以表示成 void func( (int*) n)
(2)既然参数是指向整形的指针类型,则传参的时候,自然也是传指针 &n
2.再看QueryInterface.
(1)首先明白一点,函数的参数类型取决它如何被调用,也就是需要用它获取什么.
在com中,QueryInterface用于获取接口指针(注意,不是接口对象,而是指向接口对象的指针),即如 IUnknown *pUnknown;
(2)再者,在C中,要改变函数参数的值,必须用指针类型,也就是xx*,此处为void*
(3)参数既然为指针类型,则需要确定它是指向什么的指针类型,也就是此函数参数需要获取什么,这就是第(1)条说的接口指针
(4)至此,我们就确定了整个参数类型,即它需要获取一个指针(类型为void*),而通过传址原理我们知道,要想改变参数,必须传递参数的地址,也就是指向该参数的指针(*)
(5)综上,参数类型就是 (void*) * ppv,简写为 void** ppv
(6)那么,在使用的时候,自然是传递 &pUnknown,通过pUnknown的定义知道,它就是 xx**类型
3.注意指针的含义
int n = 2;
int *p = &n;
其中符号"p",字面意义是指针,而其实际意义是该指针的值,也就是n的地址,,,这跟普通变量符号的意义是一样的.
4.通过传址改变参数的值
注意"址"字
(1)普通非指针类型好理解,为了改变数据的值,需要把数据的地址传进去
int n;
func(&n)
因此函数定义的时候应该是func(int *p);
(2)需要改变的参数是指针类型,为了改变数据的值,同样需要把地址传进去,只不过此时该数据用于存的值是指针类型
typedef char* String; //String是指针类型
String本身仅仅是个地址值,这个地址值指向的地方才是字符串内容
如果要改变字符串内容,一种方法是改变String指向的地方,也就是改变String的值,
而,在传参时,要想改变参数的值,必须传进参数的地址,也就是&String.
所以函数的参数类型是"String*"类型